summaryrefslogtreecommitdiffstats
path: root/data
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--data/00_org.gnome.shell.gschema.override6
-rw-r--r--data/50-gnome-shell-system.xml24
-rw-r--r--data/README.osk-layouts33
-rw-r--r--data/cldr2json/README.md40
-rwxr-xr-xdata/cldr2json/cldr2json.py212
-rw-r--r--data/cldr2json/test/__init__.py0
-rw-r--r--data/cldr2json/test/data/fr-t-k0-android.xml138
-rw-r--r--data/cldr2json/test/data/fr.json614
-rwxr-xr-xdata/cldr2json/test/test_cldr2json.py212
-rw-r--r--data/dbus-interfaces/meson.build10
-rw-r--r--data/dbus-interfaces/net.hadess.SensorProxy.xml5
-rw-r--r--data/dbus-interfaces/net.hadess.SwitcherooControl.xml46
-rw-r--r--data/dbus-interfaces/org.Gtk.MountOperationHandler.xml32
-rw-r--r--data/dbus-interfaces/org.freedesktop.Application.xml12
-rw-r--r--data/dbus-interfaces/org.freedesktop.DBus.xml16
-rw-r--r--data/dbus-interfaces/org.freedesktop.GeoClue2.Agent.xml11
-rw-r--r--data/dbus-interfaces/org.freedesktop.GeoClue2.Manager.xml9
-rw-r--r--data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Cdma.xml13
-rw-r--r--data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Gsm.Network.xml19
-rw-r--r--data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.Modem3gpp.xml6
-rw-r--r--data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.ModemCdma.xml5
-rw-r--r--data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.xml5
-rw-r--r--data/dbus-interfaces/org.freedesktop.Notifications.xml35
-rw-r--r--data/dbus-interfaces/org.freedesktop.PackageKit.Offline.xml13
-rw-r--r--data/dbus-interfaces/org.freedesktop.UPower.Device.xml11
-rw-r--r--data/dbus-interfaces/org.freedesktop.UPower.xml5
-rw-r--r--data/dbus-interfaces/org.freedesktop.bolt1.Device.xml18
-rw-r--r--data/dbus-interfaces/org.freedesktop.bolt1.Manager.xml15
-rw-r--r--data/dbus-interfaces/org.freedesktop.impl.portal.Access.xml15
-rw-r--r--data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml24
-rw-r--r--data/dbus-interfaces/org.freedesktop.impl.portal.Request.xml5
-rw-r--r--data/dbus-interfaces/org.freedesktop.login1.Manager.xml33
-rw-r--r--data/dbus-interfaces/org.freedesktop.login1.Session.xml15
-rw-r--r--data/dbus-interfaces/org.freedesktop.login1.User.xml6
-rw-r--r--data/dbus-interfaces/org.freedesktop.realmd.Provider.xml13
-rw-r--r--data/dbus-interfaces/org.freedesktop.realmd.Realm.xml20
-rw-r--r--data/dbus-interfaces/org.freedesktop.realmd.Service.xml15
-rw-r--r--data/dbus-interfaces/org.gnome.Magnifier.ZoomRegion.xml26
-rw-r--r--data/dbus-interfaces/org.gnome.Magnifier.xml54
-rw-r--r--data/dbus-interfaces/org.gnome.Mutter.ScreenCast.xml191
-rw-r--r--data/dbus-interfaces/org.gnome.ScreenSaver.xml18
-rw-r--r--data/dbus-interfaces/org.gnome.SessionManager.EndSessionDialog.xml16
-rw-r--r--data/dbus-interfaces/org.gnome.SessionManager.Inhibitor.xml10
-rw-r--r--data/dbus-interfaces/org.gnome.SessionManager.Presence.xml11
-rw-r--r--data/dbus-interfaces/org.gnome.SessionManager.xml23
-rw-r--r--data/dbus-interfaces/org.gnome.SettingsDaemon.Color.xml6
-rw-r--r--data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml5
-rw-r--r--data/dbus-interfaces/org.gnome.SettingsDaemon.Rfkill.xml10
-rw-r--r--data/dbus-interfaces/org.gnome.SettingsDaemon.Wacom.xml13
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.AudioDeviceSelection.xml12
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.CalendarServer.xml19
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.ClocksIntegration.xml15
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.Extensions.xml267
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.HotplugSniffer.xml8
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.Introspect.xml83
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.PadOsd.xml28
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.PerfHelper.xml13
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.PortalHelper.xml19
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.Screencast.xml95
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.Screenshot.xml145
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.Wacom.PadOsd.xml8
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.WeatherIntegration.xml16
-rw-r--r--data/dbus-interfaces/org.gnome.Shell.xml46
-rw-r--r--data/dbus-interfaces/org.gnome.ShellSearchProvider.xml73
-rw-r--r--data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml87
-rw-r--r--data/dbus-interfaces/org.gtk.Notifications.xml13
-rw-r--r--data/dbus-interfaces/org.mpris.MediaPlayer2.Player.xml12
-rw-r--r--data/dbus-interfaces/org.mpris.MediaPlayer2.xml7
-rw-r--r--data/emoji.json15740
-rw-r--r--data/gnome-shell-dbus-interfaces.gresource.xml59
-rw-r--r--data/gnome-shell-osk-layouts.gresource.xml60
-rw-r--r--data/gnome-shell-overrides-migration.desktop.in5
-rw-r--r--data/gnome-shell-overrides.convert4
-rw-r--r--data/gnome-shell-theme.gresource.xml36
-rw-r--r--data/gnome-shell.portal4
-rw-r--r--data/icons/hicolor/scalable/apps/org.gnome.Shell.Extensions.svg1
-rw-r--r--data/icons/hicolor/symbolic/apps/org.gnome.Shell.Extensions-symbolic.svg1
-rw-r--r--data/icons/meson.build1
-rw-r--r--data/meson.build130
-rw-r--r--data/org.gnome.Shell-disable-extensions.service15
-rw-r--r--data/org.gnome.Shell.Extensions.desktop.in.in10
-rw-r--r--data/org.gnome.Shell.PortalHelper.desktop.in.in10
-rw-r--r--data/org.gnome.Shell.PortalHelper.service.in3
-rw-r--r--data/org.gnome.Shell.desktop.in.in13
-rw-r--r--data/org.gnome.Shell.target10
-rw-r--r--data/org.gnome.Shell@wayland.service.in34
-rw-r--r--data/org.gnome.Shell@x11.service.in39
-rw-r--r--data/org.gnome.shell.gschema.xml.in316
-rw-r--r--data/osk-layouts/am.json599
-rw-r--r--data/osk-layouts/ara.json488
-rw-r--r--data/osk-layouts/be.json584
-rw-r--r--data/osk-layouts/bg.json533
-rw-r--r--data/osk-layouts/by.json541
-rw-r--r--data/osk-layouts/ca.json599
-rw-r--r--data/osk-layouts/cz.json613
-rw-r--r--data/osk-layouts/de.json570
-rw-r--r--data/osk-layouts/dk.json590
-rw-r--r--data/osk-layouts/ee.json666
-rw-r--r--data/osk-layouts/epo.json711
-rw-r--r--data/osk-layouts/es+cat.json602
-rw-r--r--data/osk-layouts/es.json604
-rw-r--r--data/osk-layouts/fi.json570
-rw-r--r--data/osk-layouts/fr.json614
-rw-r--r--data/osk-layouts/ge.json409
-rw-r--r--data/osk-layouts/gr.json532
-rw-r--r--data/osk-layouts/hr.json531
-rw-r--r--data/osk-layouts/hu.json579
-rw-r--r--data/osk-layouts/id.json507
-rw-r--r--data/osk-layouts/il.json419
-rw-r--r--data/osk-layouts/in+bolnagri.json439
-rw-r--r--data/osk-layouts/in+mal.json559
-rw-r--r--data/osk-layouts/ir.json495
-rw-r--r--data/osk-layouts/is.json583
-rw-r--r--data/osk-layouts/it.json580
-rw-r--r--data/osk-layouts/ke.json577
-rw-r--r--data/osk-layouts/kg.json547
-rw-r--r--data/osk-layouts/kh.json481
-rw-r--r--data/osk-layouts/la.json472
-rw-r--r--data/osk-layouts/latam.json603
-rw-r--r--data/osk-layouts/lt.json647
-rw-r--r--data/osk-layouts/lv.json645
-rw-r--r--data/osk-layouts/mk.json541
-rw-r--r--data/osk-layouts/mn.json547
-rw-r--r--data/osk-layouts/my.json507
-rw-r--r--data/osk-layouts/nl.json584
-rw-r--r--data/osk-layouts/no.json590
-rw-r--r--data/osk-layouts/ph.json507
-rw-r--r--data/osk-layouts/pl.json579
-rw-r--r--data/osk-layouts/pt.json584
-rw-r--r--data/osk-layouts/ro.json547
-rw-r--r--data/osk-layouts/rs.json541
-rw-r--r--data/osk-layouts/ru.json541
-rw-r--r--data/osk-layouts/se.json624
-rw-r--r--data/osk-layouts/si.json518
-rw-r--r--data/osk-layouts/sk.json648
-rw-r--r--data/osk-layouts/th.json472
-rw-r--r--data/osk-layouts/tr.json566
-rw-r--r--data/osk-layouts/ua.json545
-rw-r--r--data/osk-layouts/uk.json576
-rw-r--r--data/osk-layouts/us.json575
-rw-r--r--data/osk-layouts/vn.json643
-rw-r--r--data/osk-layouts/za.json589
-rw-r--r--data/perf-background.xml.in31
-rw-r--r--data/theme/README.md32
-rw-r--r--data/theme/calendar-today.svg178
-rw-r--r--data/theme/checkbox-focused.svg261
-rw-r--r--data/theme/checkbox-off-focused.svg206
-rw-r--r--data/theme/checkbox-off.svg206
-rw-r--r--data/theme/checkbox.svg261
-rw-r--r--data/theme/color-pick.svg94
-rw-r--r--data/theme/dash-placeholder.svg84
-rw-r--r--data/theme/eye-not-looking-symbolic.svg4
-rw-r--r--data/theme/eye-open-negative-filled-symbolic.svg27
-rw-r--r--data/theme/gnome-shell-high-contrast.scss17
-rw-r--r--data/theme/gnome-shell-sass/COPYING339
-rw-r--r--data/theme/gnome-shell-sass/NEWS0
-rw-r--r--data/theme/gnome-shell-sass/README.md16
-rw-r--r--data/theme/gnome-shell-sass/_colors.scss43
-rw-r--r--data/theme/gnome-shell-sass/_common.scss177
-rw-r--r--data/theme/gnome-shell-sass/_drawing.scss231
-rw-r--r--data/theme/gnome-shell-sass/_high-contrast-colors.scss41
-rw-r--r--data/theme/gnome-shell-sass/_widgets.scss51
-rw-r--r--data/theme/gnome-shell-sass/gnome-shell-sass.doap37
-rw-r--r--data/theme/gnome-shell-sass/widgets/_a11y.scss24
-rw-r--r--data/theme/gnome-shell-sass/widgets/_app-grid.scss144
-rw-r--r--data/theme/gnome-shell-sass/widgets/_base.scss18
-rw-r--r--data/theme/gnome-shell-sass/widgets/_buttons.scss5
-rw-r--r--data/theme/gnome-shell-sass/widgets/_calendar.scss291
-rw-r--r--data/theme/gnome-shell-sass/widgets/_check-box.scss18
-rw-r--r--data/theme/gnome-shell-sass/widgets/_corner-ripple.scss15
-rw-r--r--data/theme/gnome-shell-sass/widgets/_dash.scss61
-rw-r--r--data/theme/gnome-shell-sass/widgets/_dialogs.scss164
-rw-r--r--data/theme/gnome-shell-sass/widgets/_entries.scss27
-rw-r--r--data/theme/gnome-shell-sass/widgets/_hotplug.scss10
-rw-r--r--data/theme/gnome-shell-sass/widgets/_ibus-popup.scss35
-rw-r--r--data/theme/gnome-shell-sass/widgets/_keyboard.scss115
-rw-r--r--data/theme/gnome-shell-sass/widgets/_login-dialog.scss169
-rw-r--r--data/theme/gnome-shell-sass/widgets/_looking-glass.scss109
-rw-r--r--data/theme/gnome-shell-sass/widgets/_message-list.scss136
-rw-r--r--data/theme/gnome-shell-sass/widgets/_misc.scss56
-rw-r--r--data/theme/gnome-shell-sass/widgets/_network-dialog.scss56
-rw-r--r--data/theme/gnome-shell-sass/widgets/_notifications.scss57
-rw-r--r--data/theme/gnome-shell-sass/widgets/_osd.scss45
-rw-r--r--data/theme/gnome-shell-sass/widgets/_overview.scss10
-rw-r--r--data/theme/gnome-shell-sass/widgets/_panel.scss121
-rw-r--r--data/theme/gnome-shell-sass/widgets/_popovers.scss131
-rw-r--r--data/theme/gnome-shell-sass/widgets/_screen-shield.scss78
-rw-r--r--data/theme/gnome-shell-sass/widgets/_scrollbars.scss29
-rw-r--r--data/theme/gnome-shell-sass/widgets/_search-entry.scss35
-rw-r--r--data/theme/gnome-shell-sass/widgets/_search-results.scss108
-rw-r--r--data/theme/gnome-shell-sass/widgets/_slider.scss27
-rw-r--r--data/theme/gnome-shell-sass/widgets/_switcher-popup.scss65
-rw-r--r--data/theme/gnome-shell-sass/widgets/_switches.scss16
-rw-r--r--data/theme/gnome-shell-sass/widgets/_tiled-previews.scss19
-rw-r--r--data/theme/gnome-shell-sass/widgets/_window-picker.scss65
-rw-r--r--data/theme/gnome-shell-sass/widgets/_workspace-switcher.scss36
-rw-r--r--data/theme/gnome-shell-sass/widgets/_workspace-thumbnails.scss32
-rw-r--r--data/theme/gnome-shell.scss6
-rw-r--r--data/theme/keyboard-caps-lock-filled-symbolic.svg6
-rw-r--r--data/theme/keyboard-enter-symbolic.svg6
-rw-r--r--data/theme/keyboard-hide-symbolic.svg7
-rw-r--r--data/theme/keyboard-layout-filled-symbolic.svg7
-rw-r--r--data/theme/keyboard-shift-filled-symbolic.svg3
-rw-r--r--data/theme/meson.build61
-rw-r--r--data/theme/message-indicator-symbolic.svg40
-rw-r--r--data/theme/no-events.svg119
-rw-r--r--data/theme/no-notifications.svg223
-rw-r--r--data/theme/pad-osd.css30
-rw-r--r--data/theme/pointer-double-click-symbolic.svg28
-rw-r--r--data/theme/pointer-drag-symbolic.svg20
-rw-r--r--data/theme/pointer-primary-click-symbolic.svg26
-rw-r--r--data/theme/pointer-secondary-click-symbolic.svg26
-rw-r--r--data/theme/process-working.svg3084
-rw-r--r--data/theme/running-indicator.svg130
-rw-r--r--data/theme/toggle-off-dark.svg1
-rw-r--r--data/theme/toggle-off-hc.svg133
-rw-r--r--data/theme/toggle-off.svg1
-rw-r--r--data/theme/toggle-on-dark.svg1
-rw-r--r--data/theme/toggle-on-hc.svg113
-rw-r--r--data/theme/toggle-on.svg1
-rwxr-xr-xdata/update-osk-layouts.sh47
221 files changed, 58646 insertions, 0 deletions
diff --git a/data/00_org.gnome.shell.gschema.override b/data/00_org.gnome.shell.gschema.override
new file mode 100644
index 0000000..ac732e6
--- /dev/null
+++ b/data/00_org.gnome.shell.gschema.override
@@ -0,0 +1,6 @@
+[org.gnome.mutter:GNOME]
+attach-modal-dialogs=true
+edge-tiling=true
+dynamic-workspaces=true
+workspaces-only-on-primary=true
+focus-change-on-pointer-rest=true
diff --git a/data/50-gnome-shell-system.xml b/data/50-gnome-shell-system.xml
new file mode 100644
index 0000000..33e5ba5
--- /dev/null
+++ b/data/50-gnome-shell-system.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<KeyListEntries schema="org.gnome.shell.keybindings"
+ group="system"
+ name="System"
+ wm_name="GNOME Shell"
+ package="gnome-shell">
+
+ <KeyListEntry name="toggle-message-tray"
+ description="Show the notification list"/>
+
+ <KeyListEntry name="focus-active-notification"
+ description="Focus the active notification"/>
+
+ <KeyListEntry name="toggle-overview"
+ description="Show the overview"/>
+
+ <KeyListEntry name="toggle-application-view"
+ description="Show all applications"/>
+
+ <KeyListEntry name="open-application-menu"
+ description="Open the application menu"/>
+
+</KeyListEntries>
+
diff --git a/data/README.osk-layouts b/data/README.osk-layouts
new file mode 100644
index 0000000..e9e668f
--- /dev/null
+++ b/data/README.osk-layouts
@@ -0,0 +1,33 @@
+Gnome-shell OSK layouts are extracted from CLDR layout definitions:
+https://www.unicode.org/cldr/charts/latest/keyboards/layouts/index.html
+
+Updating these involves several steps:
+
+1) Downloading and unzipping the tarball found at:
+ http://www.unicode.org/Public/cldr/latest/keyboards.zip
+
+ This file contains XML files describing the keyboard layouts.
+
+2) Cloning the cldr2json script at:
+ git://repo.or.cz/cldr2json.git
+
+ It will be used to convert the XML files into JSON that can be
+ directly consumed by gnome-shell.
+
+3) Running the script to produce the files:
+ ./cldr2json <input-directory> <output-directory>
+
+ We shall usually use the "android" folder, since that's most
+ complete, and similar to our UI and target sizes. And the target
+ directory must be data/osk-layouts in this repository.
+
+4) Modify gnome-shell-osk-layouts.gresource.xml to include the files
+
+5) Do git add on the updated/new files, and git commit.
+
+
+Or alternatively:
+
+1) Run update-osk-layouts.sh
+
+2) Do git add and git commit
diff --git a/data/cldr2json/README.md b/data/cldr2json/README.md
new file mode 100644
index 0000000..0eb54bc
--- /dev/null
+++ b/data/cldr2json/README.md
@@ -0,0 +1,40 @@
+cldr2json
+=========
+
+This script converts Unicode CLDR android keyboard layouts to JSON usable by
+GNOME Shell.
+
+CLDR keyboard layouts can be found at
+<http://www.unicode.org/Public/cldr/latest/keyboards.zip>
+
+
+Usage
+=====
+
+ ./cldr2json <input file or directory> <output directory>
+
+example:
+
+ ./cldr2json cldr/keyboards/android/ json_layouts/
+
+
+Keyboard layout mapping
+=======================
+
+Unicode CLDR layout identifiers are language codes, while XKB layout
+identifiers are... something else. The mapping between the two currently uses
+heuristic based on the layout descriptions, in this order:
+
+- if the CLDR layout description matches an XKB layout description, chose its
+ XKB identifier
+- if one word of the CLDR layout description matches an XKB layout
+ description, chose its XKB identifier
+- if the CLDR layout description matches one word of an XKB layout description,
+ chose its XKB identifier
+
+That doesn't always work. For instance it fails for "en" language, that should
+match "us" XKB identifier. For such cases, there is a mapping in
+LOCALE_TO_XKB_OVERRIDES at the top of the script. If you discover a weird
+mapping of if you get a "failed to find XKB mapping for <locale>" warning then
+please consider adding an override there.
+
diff --git a/data/cldr2json/cldr2json.py b/data/cldr2json/cldr2json.py
new file mode 100755
index 0000000..c825800
--- /dev/null
+++ b/data/cldr2json/cldr2json.py
@@ -0,0 +1,212 @@
+#!/usr/bin/python3
+#
+# Copyright 2015 Daiki Ueno <dueno@src.gnome.org>
+# 2016 Parag Nemade <pnemade@redhat.com>
+# 2017 Alan <alan@boum.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, see
+# <http://www.gnu.org/licenses/>.
+
+import glob
+import json
+import locale
+import logging
+import os
+import re
+import sys
+import xml.etree.ElementTree
+
+import gi
+gi.require_version('GnomeDesktop', '3.0') # NOQA: E402
+from gi.repository import GnomeDesktop
+
+ESCAPE_PATTERN = re.compile(r'\\u\{([0-9A-Fa-f]+?)\}')
+ISO_PATTERN = re.compile(r'[A-E]([0-9]+)')
+
+LOCALE_TO_XKB_OVERRIDES = {
+ 'af': 'za',
+ 'en': 'us',
+ 'en-GB': 'uk',
+ 'es-US': 'latam',
+ 'fr-CA': 'ca',
+ 'hi': 'in+bolnagri',
+ 'ky': 'kg',
+ 'nl-BE': 'be',
+ 'zu': None
+}
+
+
+def parse_single_key(value):
+ def unescape(m):
+ return chr(int(m.group(1), 16))
+ value = ESCAPE_PATTERN.sub(unescape, value)
+ return value
+
+
+def parse_rows(keymap):
+ unsorted_rows = {}
+ for _map in keymap.iter('map'):
+ value = _map.get('to')
+ key = [parse_single_key(value)]
+ iso = _map.get('iso')
+ if not ISO_PATTERN.match(iso):
+ sys.stderr.write('invalid ISO key name: %s\n' % iso)
+ continue
+ if not iso[0] in unsorted_rows:
+ unsorted_rows[iso[0]] = []
+ unsorted_rows[iso[0]].append((int(iso[1:]), key))
+ # add subkeys
+ longPress = _map.get('longPress')
+ if longPress:
+ for value in longPress.split(' '):
+ subkey = parse_single_key(value)
+ key.append(subkey)
+
+ rows = []
+ for k, v in sorted(list(unsorted_rows.items()),
+ key=lambda x: x[0],
+ reverse=True):
+ row = []
+ for key in sorted(v, key=lambda x: x):
+ row.append(key[1])
+ rows.append(row)
+
+ return rows
+
+
+def convert_xml(tree):
+ root = {}
+ for xml_keyboard in tree.iter("keyboard"):
+ locale_full = xml_keyboard.get("locale")
+ locale, sep, end = locale_full.partition("-t-")
+ root["locale"] = locale
+ for xml_name in tree.iter("name"):
+ name = xml_name.get("value")
+ root["name"] = name
+ root["levels"] = []
+ # parse levels
+ for index, keymap in enumerate(tree.iter('keyMap')):
+ # FIXME: heuristics here
+ modifiers = keymap.get('modifiers')
+ if not modifiers:
+ mode = 'default'
+ modifiers = ''
+ elif 'shift' in modifiers.split(' '):
+ mode = 'latched'
+ modifiers = 'shift'
+ else:
+ mode = 'locked'
+ level = {}
+ level["level"] = modifiers
+ level["mode"] = mode
+ level["rows"] = parse_rows(keymap)
+ root["levels"].append(level)
+ return root
+
+
+def locale_to_xkb(locale, name):
+ if locale in sorted(LOCALE_TO_XKB_OVERRIDES.keys()):
+ xkb = LOCALE_TO_XKB_OVERRIDES[locale]
+ logging.debug("override for %s → %s",
+ locale, xkb)
+ if xkb:
+ return xkb
+ else:
+ raise KeyError("layout %s explicitly disabled in overrides"
+ % locale)
+ xkb_names = sorted(name_to_xkb.keys())
+ if name in xkb_names:
+ return name_to_xkb[name]
+ else:
+ logging.debug("name %s failed" % name)
+ for sub_name in name.split(' '):
+ if sub_name in xkb_names:
+ xkb = name_to_xkb[sub_name]
+ logging.debug("dumb mapping failed but match with locale word: "
+ "%s (%s) → %s (%s)",
+ locale, name, xkb, sub_name)
+ return xkb
+ else:
+ logging.debug("sub_name failed")
+ for xkb_name in xkb_names:
+ for xkb_sub_name in xkb_name.split(' '):
+ if xkb_sub_name.strip('()') == name:
+ xkb = name_to_xkb[xkb_name]
+ logging.debug("dumb mapping failed but match with xkb word: "
+ "%s (%s) → %s (%s)",
+ locale, name, xkb, xkb_name)
+ return xkb
+ raise KeyError("failed to find XKB mapping for %s" % locale)
+
+
+def convert_file(source_file, destination_path):
+ logging.info("Parsing %s", source_file)
+
+ itree = xml.etree.ElementTree.ElementTree()
+ itree.parse(source_file)
+
+ root = convert_xml(itree)
+
+ try:
+ xkb_name = locale_to_xkb(root["locale"], root["name"])
+ except KeyError as e:
+ logging.warning(e)
+ return False
+ destination_file = os.path.join(destination_path, xkb_name + ".json")
+
+ try:
+ with open(destination_file, 'x', encoding="utf-8") as dest_fd:
+ json.dump(root, dest_fd, ensure_ascii=False, indent=2, sort_keys=True)
+ except FileExistsError as e:
+ logging.info("File %s exists, not updating", destination_file)
+ return False
+
+ logging.debug("written %s", destination_file)
+
+
+def load_xkb_mappings():
+ xkb = GnomeDesktop.XkbInfo()
+ layouts = xkb.get_all_layouts()
+ name_to_xkb = {}
+
+ for layout in layouts:
+ name = xkb.get_layout_info(layout).display_name
+ name_to_xkb[name] = layout
+
+ return name_to_xkb
+
+
+locale.setlocale(locale.LC_ALL, "C")
+name_to_xkb = load_xkb_mappings()
+
+
+if __name__ == "__main__":
+ if "DEBUG" in os.environ:
+ logging.basicConfig(level=logging.DEBUG)
+
+ if len(sys.argv) < 2:
+ print("supply a CLDR keyboard file")
+ sys.exit(1)
+
+ if len(sys.argv) < 3:
+ print("supply an output directory")
+ sys.exit(1)
+
+ source = sys.argv[1]
+ destination = sys.argv[2]
+ if os.path.isfile(source):
+ convert_file(source, destination)
+ elif os.path.isdir(source):
+ for path in glob.glob(source + "/*-t-k0-android.xml"):
+ convert_file(path, destination)
diff --git a/data/cldr2json/test/__init__.py b/data/cldr2json/test/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/cldr2json/test/__init__.py
diff --git a/data/cldr2json/test/data/fr-t-k0-android.xml b/data/cldr2json/test/data/fr-t-k0-android.xml
new file mode 100644
index 0000000..1e76b81
--- /dev/null
+++ b/data/cldr2json/test/data/fr-t-k0-android.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE keyboard SYSTEM "../dtd/ldmlKeyboard.dtd">
+<keyboard locale="fr-t-k0-android">
+ <version platform="4.4" number="$Revision: 11914 $"/>
+ <names>
+ <name value="French"/>
+ </names>
+ <keyMap>
+ <map iso="D01" to="a" longPress="à â % æ á ä ã å ā ª"/> <!-- Q -->
+ <map iso="D02" to="z"/> <!-- W -->
+ <map iso="D03" to="e" longPress="é è ê ë % ę ė ē"/>
+ <map iso="D04" to="r"/>
+ <map iso="D05" to="t"/>
+ <map iso="D06" to="y" longPress="% ÿ"/>
+ <map iso="D07" to="u" longPress="ù û % ü ú ū"/>
+ <map iso="D08" to="i" longPress="î % ï ì í į ī"/>
+ <map iso="D09" to="o" longPress="ô œ % ö ò ó õ ø ō º"/>
+ <map iso="D10" to="p"/>
+ <map iso="C01" to="q"/> <!-- A -->
+ <map iso="C02" to="s"/>
+ <map iso="C03" to="d"/>
+ <map iso="C04" to="f"/>
+ <map iso="C05" to="g"/>
+ <map iso="C06" to="h"/>
+ <map iso="C07" to="j"/>
+ <map iso="C08" to="k"/>
+ <map iso="C09" to="l"/>
+ <map iso="C10" to="m"/> <!-- ; -->
+ <map iso="B01" to="w"/> <!-- Z -->
+ <map iso="B02" to="x"/>
+ <map iso="B03" to="c" longPress="ç ć č"/>
+ <map iso="B04" to="v"/>
+ <map iso="B05" to="b"/>
+ <map iso="B06" to="n"/>
+ <map iso="B07" to="&apos;" longPress="‘ ’ ‹ ›"/> <!-- M -->
+ <map iso="A02" to=","/> <!-- (key to left of space) -->
+ <map iso="A03" to=" "/> <!-- space -->
+ <map iso="A04" to="." longPress="# ! , ? - : ' @"/> <!-- (key to right of space) -->
+ </keyMap>
+ <keyMap modifiers="shift caps">
+ <map iso="D01" to="A" longPress="À Â % Æ Á Ä Ã Å Ā ª"/> <!-- Q -->
+ <map iso="D02" to="Z"/> <!-- W -->
+ <map iso="D03" to="E" longPress="É È Ê Ë % Ę Ė Ē"/>
+ <map iso="D04" to="R"/>
+ <map iso="D05" to="T"/>
+ <map iso="D06" to="Y" longPress="% Ÿ"/>
+ <map iso="D07" to="U" longPress="Ù Û % Ü Ú Ū"/>
+ <map iso="D08" to="I" longPress="Î % Ï Ì Í Į Ī"/>
+ <map iso="D09" to="O" longPress="Ô Œ % Ö Ò Ó Õ Ø Ō º"/>
+ <map iso="D10" to="P"/>
+ <map iso="C01" to="Q"/> <!-- A -->
+ <map iso="C02" to="S"/>
+ <map iso="C03" to="D"/>
+ <map iso="C04" to="F"/>
+ <map iso="C05" to="G"/>
+ <map iso="C06" to="H"/>
+ <map iso="C07" to="J"/>
+ <map iso="C08" to="K"/>
+ <map iso="C09" to="L"/>
+ <map iso="C10" to="M"/> <!-- ; -->
+ <map iso="B01" to="W"/> <!-- Z -->
+ <map iso="B02" to="X"/>
+ <map iso="B03" to="C" longPress="Ç Ć Č"/>
+ <map iso="B04" to="V"/>
+ <map iso="B05" to="B"/>
+ <map iso="B06" to="N"/>
+ <map iso="B07" to="&apos;" longPress="‘ ’ ‹ ›"/> <!-- M -->
+ <map iso="A02" to=","/> <!-- (key to left of space) -->
+ <map iso="A03" to=" "/> <!-- space -->
+ <map iso="A04" to="." longPress="# ! , ? - : ' @"/> <!-- (key to right of space) -->
+ </keyMap>
+ <keyMap modifiers="opt">
+ <map iso="D01" to="1" longPress="¹ ½ ⅓ ¼ ⅛"/> <!-- Q base=a -->
+ <map iso="D02" to="2" longPress="² ⅔"/> <!-- W base=z -->
+ <map iso="D03" to="3" longPress="³ ¾ ⅜"/> <!-- E -->
+ <map iso="D04" to="4" longPress="⁴"/> <!-- R -->
+ <map iso="D05" to="5" longPress="⅝"/> <!-- T -->
+ <map iso="D06" to="6"/> <!-- Y -->
+ <map iso="D07" to="7" longPress="⅞"/> <!-- U -->
+ <map iso="D08" to="8"/> <!-- I -->
+ <map iso="D09" to="9"/> <!-- O -->
+ <map iso="D10" to="0" longPress="ⁿ ∅"/> <!-- P -->
+ <map iso="C01" to="@"/> <!-- A base=q -->
+ <map iso="C02" to="#"/> <!-- S -->
+ <map iso="C03" to="€" longPress="¢ £ $ ¥ ₱"/> <!-- D -->
+ <map iso="C04" to="%" longPress="‰"/> <!-- F -->
+ <map iso="C05" to="&amp;"/> <!-- G -->
+ <map iso="C06" to="-" longPress="_ – — ·"/> <!-- H -->
+ <map iso="C07" to="+" longPress="±"/> <!-- J -->
+ <map iso="C08" to="(" longPress="&lt; { ["/> <!-- K -->
+ <map iso="C09" to=")" longPress="&gt; } ]"/> <!-- L -->
+ <map iso="B01" to="*" longPress="† ‡ ★"/> <!-- Z base=w -->
+ <map iso="B02" to="\u{22}" longPress="“ ” « »"/> <!-- X to= " -->
+ <map iso="B03" to="&apos;" longPress="‘ ’ ‹ ›"/> <!-- C -->
+ <map iso="B04" to=":"/> <!-- V -->
+ <map iso="B05" to=";"/> <!-- B -->
+ <map iso="B06" to="!" longPress="¡"/> <!-- N -->
+ <map iso="B07" to="?" longPress="¿"/> <!-- M base=' -->
+ <map iso="A00" to="_"/> <!-- (3 keys to left of space) -->
+ <map iso="A01" to="/"/> <!-- (2 keys to left of space) -->
+ <map iso="A02" to=" "/> <!-- (key to left of space) base=, -->
+ <map iso="A03" to=","/> <!-- space -->
+ <map iso="A04" to="." longPress="…"/> <!-- (key to right of space) -->
+ </keyMap>
+ <keyMap modifiers="opt+shift">
+ <map iso="D01" to="~"/> <!-- Q base=a -->
+ <map iso="D02" to="`"/> <!-- W base=z -->
+ <map iso="D03" to="|"/> <!-- E -->
+ <map iso="D04" to="•" longPress="♪ ♥ ♠ ♦ ♣"/> <!-- R -->
+ <map iso="D05" to="√"/> <!-- T -->
+ <map iso="D06" to="Π" longPress="π"/> <!-- Y -->
+ <map iso="D07" to="÷"/> <!-- U -->
+ <map iso="D08" to="×"/> <!-- I -->
+ <map iso="D09" to="¶" longPress="§"/> <!-- O -->
+ <map iso="D10" to="∆"/> <!-- P -->
+ <map iso="C01" to="£"/> <!-- A base=q -->
+ <map iso="C02" to="¥"/> <!-- S -->
+ <map iso="C03" to="$" longPress="¢"/> <!-- D -->
+ <map iso="C04" to="¢"/> <!-- F -->
+ <map iso="C05" to="^" longPress="↑ ↓ ← →"/> <!-- G -->
+ <map iso="C06" to="°" longPress="′ ″"/> <!-- H -->
+ <map iso="C07" to="=" longPress="≠ ≈ ∞"/> <!-- J -->
+ <map iso="C08" to="{"/> <!-- K -->
+ <map iso="C09" to="}"/> <!-- L -->
+ <map iso="B01" to="\"/> <!-- Z base=w -->
+ <map iso="B02" to="©"/> <!-- X -->
+ <map iso="B03" to="®"/> <!-- C -->
+ <map iso="B04" to="™"/> <!-- V -->
+ <map iso="B05" to="℅"/> <!-- B -->
+ <map iso="B06" to="["/> <!-- N -->
+ <map iso="B07" to="]"/> <!-- M base=' -->
+ <map iso="A00" to="&lt;" longPress="‹ ≤ «"/> <!-- (3 keys to left of space) -->
+ <map iso="A01" to="&gt;" longPress="› ≥ »"/> <!-- (2 keys to left of space) -->
+ <map iso="A02" to=" "/> <!-- (key to left of space) base=, -->
+ <map iso="A03" to=","/> <!-- space -->
+ <map iso="A04" to="." longPress="…"/> <!-- (key to right of space) -->
+ </keyMap>
+</keyboard>
diff --git a/data/cldr2json/test/data/fr.json b/data/cldr2json/test/data/fr.json
new file mode 100644
index 0000000..3a8949f
--- /dev/null
+++ b/data/cldr2json/test/data/fr.json
@@ -0,0 +1,614 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "a",
+ "à",
+ "â",
+ "%",
+ "æ",
+ "á",
+ "ä",
+ "ã",
+ "å",
+ "ā",
+ "ª"
+ ],
+ [
+ "z"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ê",
+ "ë",
+ "%",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "%",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ù",
+ "û",
+ "%",
+ "ü",
+ "ú",
+ "ū"
+ ],
+ [
+ "i",
+ "î",
+ "%",
+ "ï",
+ "ì",
+ "í",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ô",
+ "œ",
+ "%",
+ "ö",
+ "ò",
+ "ó",
+ "õ",
+ "ø",
+ "ō",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "q"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ "w"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "ć",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "A",
+ "À",
+ "Â",
+ "%",
+ "Æ",
+ "Á",
+ "Ä",
+ "Ã",
+ "Å",
+ "Ā",
+ "ª"
+ ],
+ [
+ "Z"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ê",
+ "Ë",
+ "%",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "%",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ù",
+ "Û",
+ "%",
+ "Ü",
+ "Ú",
+ "Ū"
+ ],
+ [
+ "I",
+ "Î",
+ "%",
+ "Ï",
+ "Ì",
+ "Í",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ô",
+ "Œ",
+ "%",
+ "Ö",
+ "Ò",
+ "Ó",
+ "Õ",
+ "Ø",
+ "Ō",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "Q"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ "W"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Ć",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "fr",
+ "name": "French"
+}
diff --git a/data/cldr2json/test/test_cldr2json.py b/data/cldr2json/test/test_cldr2json.py
new file mode 100755
index 0000000..78a6aa0
--- /dev/null
+++ b/data/cldr2json/test/test_cldr2json.py
@@ -0,0 +1,212 @@
+#!/usr/bin/python3
+
+import json
+import tempfile
+import unittest
+import xml.etree.ElementTree
+
+import cldr2json
+
+
+class TestParseSingleKey(unittest.TestCase):
+ def test_ascii(self):
+ self.assertEqual(cldr2json.parse_single_key("a"), "a")
+
+ def test_nonascii(self):
+ self.assertEqual(cldr2json.parse_single_key("Æ"), "Æ")
+
+ def test_twochars(self):
+ self.assertEqual(cldr2json.parse_single_key("ԵՒ"), "ԵՒ")
+
+ def test_decode(self):
+ self.assertEqual(cldr2json.parse_single_key("\\u{200D}"), "\u200d")
+
+ def test_decode_threechars(self):
+ self.assertEqual(cldr2json.parse_single_key("ज\\u{94D}ञ"), "ज\u094Dञ")
+
+
+class TestParseRow(unittest.TestCase):
+ def test_parse_row(self):
+ xml_string = """
+ <keyMap>
+ <map iso="D01" to="a" longPress="à â % æ á ä ã å ā ª"/> <!-- Q -->
+ <map iso="D02" to="z"/> <!-- W -->
+ <map iso="D03" to="e" longPress="é è ê ë % ę ė ē"/>
+ <map iso="D04" to="r"/>
+ <map iso="D05" to="t"/>
+ <map iso="D06" to="y" longPress="% ÿ"/>
+ <map iso="D07" to="u" longPress="ù û % ü ú ū"/>
+ <map iso="D08" to="i" longPress="î % ï ì í į ī"/>
+ <map iso="D09" to="o" longPress="ô œ % ö ò ó õ ø ō º"/>
+ <map iso="D10" to="p"/>
+ <map iso="C01" to="q"/> <!-- A -->
+ <map iso="C02" to="s"/>
+ <map iso="C03" to="d"/>
+ <map iso="C04" to="f"/>
+ <map iso="C05" to="g"/>
+ <map iso="C06" to="h"/>
+ <map iso="C07" to="j"/>
+ <map iso="C08" to="k"/>
+ <map iso="C09" to="l"/>
+ <map iso="C10" to="m"/> <!-- ; -->
+ <map iso="B01" to="w"/> <!-- Z -->
+ <map iso="B02" to="x"/>
+ <map iso="B03" to="c" longPress="ç ć č"/>
+ <map iso="B04" to="v"/>
+ <map iso="B05" to="b"/>
+ <map iso="B06" to="n"/>
+ <map iso="B07" to="&apos;" longPress="‘ ’ ‹ ›"/> <!-- M -->
+ <map iso="A02" to=","/> <!-- (key to left of space) -->
+ <map iso="A03" to=" "/> <!-- space -->
+ <map iso="A04" to="." longPress="# ! , ? - : ' @"/> <!-- (key to right of space) -->
+ </keyMap>
+ """
+ xml_tree = xml.etree.ElementTree.XML(xml_string)
+ json = [[
+ ['a', 'à', 'â', '%', 'æ', 'á', 'ä', 'ã', 'å', 'ā', 'ª'],
+ ['z'],
+ ['e', 'é', 'è', 'ê', 'ë', '%', 'ę', 'ė', 'ē'],
+ ['r'],
+ ['t'],
+ ['y', '%', 'ÿ'],
+ ['u', 'ù', 'û', '%', 'ü', 'ú', 'ū'],
+ ['i', 'î', '%', 'ï', 'ì', 'í', 'į', 'ī'],
+ ['o', 'ô', 'œ', '%', 'ö', 'ò', 'ó', 'õ', 'ø', 'ō', 'º'],
+ ['p']
+ ], [
+ ['q'],
+ ['s'],
+ ['d'],
+ ['f'],
+ ['g'],
+ ['h'],
+ ['j'],
+ ['k'],
+ ['l'],
+ ['m']
+ ], [
+ ['w'],
+ ['x'],
+ ['c', 'ç', 'ć', 'č'],
+ ['v'],
+ ['b'],
+ ['n'],
+ ["'", '‘', '’', '‹', '›']
+ ], [
+ [','],
+ [' '],
+ ['.', '#', '!', ',', '?', '-', ':', "'", '@']
+ ]]
+ self.assertEqual(cldr2json.parse_rows(xml_tree), json)
+
+
+class TestConvertXml(unittest.TestCase):
+ def test_convert_xml(self):
+ xml_string = """<?xml version="1.0" encoding="UTF-8" ?>
+ <!DOCTYPE keyboard SYSTEM "../dtd/ldmlKeyboard.dtd">
+ <keyboard locale="fr-t-k0-android">
+ <version platform="4.4" number="$Revision: 11914 $"/>
+ <names>
+ <name value="French"/>
+ </names>
+ <keyMap>
+ <map iso="D01" to="a" longPress="à â % æ á ä ã å ā ª"/> <!-- Q -->
+ </keyMap>
+ <keyMap modifiers="shift caps">
+ <map iso="D01" to="A" longPress="À Â % Æ Á Ä Ã Å Ā ª"/> <!-- Q -->
+ </keyMap>
+ <keyMap modifiers="opt">
+ <map iso="D01" to="1" longPress="¹ ½ ⅓ ¼ ⅛"/> <!-- Q base=a -->
+ </keyMap>
+ <keyMap modifiers="opt+shift">
+ <map iso="D01" to="~"/> <!-- Q base=a -->
+ </keyMap>
+ </keyboard>
+ """
+ xml_tree = xml.etree.ElementTree.XML(xml_string)
+ json = {
+ "locale": "fr",
+ "name": "French",
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ ['a', 'à', 'â', '%', 'æ', 'á', 'ä', 'ã', 'å', 'ā', 'ª'],
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ ['A', 'À', 'Â', '%', 'Æ', 'Á', 'Ä', 'Ã', 'Å', 'Ā', 'ª'],
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ ["1", "¹", "½", "⅓", "¼", "⅛"],
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ ["~"],
+ ]
+ ]
+ }
+ ]
+ }
+ self.assertEqual(cldr2json.convert_xml(xml_tree), json)
+
+
+class TestConvertFile(unittest.TestCase):
+ def test_fr(self):
+ outdir = tempfile.mkdtemp()
+ cldr2json.convert_file("test/data/fr-t-k0-android.xml", outdir)
+ with open("test/data/fr.json", encoding="utf-8") as expected_json_fd:
+ expected_json = json.load(expected_json_fd)
+ with open(outdir + "/fr.json", encoding="utf-8") as actual_json_fd:
+ actual_json = json.load(actual_json_fd)
+ self.assertEqual(expected_json, actual_json)
+
+
+class TestLocaleToXKB(unittest.TestCase):
+ def test_simple(self):
+ self.assertEqual(cldr2json.locale_to_xkb("fr", "French"),
+ "fr")
+
+ def test_fallback(self):
+ self.assertEqual(cldr2json.locale_to_xkb("nb", "Norwegian Bokmål"),
+ "no")
+
+ def test_fallback2(self):
+ self.assertEqual(cldr2json.locale_to_xkb("km", "Khmer"),
+ "kh")
+
+ def test_override(self):
+ self.assertEqual(cldr2json.locale_to_xkb("en-GB",
+ "English Great Britain"),
+ "uk")
+
+
+class LoadXKBMapplings(unittest.TestCase):
+ def test_dictionnary(self):
+ self.assertIsInstance(cldr2json.load_xkb_mappings(), dict)
+
+ def test_mapping(self):
+ mapping = cldr2json.load_xkb_mappings()
+ self.assertEqual(mapping["French"], "fr")
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/data/dbus-interfaces/meson.build b/data/dbus-interfaces/meson.build
new file mode 100644
index 0000000..c96bbbb
--- /dev/null
+++ b/data/dbus-interfaces/meson.build
@@ -0,0 +1,10 @@
+dbus_interfaces = [
+ 'org.gnome.Shell.Extensions.xml',
+ 'org.gnome.Shell.Introspect.xml',
+ 'org.gnome.Shell.PadOsd.xml',
+ 'org.gnome.Shell.Screencast.xml',
+ 'org.gnome.Shell.Screenshot.xml',
+ 'org.gnome.ShellSearchProvider.xml',
+ 'org.gnome.ShellSearchProvider2.xml'
+]
+install_data(dbus_interfaces, install_dir: ifacedir)
diff --git a/data/dbus-interfaces/net.hadess.SensorProxy.xml b/data/dbus-interfaces/net.hadess.SensorProxy.xml
new file mode 100644
index 0000000..2bf8ffa
--- /dev/null
+++ b/data/dbus-interfaces/net.hadess.SensorProxy.xml
@@ -0,0 +1,5 @@
+<node>
+ <interface name="net.hadess.SensorProxy">
+ <property name="HasAccelerometer" type="b" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/net.hadess.SwitcherooControl.xml b/data/dbus-interfaces/net.hadess.SwitcherooControl.xml
new file mode 100644
index 0000000..e52bc1a
--- /dev/null
+++ b/data/dbus-interfaces/net.hadess.SwitcherooControl.xml
@@ -0,0 +1,46 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<node>
+
+ <!--
+ net.hadess.SwitcherooControl:
+ @short_description: D-Bus proxy to access dual-GPU controls.
+
+ After checking the availability of two switchable GPUs in the machine,
+ check the value of net.hadess.SwitcherooControl.HasDualGpu to see
+ if running applications on the discrete GPU should be offered.
+
+ The object path will be "/net/hadess/SwitcherooControl".
+ -->
+ <interface name="net.hadess.SwitcherooControl">
+ <!--
+ HasDualGpu:
+
+ Whether two switchable GPUs are present on the system. This property
+ has been obsoleted in favour of the "NumGPUs" property.
+ -->
+ <property name="HasDualGpu" type="b" access="read"/>
+
+ <!--
+ NumGPUs:
+
+ The number of GPUs available on the system. Note that while having no
+ GPUs is unlikely, consumers of this API should probably not throw errors
+ if that were the case.
+ -->
+ <property name="NumGPUs" type="u" access="read"/>
+
+ <!--
+ GPUs:
+
+ An array of key-pair values representing each GPU. The key named "Name" (s)
+ will contain a user-facing name for the GPU, the "Environment" (as) key will
+ contain an array of even number of strings, each being an environment
+ variable to set to use the GPU, followed by its value, the "Default" (b) key
+ will tag the default (usually integrated) GPU.
+ -->
+ <property name="GPUs" type="aa{sv}" access="read"/>
+
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.Gtk.MountOperationHandler.xml b/data/dbus-interfaces/org.Gtk.MountOperationHandler.xml
new file mode 100644
index 0000000..8b03a2e
--- /dev/null
+++ b/data/dbus-interfaces/org.Gtk.MountOperationHandler.xml
@@ -0,0 +1,32 @@
+<node>
+ <interface name="org.Gtk.MountOperationHandler">
+ <method name="AskPassword">
+ <arg type="s" direction="in" name="object_id"/>
+ <arg type="s" direction="in" name="message"/>
+ <arg type="s" direction="in" name="icon_name"/>
+ <arg type="s" direction="in" name="default_user"/>
+ <arg type="s" direction="in" name="default_domain"/>
+ <arg type="u" direction="in" name="flags"/>
+ <arg type="u" direction="out" name="response"/>
+ <arg type="a{sv}" direction="out" name="response_details"/>
+ </method>
+ <method name="AskQuestion">
+ <arg type="s" direction="in" name="object_id"/>
+ <arg type="s" direction="in" name="message"/>
+ <arg type="s" direction="in" name="icon_name"/>
+ <arg type="as" direction="in" name="choices"/>
+ <arg type="u" direction="out" name="response"/>
+ <arg type="a{sv}" direction="out" name="response_details"/>
+ </method>
+ <method name="ShowProcesses">
+ <arg type="s" direction="in" name="object_id"/>
+ <arg type="s" direction="in" name="message"/>
+ <arg type="s" direction="in" name="icon_name"/>
+ <arg type="ai" direction="in" name="application_pids"/>
+ <arg type="as" direction="in" name="choices"/>
+ <arg type="u" direction="out" name="response"/>
+ <arg type="a{sv}" direction="out" name="response_details"/>
+ </method>
+ <method name="Close"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.Application.xml b/data/dbus-interfaces/org.freedesktop.Application.xml
new file mode 100644
index 0000000..55be7d7
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.Application.xml
@@ -0,0 +1,12 @@
+<node>
+ <interface name="org.freedesktop.Application">
+ <method name="ActivateAction">
+ <arg type="s" direction="in"/>
+ <arg type="av" direction="in"/>
+ <arg type="a{sv}" direction="in"/>
+ </method>
+ <method name="Activate">
+ <arg type="a{sv}" direction="in"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.DBus.xml b/data/dbus-interfaces/org.freedesktop.DBus.xml
new file mode 100644
index 0000000..18ff2aa
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.DBus.xml
@@ -0,0 +1,16 @@
+<node>
+ <interface name="org.freedesktop.DBus">
+ <method name="ListNames">
+ <arg type="as" direction="out" name="names"/>
+ </method>
+ <method name="GetConnectionUnixProcessID">
+ <arg type="s" direction="in"/>
+ <arg type="u" direction="out"/>
+ </method>
+ <signal name="NameOwnerChanged">
+ <arg type="s" direction="out" name="name"/>
+ <arg type="s" direction="out" name="oldOwner"/>
+ <arg type="s" direction="out" name="newOwner"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.GeoClue2.Agent.xml b/data/dbus-interfaces/org.freedesktop.GeoClue2.Agent.xml
new file mode 100644
index 0000000..2773601
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.GeoClue2.Agent.xml
@@ -0,0 +1,11 @@
+<node>
+ <interface name="org.freedesktop.GeoClue2.Agent">
+ <property name="MaxAccuracyLevel" type="u" access="read"/>
+ <method name="AuthorizeApp">
+ <arg name="desktop_id" type="s" direction="in"/>
+ <arg name="req_accuracy_level" type="u" direction="in"/>
+ <arg name="authorized" type="b" direction="out"/>
+ <arg name="allowed_accuracy_level" type="u" direction="out"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.GeoClue2.Manager.xml b/data/dbus-interfaces/org.freedesktop.GeoClue2.Manager.xml
new file mode 100644
index 0000000..28db3c6
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.GeoClue2.Manager.xml
@@ -0,0 +1,9 @@
+<node>
+ <interface name="org.freedesktop.GeoClue2.Manager">
+ <property name="InUse" type="b" access="read"/>
+ <property name="AvailableAccuracyLevel" type="u" access="read"/>
+ <method name="AddAgent">
+ <arg name="id" type="s" direction="in"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Cdma.xml b/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Cdma.xml
new file mode 100644
index 0000000..12a85e0
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Cdma.xml
@@ -0,0 +1,13 @@
+<node>
+ <interface name="org.freedesktop.ModemManager.Modem.Cdma">
+ <method name="GetSignalQuality">
+ <arg type="u" direction="out"/>
+ </method>
+ <method name="GetServingSystem">
+ <arg type="(usu)" direction="out"/>
+ </method>
+ <signal name="SignalQuality">
+ <arg type="u" direction="out"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Gsm.Network.xml b/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Gsm.Network.xml
new file mode 100644
index 0000000..7d8c25a
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Gsm.Network.xml
@@ -0,0 +1,19 @@
+<node>
+ <interface name="org.freedesktop.ModemManager.Modem.Gsm.Network">
+ <method name="GetRegistrationInfo">
+ <arg type="(uss)" direction="out"/>
+ </method>
+ <method name="GetSignalQuality">
+ <arg type="u" direction="out"/>
+ </method>
+ <property name="AccessTechnology" type="u" access="read"/>
+ <signal name="SignalQuality">
+ <arg type="u" direction="out"/>
+ </signal>
+ <signal name="RegistrationInfo">
+ <arg type="u" direction="out"/>
+ <arg type="s" direction="out"/>
+ <arg type="s" direction="out"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.Modem3gpp.xml b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.Modem3gpp.xml
new file mode 100644
index 0000000..41e6601
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.Modem3gpp.xml
@@ -0,0 +1,6 @@
+<node>
+ <interface name="org.freedesktop.ModemManager1.Modem.Modem3gpp">
+ <property name="OperatorCode" type="s" access="read"/>
+ <property name="OperatorName" type="s" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.ModemCdma.xml b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.ModemCdma.xml
new file mode 100644
index 0000000..d029252
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.ModemCdma.xml
@@ -0,0 +1,5 @@
+<node>
+ <interface name="org.freedesktop.ModemManager1.Modem.ModemCdma">
+ <property name="Sid" type="u" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.xml b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.xml
new file mode 100644
index 0000000..204426b
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.xml
@@ -0,0 +1,5 @@
+<node>
+ <interface name="org.freedesktop.ModemManager1.Modem">
+ <property name="SignalQuality" type="(ub)" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.Notifications.xml b/data/dbus-interfaces/org.freedesktop.Notifications.xml
new file mode 100644
index 0000000..0ed8657
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.Notifications.xml
@@ -0,0 +1,35 @@
+<node>
+ <interface name="org.freedesktop.Notifications">
+ <method name="Notify">
+ <arg type="s" direction="in"/>
+ <arg type="u" direction="in"/>
+ <arg type="s" direction="in"/>
+ <arg type="s" direction="in"/>
+ <arg type="s" direction="in"/>
+ <arg type="as" direction="in"/>
+ <arg type="a{sv}" direction="in"/>
+ <arg type="i" direction="in"/>
+ <arg type="u" direction="out"/>
+ </method>
+ <method name="CloseNotification">
+ <arg type="u" direction="in"/>
+ </method>
+ <method name="GetCapabilities">
+ <arg type="as" direction="out"/>
+ </method>
+ <method name="GetServerInformation">
+ <arg type="s" direction="out"/>
+ <arg type="s" direction="out"/>
+ <arg type="s" direction="out"/>
+ <arg type="s" direction="out"/>
+ </method>
+ <signal name="NotificationClosed">
+ <arg type="u"/>
+ <arg type="u"/>
+ </signal>
+ <signal name="ActionInvoked">
+ <arg type="u"/>
+ <arg type="s"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.PackageKit.Offline.xml b/data/dbus-interfaces/org.freedesktop.PackageKit.Offline.xml
new file mode 100644
index 0000000..ff61166
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.PackageKit.Offline.xml
@@ -0,0 +1,13 @@
+<node>
+ <interface name="org.freedesktop.PackageKit.Offline">
+ <property name="UpdatePrepared" type="b" access="read"/>
+ <property name="UpdateTriggered" type="b" access="read"/>
+ <property name="UpgradePrepared" type="b" access="read"/>
+ <property name="UpgradeTriggered" type="b" access="read"/>
+ <property name="PreparedUpgrade" type="a{sv}" access="read"/>
+ <method name="Trigger">
+ <arg type="s" name="action" direction="in"/>
+ </method>
+ <method name="Cancel"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.UPower.Device.xml b/data/dbus-interfaces/org.freedesktop.UPower.Device.xml
new file mode 100644
index 0000000..4882285
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.UPower.Device.xml
@@ -0,0 +1,11 @@
+<node>
+ <interface name="org.freedesktop.UPower.Device">
+ <property name="Type" type="u" access="read"/>
+ <property name="State" type="u" access="read"/>
+ <property name="Percentage" type="d" access="read"/>
+ <property name="TimeToEmpty" type="x" access="read"/>
+ <property name="TimeToFull" type="x" access="read"/>
+ <property name="IsPresent" type="b" access="read"/>
+ <property name="IconName" type="s" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.UPower.xml b/data/dbus-interfaces/org.freedesktop.UPower.xml
new file mode 100644
index 0000000..a0fba20
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.UPower.xml
@@ -0,0 +1,5 @@
+<node>
+ <interface name="org.freedesktop.UPower">
+ <property name="OnBattery" type="b" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.bolt1.Device.xml b/data/dbus-interfaces/org.freedesktop.bolt1.Device.xml
new file mode 100644
index 0000000..44b40dc
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.bolt1.Device.xml
@@ -0,0 +1,18 @@
+<node>
+ <interface name="org.freedesktop.bolt1.Device">
+ <property name="Uid" type="s" access="read"></property>
+ <property name="Name" type="s" access="read"></property>
+ <property name="Vendor" type="s" access="read"></property>
+ <property name="Type" type="s" access="read"></property>
+ <property name="Status" type="s" access="read"></property>
+ <property name="Parent" type="s" access="read"></property>
+ <property name="SysfsPath" type="s" access="read"></property>
+ <property name="Stored" type="b" access="read"></property>
+ <property name="Policy" type="s" access="read"></property>
+ <property name="Key" type="s" access="read"></property>
+ <property name="Label" type="s" access="read"></property>
+ <property name="ConnectTime" type="t" access="read"></property>
+ <property name="AuthorizeTime" type="t" access="read"></property>
+ <property name="StoreTime" type="t" access="read"></property>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.bolt1.Manager.xml b/data/dbus-interfaces/org.freedesktop.bolt1.Manager.xml
new file mode 100644
index 0000000..c98a94f
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.bolt1.Manager.xml
@@ -0,0 +1,15 @@
+<node>
+ <interface name="org.freedesktop.bolt1.Manager">
+ <property name="Probing" type="b" access="read"></property>
+ <property name="AuthMode" type="s" access="readwrite"></property>
+ <method name="EnrollDevice">
+ <arg type="s" name="uid" direction="in"/>
+ <arg type="s" name="policy" direction="in"/>
+ <arg type="s" name="flags" direction="in"/>
+ <arg name="device" direction="out" type="o"/>
+ </method>
+ <signal name="DeviceAdded">
+ <arg name="device" type="o"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.impl.portal.Access.xml b/data/dbus-interfaces/org.freedesktop.impl.portal.Access.xml
new file mode 100644
index 0000000..802a2c1
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.impl.portal.Access.xml
@@ -0,0 +1,15 @@
+<node>
+ <interface name="org.freedesktop.impl.portal.Access">
+ <method name="AccessDialog">
+ <arg type="o" name="handle" direction="in"/>
+ <arg type="s" name="app_id" direction="in"/>
+ <arg type="s" name="parent_window" direction="in"/>
+ <arg type="s" name="title" direction="in"/>
+ <arg type="s" name="subtitle" direction="in"/>
+ <arg type="s" name="body" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="u" name="response" direction="out"/>
+ <arg type="a{sv}" name="results" direction="out"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml b/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml
new file mode 100644
index 0000000..75fbc46
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml
@@ -0,0 +1,24 @@
+<node>
+ <interface name="org.freedesktop.impl.portal.PermissionStore">
+ <method name="Lookup">
+ <arg name="table" type="s" direction="in"/>
+ <arg name="id" type="s" direction="in"/>
+ <arg name="permissions" type="a{sas}" direction="out"/>
+ <arg name="data" type="v" direction="out"/>
+ </method>
+ <method name="Set">
+ <arg name="table" type="s" direction="in"/>
+ <arg name="create" type="b" direction="in"/>
+ <arg name="id" type="s" direction="in"/>
+ <arg name="app_permissions" type="a{sas}" direction="in"/>
+ <arg name="data" type="v" direction="in"/>
+ </method>
+ <signal name="Changed">
+ <arg name="table" type="s" direction="out"/>
+ <arg name="id" type="s" direction="out"/>
+ <arg name="deleted" type="b" direction="out"/>
+ <arg name="data" type="v" direction="out"/>
+ <arg name="permissions" type="a{sas}" direction="out"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.impl.portal.Request.xml b/data/dbus-interfaces/org.freedesktop.impl.portal.Request.xml
new file mode 100644
index 0000000..a9d03eb
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.impl.portal.Request.xml
@@ -0,0 +1,5 @@
+<node>
+ <interface name="org.freedesktop.impl.portal.Request">
+ <method name="Close"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.login1.Manager.xml b/data/dbus-interfaces/org.freedesktop.login1.Manager.xml
new file mode 100644
index 0000000..f40d498
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.login1.Manager.xml
@@ -0,0 +1,33 @@
+<node>
+ <interface name="org.freedesktop.login1.Manager">
+ <method name="Suspend">
+ <arg type="b" direction="in"/>
+ </method>
+ <method name="CanSuspend">
+ <arg type="s" direction="out"/>
+ </method>
+ <method name="Inhibit">
+ <arg type="s" direction="in"/>
+ <arg type="s" direction="in"/>
+ <arg type="s" direction="in"/>
+ <arg type="s" direction="in"/>
+ <arg type="h" direction="out"/>
+ </method>
+ <method name="GetSession">
+ <arg type="s" direction="in"/>
+ <arg type="o" direction="out"/>
+ </method>
+ <method name="ListSessions">
+ <arg name="sessions" type="a(susso)" direction="out"/>
+ </method>
+ <method name="CanRebootToBootLoaderMenu">
+ <arg type="s" direction="out"/>
+ </method>
+ <method name="SetRebootToBootLoaderMenu">
+ <arg type="t" direction="in"/>
+ </method>
+ <signal name="PrepareForSleep">
+ <arg type="b" direction="out"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.login1.Session.xml b/data/dbus-interfaces/org.freedesktop.login1.Session.xml
new file mode 100644
index 0000000..6fab817
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.login1.Session.xml
@@ -0,0 +1,15 @@
+<node>
+ <interface name="org.freedesktop.login1.Session">
+ <signal name="Lock"/>
+ <signal name="Unlock"/>
+ <property name="Active" type="b" access="read"/>
+ <property name="Class" type="s" access="read"/>
+ <property name="Id" type="s" access="read"/>
+ <property name="Remote" type="b" access="read"/>
+ <property name="Type" type="s" access="read"/>
+ <property name="State" type="s" access="read"/>
+ <method name="SetLockedHint">
+ <arg type="b" direction="in"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.login1.User.xml b/data/dbus-interfaces/org.freedesktop.login1.User.xml
new file mode 100644
index 0000000..d6f10b0
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.login1.User.xml
@@ -0,0 +1,6 @@
+<node>
+ <interface name="org.freedesktop.login1.User">
+ <property name="Display" type="(so)" access="read"/>
+ <property name="Sessions" type="a(so)" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.realmd.Provider.xml b/data/dbus-interfaces/org.freedesktop.realmd.Provider.xml
new file mode 100644
index 0000000..2fdb045
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.realmd.Provider.xml
@@ -0,0 +1,13 @@
+<node>
+ <interface name="org.freedesktop.realmd.Provider">
+ <property name="Name" type="s" access="read"/>
+ <property name="Version" type="s" access="read"/>
+ <property name="Realms" type="ao" access="read"/>
+ <method name="Discover">
+ <arg name="string" type="s" direction="in"/>
+ <arg name="options" type="a{sv}" direction="in"/>
+ <arg name="relevance" type="i" direction="out"/>
+ <arg name="realm" type="ao" direction="out"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.realmd.Realm.xml b/data/dbus-interfaces/org.freedesktop.realmd.Realm.xml
new file mode 100644
index 0000000..351066d
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.realmd.Realm.xml
@@ -0,0 +1,20 @@
+<node>
+ <interface name="org.freedesktop.realmd.Realm">
+ <property name="Name" type="s" access="read"/>
+ <property name="Configured" type="s" access="read"/>
+ <property name="Details" type="a(ss)" access="read"/>
+ <property name="LoginFormats" type="as" access="read"/>
+ <property name="LoginPolicy" type="s" access="read"/>
+ <property name="PermittedLogins" type="as" access="read"/>
+ <property name="SupportedInterfaces" type="as" access="read"/>
+ <method name="ChangeLoginPolicy">
+ <arg name="login_policy" type="s" direction="in"/>
+ <arg name="permitted_add" type="as" direction="in"/>
+ <arg name="permitted_remove" type="as" direction="in"/>
+ <arg name="options" type="a{sv}" direction="in"/>
+ </method>
+ <method name="Deconfigure">
+ <arg name="options" type="a{sv}" direction="in"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.freedesktop.realmd.Service.xml b/data/dbus-interfaces/org.freedesktop.realmd.Service.xml
new file mode 100644
index 0000000..4ffb7e7
--- /dev/null
+++ b/data/dbus-interfaces/org.freedesktop.realmd.Service.xml
@@ -0,0 +1,15 @@
+<node>
+ <interface name="org.freedesktop.realmd.Service">
+ <method name="Cancel">
+ <arg name="operation" type="s" direction="in"/>
+ </method>
+ <method name="Release"/>
+ <method name="SetLocale">
+ <arg name="locale" type="s" direction="in"/>
+ </method>
+ <signal name="Diagnostics">
+ <arg name="data" type="s"/>
+ <arg name="operation" type="s"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Magnifier.ZoomRegion.xml b/data/dbus-interfaces/org.gnome.Magnifier.ZoomRegion.xml
new file mode 100644
index 0000000..5db2734
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Magnifier.ZoomRegion.xml
@@ -0,0 +1,26 @@
+<node>
+ <interface name="org.gnome.Magnifier.ZoomRegion">
+ <method name="setMagFactor">
+ <arg type="d" direction="in"/>
+ <arg type="d" direction="in"/>
+ </method>
+ <method name="getMagFactor">
+ <arg type="d" direction="out"/>
+ <arg type="d" direction="out"/>
+ </method>
+ <method name="setRoi">
+ <arg type="ai" direction="in"/>
+ </method>
+ <method name="getRoi">
+ <arg type="ai" direction="out"/>
+ </method>
+ <method name="shiftContentsTo">
+ <arg type="i" direction="in"/>
+ <arg type="i" direction="in"/>
+ <arg type="b" direction="out"/>
+ </method>
+ <method name="moveResize">
+ <arg type="ai" direction="in"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Magnifier.xml b/data/dbus-interfaces/org.gnome.Magnifier.xml
new file mode 100644
index 0000000..2ade4dd
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Magnifier.xml
@@ -0,0 +1,54 @@
+<node>
+ <interface name="org.gnome.Magnifier">
+ <method name="setActive">
+ <arg type="b" direction="in"/>
+ </method>
+ <method name="isActive">
+ <arg type="b" direction="out"/>
+ </method>
+ <method name="showCursor"/>
+ <method name="hideCursor"/>
+ <method name="createZoomRegion">
+ <arg type="d" direction="in"/>
+ <arg type="d" direction="in"/>
+ <arg type="ai" direction="in"/>
+ <arg type="ai" direction="in"/>
+ <arg type="o" direction="out"/>
+ </method>
+ <method name="addZoomRegion">
+ <arg type="o" direction="in"/>
+ <arg type="b" direction="out"/>
+ </method>
+ <method name="getZoomRegions">
+ <arg type="ao" direction="out"/>
+ </method>
+ <method name="clearAllZoomRegions"/>
+ <method name="fullScreenCapable">
+ <arg type="b" direction="out"/>
+ </method>
+ <method name="setCrosswireSize">
+ <arg type="i" direction="in"/>
+ </method>
+ <method name="getCrosswireSize">
+ <arg type="i" direction="out"/>
+ </method>
+ <method name="setCrosswireLength">
+ <arg type="i" direction="in"/>
+ </method>
+ <method name="getCrosswireLength">
+ <arg type="i" direction="out"/>
+ </method>
+ <method name="setCrosswireClip">
+ <arg type="b" direction="in"/>
+ </method>
+ <method name="getCrosswireClip">
+ <arg type="b" direction="out"/>
+ </method>
+ <method name="setCrosswireColor">
+ <arg type="u" direction="in"/>
+ </method>
+ <method name="getCrosswireColor">
+ <arg type="u" direction="out"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Mutter.ScreenCast.xml b/data/dbus-interfaces/org.gnome.Mutter.ScreenCast.xml
new file mode 100644
index 0000000..a8ff3cc
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Mutter.ScreenCast.xml
@@ -0,0 +1,191 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Mutter.ScreenCast:
+ @short_description: Screen cast interface
+
+ This API is private and not intended to be used outside of the integrated
+ system that uses libmutter. No compatibility between versions are
+ promised.
+ -->
+ <interface name="org.gnome.Mutter.ScreenCast">
+
+ <!--
+ CreateSession:
+ @properties: Properties
+ @session_path: Path to the new session object
+
+ * "remote-desktop-session-id" (s): The ID of a remote desktop session.
+ Remote desktop driven screen casts
+ are started and stopped by the remote
+ desktop session.
+ * "disable-animations" (b): Set to "true" if the screen cast application
+ would prefer animations to be globally
+ disabled, while the session is running. Default
+ is "false". Available since version 3.
+ -->
+ <method name="CreateSession">
+ <arg name="properties" type="a{sv}" direction="in" />
+ <arg name="session_path" type="o" direction="out" />
+ </method>
+
+ <!--
+ Version:
+ @short_description: API version
+ -->
+ <property name="Version" type="i" access="read" />
+
+ </interface>
+
+ <!--
+ org.gnome.Mutter.ScreenCast.Session:
+ @short_description: Screen cast session
+ -->
+ <interface name="org.gnome.Mutter.ScreenCast.Session">
+
+ <!--
+ Start:
+
+ Start the screen cast session
+ -->
+ <method name="Start" />
+
+ <!--
+ Stop:
+
+ Stop the screen cast session
+ -->
+ <method name="Stop" />
+
+ <!--
+ Closed:
+
+ The session has closed.
+ -->
+ <signal name="Closed" />
+
+ <!--
+ RecordMonitor:
+ @connector: Connector of the monitor to record
+ @properties: Properties
+ @stream_path: Path to the new stream object
+
+ Record a single monitor.
+
+ Available @properties include:
+
+ * "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
+ Available since API version 2.
+ * "is-recording" (b): Whether this is a screen recording. May be
+ be used for choosing panel icon.
+ Default: false. Available since API version 4.
+
+ Available cursor mode values:
+
+ 0: hidden - cursor is not included in the stream
+ 1: embedded - cursor is included in the framebuffer
+ 2: metadata - cursor is included as metadata in the PipeWire stream
+ -->
+ <method name="RecordMonitor">
+ <arg name="connector" type="s" direction="in" />
+ <arg name="properties" type="a{sv}" direction="in" />
+ <arg name="stream_path" type="o" direction="out" />
+ </method>
+
+ <!--
+ RecordWindow:
+ @properties: Properties used determining what window to select
+ @stream_path: Path to the new stream object
+
+ Supported since API version 2.
+
+ Record a single window. The cursor will not be included.
+
+ Available @properties include:
+
+ * "window-id" (t): Id of the window to record.
+ * "cursor-mode" (u): Cursor mode. Default: 'hidden' (see RecordMonitor).
+ * "is-recording" (b): Whether this is a screen recording. May be
+ be used for choosing panel icon.
+ Default: false. Available since API version 4.
+
+ -->
+ <method name="RecordWindow">
+ <arg name="properties" type="a{sv}" direction="in" />
+ <arg name="stream_path" type="o" direction="out" />
+ </method>
+
+ <!--
+ RecordArea:
+ @x: X position of the recorded area
+ @y: Y position of the recorded area
+ @width: width of the recorded area
+ @height: height of the recorded area
+ @properties: Properties
+ @stream_path: Path to the new stream object
+
+ Record an area of the stage. The coordinates are in stage coordinates.
+ The size of the stream does not necessarily match the size of the
+ recorded area, and will depend on DPI scale of the affected monitors.
+
+ Available @properties include:
+
+ * "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
+ Available since API version 2.
+ * "is-recording" (b): Whether this is a screen recording. May be
+ be used for choosing panel icon.
+ Default: false. Available since API version 4.
+
+ Available cursor mode values:
+
+ 0: hidden - cursor is not included in the stream
+ 1: embedded - cursor is included in the framebuffer
+ 2: metadata - cursor is included as metadata in the PipeWire stream
+ -->
+ <method name="RecordArea">
+ <arg name="x" type="i" direction="in" />
+ <arg name="y" type="i" direction="in" />
+ <arg name="width" type="i" direction="in" />
+ <arg name="height" type="i" direction="in" />
+ <arg name="properties" type="a{sv}" direction="in" />
+ <arg name="stream_path" type="o" direction="out" />
+ </method>
+ </interface>
+
+ <!--
+ org.gnome.Mutter.ScreenCast.Stream:
+ @short_description: Screen cast stream
+ -->
+ <interface name="org.gnome.Mutter.ScreenCast.Stream">
+
+ <!--
+ PipeWireStreamAdded:
+ @short_description: Pipewire stream added
+
+ A signal emitted when PipeWire stream for the screen cast stream has
+ been created. The @node_id corresponds to the PipeWire stream node.
+ -->
+ <signal name="PipeWireStreamAdded">
+ <annotation name="org.gtk.GDBus.C.Name" value="pipewire-stream-added"/>
+ <arg name="node_id" type="u" direction="out" />
+ </signal>
+
+ <!--
+ Parameters:
+ @short_description: Optional stream parameters
+
+ Available parameters include:
+
+ * "position" (ii): Position of the source of the stream in the
+ compositor coordinate space.
+ * "size" (ii): Size of the source of the stream in the compositor
+ coordinate space.
+ -->
+ <property name="Parameters" type="a{sv}" access="read" />
+
+ </interface>
+
+</node>
diff --git a/data/dbus-interfaces/org.gnome.ScreenSaver.xml b/data/dbus-interfaces/org.gnome.ScreenSaver.xml
new file mode 100644
index 0000000..5a2ca98
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.ScreenSaver.xml
@@ -0,0 +1,18 @@
+<node>
+ <interface name="org.gnome.ScreenSaver">
+ <method name="Lock"/>
+ <method name="GetActive">
+ <arg type="b" direction="out" name="active"/>
+ </method>
+ <method name="SetActive">
+ <arg type="b" direction="in" name="value"/>
+ </method>
+ <method name="GetActiveTime">
+ <arg type="u" direction="out" name="value"/>
+ </method>
+ <signal name="ActiveChanged">
+ <arg name="new_value" type="b"/>
+ </signal>
+ <signal name="WakeUpScreen"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.SessionManager.EndSessionDialog.xml b/data/dbus-interfaces/org.gnome.SessionManager.EndSessionDialog.xml
new file mode 100644
index 0000000..3a57aa4
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.SessionManager.EndSessionDialog.xml
@@ -0,0 +1,16 @@
+<node>
+ <interface name="org.gnome.SessionManager.EndSessionDialog">
+ <method name="Open">
+ <arg type="u" direction="in"/>
+ <arg type="u" direction="in"/>
+ <arg type="u" direction="in"/>
+ <arg type="ao" direction="in"/>
+ </method>
+ <method name="Close"/>
+ <signal name="ConfirmedLogout"/>
+ <signal name="ConfirmedReboot"/>
+ <signal name="ConfirmedShutdown"/>
+ <signal name="Canceled"/>
+ <signal name="Closed"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.SessionManager.Inhibitor.xml b/data/dbus-interfaces/org.gnome.SessionManager.Inhibitor.xml
new file mode 100644
index 0000000..c745f81
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.SessionManager.Inhibitor.xml
@@ -0,0 +1,10 @@
+<node>
+ <interface name="org.gnome.SessionManager.Inhibitor">
+ <method name="GetAppId">
+ <arg type="s" direction="out"/>
+ </method>
+ <method name="GetReason">
+ <arg type="s" direction="out"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.SessionManager.Presence.xml b/data/dbus-interfaces/org.gnome.SessionManager.Presence.xml
new file mode 100644
index 0000000..78bc604
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.SessionManager.Presence.xml
@@ -0,0 +1,11 @@
+<node>
+ <interface name="org.gnome.SessionManager.Presence">
+ <method name="SetStatus">
+ <arg type="u" direction="in"/>
+ </method>
+ <property name="status" type="u" access="readwrite"/>
+ <signal name="StatusChanged">
+ <arg type="u" direction="out"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.SessionManager.xml b/data/dbus-interfaces/org.gnome.SessionManager.xml
new file mode 100644
index 0000000..c81c90f
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.SessionManager.xml
@@ -0,0 +1,23 @@
+<node>
+ <interface name="org.gnome.SessionManager">
+ <method name="Logout">
+ <arg type="u" direction="in"/>
+ </method>
+ <method name="Shutdown"/>
+ <method name="Reboot"/>
+ <method name="CanShutdown">
+ <arg type="b" direction="out"/>
+ </method>
+ <method name="IsInhibited">
+ <arg type="u" direction="in"/>
+ <arg type="b" direction="out"/>
+ </method>
+ <property name="SessionIsActive" type="b" access="read"/>
+ <signal name="InhibitorAdded">
+ <arg type="o" direction="out"/>
+ </signal>
+ <signal name="InhibitorRemoved">
+ <arg type="o" direction="out"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Color.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Color.xml
new file mode 100644
index 0000000..1528f90
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.SettingsDaemon.Color.xml
@@ -0,0 +1,6 @@
+<node>
+ <interface name="org.gnome.SettingsDaemon.Color">
+ <property name="DisabledUntilTomorrow" type="b" access="readwrite"/>
+ <property name="NightLightActive" type="b" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml
new file mode 100644
index 0000000..05e4b8d
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml
@@ -0,0 +1,5 @@
+<node>
+ <interface name="org.gnome.SettingsDaemon.Power.Screen">
+ <property name="Brightness" type="i" access="readwrite"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Rfkill.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Rfkill.xml
new file mode 100644
index 0000000..628b17f
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.SettingsDaemon.Rfkill.xml
@@ -0,0 +1,10 @@
+<node>
+ <interface name="org.gnome.SettingsDaemon.Rfkill">
+ <property name="AirplaneMode" type="b" access="readwrite"/>
+ <property name="HardwareAirplaneMode" type="b" access="read"/>
+ <property name="BluetoothAirplaneMode" type="b" access="readwrite"/>
+ <property name="BluetoothHasAirplaneMode" type="b" access="read"/>
+ <property name="BluetoothHardwareAirplaneMode" type="b" access="readwrite"/>
+ <property name="ShouldShowAirplaneMode" type="b" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Wacom.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Wacom.xml
new file mode 100644
index 0000000..1370214
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.SettingsDaemon.Wacom.xml
@@ -0,0 +1,13 @@
+<node>
+<interface name="org.gnome.SettingsDaemon.Wacom">
+ <method name="SetGroupModeLED">
+ <arg name="device_path" direction="in" type="s"/>
+ <arg name="group" direction="in" type="u"/>
+ <arg name="mode" direction="in" type="u"/>
+ </method>
+ <method name="SetOLEDLabels">
+ <arg name="device_path" direction="in" type="s"/>
+ <arg name="labels" direction="in" type="as"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.AudioDeviceSelection.xml b/data/dbus-interfaces/org.gnome.Shell.AudioDeviceSelection.xml
new file mode 100644
index 0000000..28cc6da
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.AudioDeviceSelection.xml
@@ -0,0 +1,12 @@
+<node>
+ <interface name="org.gnome.Shell.AudioDeviceSelection">
+ <method name="Open">
+ <arg name="devices" direction="in" type="as"/>
+ </method>
+ <method name="Close">
+ </method>
+ <signal name="DeviceSelected">
+ <arg name="device" type="s"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.CalendarServer.xml b/data/dbus-interfaces/org.gnome.Shell.CalendarServer.xml
new file mode 100644
index 0000000..51b71ef
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.CalendarServer.xml
@@ -0,0 +1,19 @@
+<node>
+ <interface name="org.gnome.Shell.CalendarServer">
+ <method name="SetTimeRange">
+ <arg type="x" name="since" direction="in"/>
+ <arg type="x" name="until" direction="in"/>
+ <arg type="b" name="force_reload" direction="in"/>
+ </method>
+ <signal name="EventsAddedOrUpdated">
+ <arg type="a(ssbxxa{sv})" name="events" direction="out"/>
+ </signal>
+ <signal name="EventsRemoved">
+ <arg type="as" name="ids" direction="out"/>
+ </signal>
+ <signal name="ClientDisappeared">
+ <arg type="s" name="source_uid" direction="out"/>
+ </signal>
+ <property name="HasCalendars" type="b" access="read" />
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.ClocksIntegration.xml b/data/dbus-interfaces/org.gnome.Shell.ClocksIntegration.xml
new file mode 100644
index 0000000..0cbb132
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.ClocksIntegration.xml
@@ -0,0 +1,15 @@
+<node>
+
+ <!--
+ org.gnome.Shell.ClocksIntegration:
+ @short_description: Clocks integration interface
+
+ The interface used for exporting location settings to GNOME Shell's
+ world clocks integration.
+ -->
+ <interface name="org.gnome.Shell.ClocksIntegration">
+
+ <property name="Locations" type="av" access="read"/>
+
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.Extensions.xml b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml
new file mode 100644
index 0000000..ab80c10
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml
@@ -0,0 +1,267 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Shell.Extensions:
+ @short_description: Extensions interface
+
+ The interface used to query and manage extensions.
+ -->
+ <interface name="org.gnome.Shell.Extensions">
+
+ <!--
+ ListExtensions:
+ @extensions: A dictionary of extension infos
+
+ Get a list of installed extensions. The returned @extensions
+ dictionary maps extension UUIDs to info vardicts. See
+ GetExtensionInfo() for documentation on possible keys.
+ -->
+ <method name="ListExtensions">
+ <arg type="a{sa{sv}}" direction="out" name="extensions"/>
+ </method>
+
+ <!--
+ GetExtensionInfo:
+ @uuid: The UUID of the extension
+ @info: The returned extension info
+
+ The information returned in the @info vardict depends on the
+ metadata the extension provides, however it is guaranteed to
+ contain the following keys:
+
+ <variablelist>
+ <varlistentry>
+ <term>uuid s</term>
+ <listitem><para>The UUID of the extension</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>name s</term>
+ <listitem><para>The name of the extension</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>description s</term>
+ <listitem><para>
+ A short summary that describes what the extension does
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>shell-version as</term>
+ <listitem><para>An array of support shell versions</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>type d</term>
+ <listitem><para>
+ The type of extension:
+ <simplelist>
+ <member>1: SYSTEM</member>
+ <member>2: PER_USER</member>
+ </simplelist>
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>state d</term>
+ <listitem><para>
+ The state the extension is in:
+ <simplelist>
+ <member>1: ENABLED</member>
+ <member>2: DISABLED</member>
+ <member>3: ERROR</member>
+ <member>4: OUT_OF_DATE</member>
+ <member>5: DOWNLOADING</member>
+ <member>6: INITIALIZED</member>
+ <member>99: UNINSTALLED</member>
+ </simplelist>
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>path s</term>
+ <listitem><para>The extension directory</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>error s</term>
+ <listitem><para>The most recent error caught in init(), enable() or disable()</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>hasPrefs b</term>
+ <listitem><para>Whether the extension includes preference UI</para></listitem>
+ </varlistentry>
+ </variablelist>
+
+ By convention, many extensions will also include the following keys:
+ <variablelist>
+ <varlistentry>
+ <term>version d</term>
+ <listitem><para>The extension version</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>url s</term>
+ <listitem><para>The URL to the extension homepage or repository</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>settings-schema s</term>
+ <listitem><para>The ID of a bundled GSettings schema</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>gettext-domain s</term>
+ <listitem><para>The domain used for translations</para></listitem>
+ </varlistentry>
+ </variablelist>
+ -->
+ <method name="GetExtensionInfo">
+ <arg type="s" direction="in" name="uuid"/>
+ <arg type="a{sv}" direction="out" name="info"/>
+ </method>
+
+ <!--
+ GetExtensionErrors:
+ @uuid: The UUID of the extension
+ @errors: The returned errors
+
+ Get the list of errors that caused the extension
+ to be in ERROR state.
+ -->
+ <method name="GetExtensionErrors">
+ <arg type="s" direction="in" name="uuid"/>
+ <arg type="as" direction="out" name="errors"/>
+ </method>
+
+ <!--
+ InstallRemoteExtension:
+ @uuid: The UUID of the extension
+ @result: The result of the operation
+
+ Download and install an extension.
+ -->
+ <method name="InstallRemoteExtension">
+ <arg type="s" direction="in" name="uuid"/>
+ <arg type="s" direction="out" name="result"/>
+ </method>
+
+ <!--
+ UninstallExtension:
+ @uuid: The UUID of the extension
+ @success: Whether the operation was successful
+
+ Uninstall an extension.
+ -->
+ <method name="UninstallExtension">
+ <arg type="s" direction="in" name="uuid"/>
+ <arg type="b" direction="out" name="success"/>
+ </method>
+
+ <!--
+ ReloadExtension:
+ @uuid: The UUID of the extension
+
+ Reload an extension.
+ -->
+ <method name="ReloadExtension">
+ <arg type="s" direction="in" name="uuid"/>
+ </method>
+
+ <!--
+ EnableExtension:
+ @uuid: The UUID of the extension
+ @success: Whether the operation was successful
+
+ Enable an extension.
+ -->
+ <method name="EnableExtension"> \
+ <arg type="s" direction="in" name="uuid"/> \
+ <arg type="b" direction="out" name="success"/> \
+ </method> \
+
+ <!--
+ DisableExtension:
+ @uuid: The UUID of the extension
+ @success: Whether the operation was successful
+
+ Disable an extension.
+ -->
+ <method name="DisableExtension"> \
+ <arg type="s" direction="in" name="uuid"/> \
+ <arg type="b" direction="out" name="success"/> \
+ </method> \
+
+ <!--
+ LaunchExtensionPrefs:
+ Deprecated for OpenExtensionPrefs
+ -->
+ <method name="LaunchExtensionPrefs">
+ <arg type="s" direction="in" name="uuid"/>
+ </method>
+
+ <!--
+ OpenExtensionPrefs:
+ @uuid: The UUID of the extension
+ @parent_window: Identifier for the application window
+ @options: Vardict with further options
+
+ Opens the prefs dialog of extension @uuid.
+
+ The following @options are recognized:
+
+ <variablelist>
+ <varlistentry>
+ <term>modal b</term>
+ <listitem>
+ <para>Whether the prefs window should be modal, default: false</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ -->
+ <method name="OpenExtensionPrefs">
+ <arg type="s" direction="in" name="uuid"/>
+ <arg type="s" direction="in" name="parent_window"/>
+ <arg type="a{sv}" direction="in" name="options"/>
+ </method>
+
+ <!--
+ CheckForUpdates:
+ Update all extensions for which updates are available
+ -->
+ <method name="CheckForUpdates"/>
+
+ <signal name="ExtensionStateChanged">
+ <arg type="s" name="uuid"/>
+ <arg type="a{sv}" name="state"/>
+ </signal>
+
+ <!--
+ ExtensionStatusChanged:
+ Deprecated for ExtensionStateChanged
+ -->
+ <signal name="ExtensionStatusChanged">
+ <arg type="s" name="uuid"/>
+ <arg type="i" name="state"/>
+ <arg type="s" name="error"/>
+ </signal>
+
+ <!--
+ ShellVersion:
+ The GNOME Shell version
+ -->
+ <property name="ShellVersion" type="s" access="read"/>
+
+ <!--
+ UserExtensionsEnabled:
+ Whether user extensions are enabled
+ -->
+ <property name="UserExtensionsEnabled" type="b" access="readwrite"/>
+
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.HotplugSniffer.xml b/data/dbus-interfaces/org.gnome.Shell.HotplugSniffer.xml
new file mode 100644
index 0000000..b4373cc
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.HotplugSniffer.xml
@@ -0,0 +1,8 @@
+<node>
+ <interface name="org.gnome.Shell.HotplugSniffer">
+ <method name="SniffURI">
+ <arg type="s" direction="in"/>
+ <arg type="as" direction="out"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.Introspect.xml b/data/dbus-interfaces/org.gnome.Shell.Introspect.xml
new file mode 100644
index 0000000..47fd7ef
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.Introspect.xml
@@ -0,0 +1,83 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Shell.Introspect:
+ @short_description: Introspection interface
+
+ The interface used to introspect the state of Shell, such as running
+ applications, currently active application, etc.
+ -->
+ <interface name="org.gnome.Shell.Introspect">
+
+ <!--
+ RunningApplicationsChanged:
+ @short_description: Notifies when the running applications changes
+ -->
+ <signal name="RunningApplicationsChanged" />
+
+ <!--
+ GetRunningApplications:
+ @short_description: Retrieves the description of all running applications
+
+ Each application is associated by an application ID. The details of
+ each application consists of a varlist of keys and values. Available
+ keys are listed below.
+
+ 'active-on-seats' - (as) list of seats the application is active on
+ (a seat only has at most one active
+ application)
+ -->
+ <method name="GetRunningApplications">
+ <arg name="apps" direction="out" type="a{sa{sv}}" />
+ </method>
+
+ <!--
+ GetWindows:
+ @short_description: Retrieves the current list of windows and their properties
+
+ A window is exposed as:
+ * t ID: unique ID of the window
+ * a{sv} properties: high-level properties
+
+ Known properties:
+
+ - "title" (s): (readonly) title of the window
+ - "app-id" (s): (readonly) application ID of the window
+ - "wm-class" (s): (readonly) class of the window
+ - "client-type" (u): (readonly) 0 for Wayland, 1 for X11
+ - "is-hidden" (b): (readonly) if the window is currently hidden
+ - "has-focus" (b): (readonly) if the window currently have
+ keyboard focus
+ - "width" (u): (readonly) width of the window
+ - "height" (u): (readonly) height of the window
+ -->
+ <method name="GetWindows">
+ <arg name="windows" direction="out" type="a{ta{sv}}" />
+ </method>
+
+ <!--
+ AnimationsEnabled:
+ @short_description: Whether the shell animations are enabled
+
+ By default determined by the org.gnome.desktop.interface enable-animations
+ gsetting, but may be overridden, e.g. if there is an active screen cast or
+ remote desktop session that asked for animations to be disabled.
+
+ Since: 2
+ -->
+ <property name="AnimationsEnabled" type="b" access="read"/>
+
+ <!--
+ ScreenSize:
+ @short_description: The size of the screen
+
+ Since: 3
+ -->
+ <property name="ScreenSize" type="(ii)" access="read"/>
+
+ <property name="version" type="u" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.PadOsd.xml b/data/dbus-interfaces/org.gnome.Shell.PadOsd.xml
new file mode 100644
index 0000000..765973c
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.PadOsd.xml
@@ -0,0 +1,28 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Shell.PadOSD:
+ @short_description: Pad OSD interface
+
+ The interface used to show button map OSD on pad devices.
+ -->
+ <interface name='org.gnome.Shell.Wacom.PadOsd'>
+
+ <!--
+ Show:
+ @device_node: device node file, usually in /dev/input/...
+ @edition_mode: whether toggling edition mode on when showing
+
+ Shows the pad button map OSD for the requested device, the OSD
+ will be shown according the current device settings (output
+ mapping, left handed mode, ...)
+ -->
+ <method name='Show'>
+ <arg name='device_node' direction='in' type='o'/>
+ <arg name='edition_mode' direction='in' type='b'/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.PerfHelper.xml b/data/dbus-interfaces/org.gnome.Shell.PerfHelper.xml
new file mode 100644
index 0000000..98fea27
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.PerfHelper.xml
@@ -0,0 +1,13 @@
+<node>
+ <interface name="org.gnome.Shell.PerfHelper">
+ <method name="CreateWindow">
+ <arg type="i" direction="in"/>
+ <arg type="i" direction="in"/>
+ <arg type="b" direction="in"/>
+ <arg type="b" direction="in"/>
+ <arg type="b" direction="in"/>
+ </method>
+ <method name="WaitWindows"/>
+ <method name="DestroyWindows"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.PortalHelper.xml b/data/dbus-interfaces/org.gnome.Shell.PortalHelper.xml
new file mode 100644
index 0000000..8c6a13e
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.PortalHelper.xml
@@ -0,0 +1,19 @@
+<node>
+ <interface name="org.gnome.Shell.PortalHelper">
+ <method name="Authenticate">
+ <arg name="connection" type="o" direction="in"/>
+ <arg name="url" type="s" direction="in"/>
+ <arg name="timestamp" type="u" direction="in"/>
+ </method>
+ <method name="Close">
+ <arg name="connection" type="o" direction="in"/>
+ </method>
+ <method name="Refresh">
+ <arg name="connection" type="o" direction="in"/>
+ </method>
+ <signal name="Done">
+ <arg type="o" name="connection"/>
+ <arg type="u" name="result"/>
+ </signal>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.Screencast.xml b/data/dbus-interfaces/org.gnome.Shell.Screencast.xml
new file mode 100644
index 0000000..f188cf7
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.Screencast.xml
@@ -0,0 +1,95 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Shell.Screencast:
+ @short_description: Screencast interface
+
+ The interface used to record screen contents.
+ -->
+ <interface name="org.gnome.Shell.Screencast">
+
+ <!--
+ Screencast:
+ @file_template: the template for the filename to use
+ @options: a dictionary of optional parameters
+ @success: whether the screencast was started successfully
+ @filename_used: the file where the screencast is being saved
+
+ Records a screencast of the whole screen and saves it
+ (by default) as webm video under a filename derived from
+ @file_template. The template is either a relative or absolute
+ filename which may contain some escape sequences - %d and %t
+ will be replaced by the start date and time of the recording.
+ If a relative name is used, the screencast will be saved in the
+ $XDG_VIDEOS_DIR if it exists, or the home directory otherwise.
+ The actual filename of the saved video is returned in @filename_used.
+ The set of optional parameters in @options currently consists of:
+ 'draw-cursor'(b): whether the cursor should be included in the
+ recording (true)
+ 'framerate'(i): the number of frames per second that should be
+ recorded if possible (30)
+ 'pipeline'(s): the GStreamer pipeline used to encode recordings
+ in gst-launch format; if not specified, the
+ recorder will produce vp8 (webm) video (unset)
+ -->
+ <method name="Screencast">
+ <arg type="s" direction="in" name="file_template"/>
+ <arg type="a{sv}" direction="in" name="options"/>
+ <arg type="b" direction="out" name="success"/>
+ <arg type="s" direction="out" name="filename_used"/>
+ </method>
+
+ <!--
+ ScreencastArea:
+ @x: the X coordinate of the area to capture
+ @y: the Y coordinate of the area to capture
+ @width: the width of the area to capture
+ @height: the height of the area to capture
+ @file_template: the template for the filename to use
+ @options: a dictionary of optional parameters
+ @success: whether the screencast was started successfully
+ @filename_used: the file where the screencast is being saved
+
+ Records a screencast of the passed in area and saves it
+ (by default) as webm video under a filename derived from
+ @file_template. The template is either a relative or absolute
+ filename which may contain some escape sequences - %d and %t
+ will be replaced by the start date and time of the recording.
+ If a relative name is used, the screencast will be saved in the
+ $XDG_VIDEOS_DIR if it exists, or the home directory otherwise.
+ The actual filename of the saved video is returned in @filename_used.
+ The set of optional parameters in @options currently consists of:
+ 'draw-cursor'(b): whether the cursor should be included in the
+ recording (true)
+ 'framerate'(i): the number of frames per second that should be
+ recorded if possible (30)
+ 'pipeline'(s): the GStreamer pipeline used to encode recordings
+ in gst-launch format; if not specified, the
+ recorder will produce vp8 (webm) video (unset)
+ -->
+ <method name="ScreencastArea">
+ <arg type="i" direction="in" name="x"/>
+ <arg type="i" direction="in" name="y"/>
+ <arg type="i" direction="in" name="width"/>
+ <arg type="i" direction="in" name="height"/>
+ <arg type="s" direction="in" name="file_template"/>
+ <arg type="a{sv}" direction="in" name="options"/>
+ <arg type="b" direction="out" name="success"/>
+ <arg type="s" direction="out" name="filename_used"/>
+ </method>
+
+ <!--
+ StopScreencast:
+ @success: whether stopping the recording was successful
+
+ Stop the recording started by either Screencast or ScreencastArea.
+ -->
+ <method name="StopScreencast">
+ <arg type="b" direction="out" name="success"/>
+ </method>
+
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.Screenshot.xml b/data/dbus-interfaces/org.gnome.Shell.Screenshot.xml
new file mode 100644
index 0000000..528b01e
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.Screenshot.xml
@@ -0,0 +1,145 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Shell.Screenshot:
+ @short_description: Screenshot interface
+
+ The interface used to capture pictures of the screen contents.
+ -->
+ <interface name="org.gnome.Shell.Screenshot">
+
+ <!--
+ Screenshot:
+ @filename: The filename for the screenshot
+ @include_cursor: Whether to include the cursor image or not
+ @flash: Whether to flash the screen or not
+ @success: whether the screenshot was captured
+ @filename_used: the file where the screenshot was saved
+
+ Takes a screenshot of the whole screen and saves it
+ in @filename as png image, it returns a boolean
+ indicating whether the operation was successful or not.
+ @filename can either be an absolute path or a basename, in
+ which case the screenshot will be saved in the $XDG_PICTURES_DIR
+ or the home directory if it doesn't exist. The filename used
+ to save the screenshot will be returned in @filename_used.
+ -->
+ <method name="Screenshot">
+ <arg type="b" direction="in" name="include_cursor"/>
+ <arg type="b" direction="in" name="flash"/>
+ <arg type="s" direction="in" name="filename"/>
+ <arg type="b" direction="out" name="success"/>
+ <arg type="s" direction="out" name="filename_used"/>
+ </method>
+
+ <!--
+ ScreenshotWindow:
+ @include_frame: Whether to include the frame or not
+ @include_cursor: Whether to include the cursor image or not
+ @flash: Whether to flash the window area or not
+ @filename: The filename for the screenshot
+ @success: whether the screenshot was captured
+ @filename_used: the file where the screenshot was saved
+
+ Takes a screenshot of the focused window (optionally omitting the frame)
+ and saves it in @filename as png image, it returns a boolean
+ indicating whether the operation was successful or not.
+ @filename can either be an absolute path or a basename, in
+ which case the screenshot will be saved in the $XDG_PICTURES_DIR
+ or the home directory if it doesn't exist. The filename used
+ to save the screenshot will be returned in @filename_used.
+ -->
+ <method name="ScreenshotWindow">
+ <arg type="b" direction="in" name="include_frame"/>
+ <arg type="b" direction="in" name="include_cursor"/>
+ <arg type="b" direction="in" name="flash"/>
+ <arg type="s" direction="in" name="filename"/>
+ <arg type="b" direction="out" name="success"/>
+ <arg type="s" direction="out" name="filename_used"/>
+ </method>
+
+ <!--
+ ScreenshotArea:
+ @x: the X coordinate of the area to capture
+ @y: the Y coordinate of the area to capture
+ @width: the width of the area to capture
+ @height: the height of the area to capture
+ @flash: whether to flash the area or not
+ @filename: the filename for the screenshot
+ @success: whether the screenshot was captured
+ @filename_used: the file where the screenshot was saved
+
+ Takes a screenshot of the passed in area and saves it
+ in @filename as png image, it returns a boolean
+ indicating whether the operation was successful or not.
+ @filename can either be an absolute path or a basename, in
+ which case the screenshot will be saved in the $XDG_PICTURES_DIR
+ or the home directory if it doesn't exist. The filename used
+ to save the screenshot will be returned in @filename_used.
+ -->
+ <method name="ScreenshotArea">
+ <arg type="i" direction="in" name="x"/>
+ <arg type="i" direction="in" name="y"/>
+ <arg type="i" direction="in" name="width"/>
+ <arg type="i" direction="in" name="height"/>
+ <arg type="b" direction="in" name="flash"/>
+ <arg type="s" direction="in" name="filename"/>
+ <arg type="b" direction="out" name="success"/>
+ <arg type="s" direction="out" name="filename_used"/>
+ </method>
+
+ <!--
+ PickColor:
+
+ Picks a color and returns the result.
+
+ The @result vardict contains:
+ <variablelist>
+ <varlistentry>
+ <term>color (ddd)</term>
+ <listitem><para>The color, RGB values in the range [0,1].</para></listitem>
+ </varlistentry>
+ </variablelist>
+ -->
+ <method name="PickColor">
+ <arg type="a{sv}" direction="out" name="result"/>
+ </method>
+
+ <!--
+ FlashArea:
+ @x: the X coordinate of the area to flash
+ @y: the Y coordinate of the area to flash
+ @width: the width of the area to flash
+ @height: the height of the area to flash
+
+ Renders a flash spot effect in the specified rectangle of the screen.
+ -->
+ <method name="FlashArea">
+ <arg type="i" direction="in" name="x"/>
+ <arg type="i" direction="in" name="y"/>
+ <arg type="i" direction="in" name="width"/>
+ <arg type="i" direction="in" name="height"/>
+ </method>
+
+ <!--
+ SelectArea:
+ @x: the X coordinate of the selected area
+ @y: the Y coordinate of the selected area
+ @width: the width of the selected area
+ @height: the height of the selected area
+
+ Interactively allows the user to select a rectangular area of
+ the screen, and returns its coordinates.
+ -->
+ <method name="SelectArea">
+ <arg type="i" direction="out" name="x"/>
+ <arg type="i" direction="out" name="y"/>
+ <arg type="i" direction="out" name="width"/>
+ <arg type="i" direction="out" name="height"/>
+ </method>
+
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.Wacom.PadOsd.xml b/data/dbus-interfaces/org.gnome.Shell.Wacom.PadOsd.xml
new file mode 100644
index 0000000..5e046c7
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.Wacom.PadOsd.xml
@@ -0,0 +1,8 @@
+<node>
+ <interface name="org.gnome.Shell.Wacom.PadOsd">
+ <method name="Show">
+ <arg name="device_node" direction="in" type="o"/>
+ <arg name="edition_mode" direction="in" type="b"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.WeatherIntegration.xml b/data/dbus-interfaces/org.gnome.Shell.WeatherIntegration.xml
new file mode 100644
index 0000000..1e89bbe
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.WeatherIntegration.xml
@@ -0,0 +1,16 @@
+<node>
+
+ <!--
+ org.gnome.Shell.WeatherIntegration:
+ @short_description: Weather integration interface
+
+ The interface used for exporting location settings to GNOME Shell's
+ weather integration.
+ -->
+ <interface name="org.gnome.Shell.WeatherIntegration">
+
+ <property name="AutomaticLocation" type="b" access="read"/>
+ <property name="Locations" type="av" access="read"/>
+
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.Shell.xml b/data/dbus-interfaces/org.gnome.Shell.xml
new file mode 100644
index 0000000..38154cb
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.xml
@@ -0,0 +1,46 @@
+<node>
+ <interface name="org.gnome.Shell">
+ <method name="Eval">
+ <arg type="s" direction="in" name="script"/>
+ <arg type="b" direction="out" name="success"/>
+ <arg type="s" direction="out" name="result"/>
+ </method>
+ <method name="FocusSearch"/>
+ <method name="ShowOSD">
+ <arg type="a{sv}" direction="in" name="params"/>
+ </method>
+ <method name="ShowMonitorLabels">
+ <arg type="a{sv}" direction="in" name="params"/>
+ </method>
+ <method name="HideMonitorLabels"/>
+ <method name="FocusApp">
+ <arg type="s" direction="in" name="id"/>
+ </method>
+ <method name="ShowApplications"/>
+ <method name="GrabAccelerator">
+ <arg type="s" direction="in" name="accelerator"/>
+ <arg type="u" direction="in" name="modeFlags"/>
+ <arg type="u" direction="in" name="grabFlags"/>
+ <arg type="u" direction="out" name="action"/>
+ </method>
+ <method name="GrabAccelerators">
+ <arg type="a(suu)" direction="in" name="accelerators"/>
+ <arg type="au" direction="out" name="actions"/>
+ </method>
+ <method name="UngrabAccelerator">
+ <arg type="u" direction="in" name="action"/>
+ <arg type="b" direction="out" name="success"/>
+ </method>
+ <method name="UngrabAccelerators">
+ <arg type="au" direction="in" name="action"/>
+ <arg type="b" direction="out" name="success"/>
+ </method>
+ <signal name="AcceleratorActivated">
+ <arg name="action" type="u"/>
+ <arg name="parameters" type="a{sv}"/>
+ </signal>
+ <property name="Mode" type="s" access="read"/>
+ <property name="OverviewActive" type="b" access="readwrite"/>
+ <property name="ShellVersion" type="s" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml b/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml
new file mode 100644
index 0000000..78ad305
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml
@@ -0,0 +1,73 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Shell.SearchProvider:
+ @short_description: Search provider interface
+
+ The interface used for integrating into GNOME Shell's search
+ interface. This interface is deprecated, and org.gnome.Shell.SearchProvider2 should be used instead.
+ -->
+ <interface name="org.gnome.Shell.SearchProvider">
+
+ <!--
+ GetInitialResultSet:
+ @terms: Array of search terms, which the provider should treat as logical AND.
+ @results: An array of result identifier strings representing items which match the given search terms. Identifiers must be unique within the provider's domain, but other than that may be chosen freely by the provider.
+
+ Called when the user first begins a search.
+ -->
+ <method name="GetInitialResultSet">
+ <arg type="as" name="terms" direction="in" />
+ <arg type="as" name="results" direction="out" />
+ </method>
+
+ <!--
+ GetSubsearchResultSet:
+ @previous_results: Array of results previously returned by GetInitialResultSet().
+ @terms: Array of updated search terms, which the provider should treat as logical AND.
+ @results: An array of result identifier strings representing items which match the given search terms. Identifiers must be unique within the provider's domain, but other than that may be chosen freely by the provider.
+
+ Called when a search is performed which is a "subsearch" of
+ the previous search, e.g. the method may return less results, but
+ not more or different results.
+
+ This allows search providers to only search through the previous
+ result set, rather than possibly performing a full re-query.
+ -->
+ <method name="GetSubsearchResultSet">
+ <arg type="as" name="previous_results" direction="in" />
+ <arg type="as" name="terms" direction="in" />
+ <arg type="as" name="results" direction="out" />
+ </method>
+
+ <!--
+ GetResultMetas:
+ @identifiers: An array of result identifiers as returned by GetInitialResultSet() or GetSubsearchResultSet()
+ @metas: A dictionary describing the given search result, containing a human-readable 'name' (string), along with the result identifier this meta is for, 'id' (string). Optionally, either 'gicon' (a serialized GIcon) or 'icon-data' (raw image data as (iiibiiay) - width, height, rowstride, has-alpha, bits per sample, channels, data) can be specified if the result can be better served with a thumbnail of the content (such as with images). A 'description' field (string) may also be specified if more context would help the user find the desired result.
+
+ Return an array of meta data used to display each given result
+ -->
+ <method name="GetResultMetas">
+ <arg type="as" name="identifiers" direction="in" />
+ <arg type="aa{sv}" name="metas" direction="out" />
+ </method>
+
+ <!--
+ ActivateResult:
+ @identifier: A result identifier as returned by GetInitialResultSet() or GetSubsearchResultSet()
+
+ Called when the users chooses a given result. The result should
+ be displayed in the application associated with the corresponding
+ provider.
+
+ This method is deprecated, and providers should implement ActivateResult2()
+ instead.
+ -->
+ <method name="ActivateResult">
+ <arg type="s" name="identifier" direction="in" />
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml b/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml
new file mode 100644
index 0000000..9502340
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml
@@ -0,0 +1,87 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Shell.SearchProvider2:
+ @short_description: Search provider interface
+
+ The interface used for integrating into GNOME Shell's search
+ interface (version 2).
+ -->
+ <interface name="org.gnome.Shell.SearchProvider2">
+
+ <!--
+ GetInitialResultSet:
+ @terms: Array of search terms, which the provider should treat as logical AND.
+ @results: An array of result identifier strings representing items which match the given search terms. Identifiers must be unique within the provider's domain, but other than that may be chosen freely by the provider.
+
+ Called when the user first begins a search.
+ -->
+ <method name="GetInitialResultSet">
+ <arg type="as" name="terms" direction="in" />
+ <arg type="as" name="results" direction="out" />
+ </method>
+
+ <!--
+ GetSubsearchResultSet:
+ @previous_results: Array of results previously returned by GetInitialResultSet().
+ @terms: Array of updated search terms, which the provider should treat as logical AND.
+ @results: An array of result identifier strings representing items which match the given search terms. Identifiers must be unique within the provider's domain, but other than that may be chosen freely by the provider.
+
+ Called when a search is performed which is a "subsearch" of
+ the previous search, e.g. the method may return less results, but
+ not more or different results.
+
+ This allows search providers to only search through the previous
+ result set, rather than possibly performing a full re-query.
+ -->
+ <method name="GetSubsearchResultSet">
+ <arg type="as" name="previous_results" direction="in" />
+ <arg type="as" name="terms" direction="in" />
+ <arg type="as" name="results" direction="out" />
+ </method>
+
+ <!--
+ GetResultMetas:
+ @identifiers: An array of result identifiers as returned by GetInitialResultSet() or GetSubsearchResultSet()
+ @metas: A dictionary describing the given search result, containing a human-readable 'name' (string), along with the result identifier this meta is for, 'id' (string). Optionally, 'icon' (a serialized GIcon as obtained by g_icon_serialize) can be specified if the result can be better served with a thumbnail of the content (such as with images). 'gicon' (a serialized GIcon as obtained by g_icon_to_string) or 'icon-data' (raw image data as (iiibiiay) - width, height, rowstride, has-alpha, bits per sample, channels, data) are deprecated values that can also be used for that purpose. A 'description' field (string) may also be specified if more context would help the user find the desired result.
+
+ Return an array of meta data used to display each given result
+ -->
+ <method name="GetResultMetas">
+ <arg type="as" name="identifiers" direction="in" />
+ <arg type="aa{sv}" name="metas" direction="out" />
+ </method>
+
+ <!--
+ ActivateResult:
+ @identifier: A result identifier as returned by GetInitialResultSet() or GetSubsearchResultSet()
+ @terms: Array of search terms, which the provider should treat as logical AND.
+ @timestamp: A timestamp of the user interaction that triggered this call
+
+ Called when the users chooses a given result. The result should
+ be displayed in the application associated with the corresponding
+ provider. The provided search terms can be used to allow launching a full search in
+ the application.
+ -->
+ <method name="ActivateResult">
+ <arg type="s" name="identifier" direction="in" />
+ <arg type="as" name="terms" direction="in" />
+ <arg type="u" name="timestamp" direction="in" />
+ </method>
+
+ <!--
+ LaunchSearch:
+ @terms: Array of search terms, which the provider should treat as logical AND.
+ @timestamp: A timestamp of the user interaction that triggered this call
+
+ Asks the search provider to launch a full search in the application for the provided terms.
+ -->
+ <method name="LaunchSearch">
+ <arg type="as" name="terms" direction="in" />
+ <arg type="u" name="timestamp" direction="in" />
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.gtk.Notifications.xml b/data/dbus-interfaces/org.gtk.Notifications.xml
new file mode 100644
index 0000000..e2461ff
--- /dev/null
+++ b/data/dbus-interfaces/org.gtk.Notifications.xml
@@ -0,0 +1,13 @@
+<node>
+ <interface name="org.gtk.Notifications">
+ <method name="AddNotification">
+ <arg type="s" direction="in"/>
+ <arg type="s" direction="in"/>
+ <arg type="a{sv}" direction="in"/>
+ </method>
+ <method name="RemoveNotification">
+ <arg type="s" direction="in"/>
+ <arg type="s" direction="in"/>
+ </method>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.mpris.MediaPlayer2.Player.xml b/data/dbus-interfaces/org.mpris.MediaPlayer2.Player.xml
new file mode 100644
index 0000000..550cb4c
--- /dev/null
+++ b/data/dbus-interfaces/org.mpris.MediaPlayer2.Player.xml
@@ -0,0 +1,12 @@
+<node>
+ <interface name="org.mpris.MediaPlayer2.Player">
+ <method name="PlayPause"/>
+ <method name="Next"/>
+ <method name="Previous"/>
+ <property name="CanGoNext" type="b" access="read"/>
+ <property name="CanGoPrevious" type="b" access="read"/>
+ <property name="CanPlay" type="b" access="read"/>
+ <property name="Metadata" type="a{sv}" access="read"/>
+ <property name="PlaybackStatus" type="s" access="read"/>
+ </interface>
+</node>
diff --git a/data/dbus-interfaces/org.mpris.MediaPlayer2.xml b/data/dbus-interfaces/org.mpris.MediaPlayer2.xml
new file mode 100644
index 0000000..5febaf9
--- /dev/null
+++ b/data/dbus-interfaces/org.mpris.MediaPlayer2.xml
@@ -0,0 +1,7 @@
+<node>
+ <interface name="org.mpris.MediaPlayer2">
+ <method name="Raise"/>
+ <property name="CanRaise" type="b" access="read"/>
+ <property name="DesktopEntry" type="s" access="read"/>
+ </interface>
+</node>
diff --git a/data/emoji.json b/data/emoji.json
new file mode 100644
index 0000000..72144df
--- /dev/null
+++ b/data/emoji.json
@@ -0,0 +1,15740 @@
+[
+ {
+ "no": 1,
+ "code": "1F600",
+ "char": "😀",
+ "name": "grinning face"
+ },
+ {
+ "no": 2,
+ "code": "1F601",
+ "char": "😁",
+ "name": "beaming face with smiling eyes"
+ },
+ {
+ "no": 3,
+ "code": "1F602",
+ "char": "😂",
+ "name": "face with tears of joy"
+ },
+ {
+ "no": 4,
+ "code": "1F923",
+ "char": "🤣",
+ "name": "rolling on the floor laughing"
+ },
+ {
+ "no": 5,
+ "code": "1F603",
+ "char": "😃",
+ "name": "grinning face with big eyes"
+ },
+ {
+ "no": 6,
+ "code": "1F604",
+ "char": "😄",
+ "name": "grinning face with smiling eyes"
+ },
+ {
+ "no": 7,
+ "code": "1F605",
+ "char": "😅",
+ "name": "grinning face with sweat"
+ },
+ {
+ "no": 8,
+ "code": "1F606",
+ "char": "😆",
+ "name": "grinning squinting face"
+ },
+ {
+ "no": 9,
+ "code": "1F609",
+ "char": "😉",
+ "name": "winking face"
+ },
+ {
+ "no": 10,
+ "code": "1F60A",
+ "char": "😊",
+ "name": "smiling face with smiling eyes"
+ },
+ {
+ "no": 11,
+ "code": "1F60B",
+ "char": "😋",
+ "name": "face savoring food"
+ },
+ {
+ "no": 12,
+ "code": "1F60E",
+ "char": "😎",
+ "name": "smiling face with sunglasses"
+ },
+ {
+ "no": 13,
+ "code": "1F60D",
+ "char": "😍",
+ "name": "smiling face with heart-eyes"
+ },
+ {
+ "no": 14,
+ "code": "1F618",
+ "char": "😘",
+ "name": "face blowing a kiss"
+ },
+ {
+ "no": 15,
+ "code": "1F617",
+ "char": "😗",
+ "name": "kissing face"
+ },
+ {
+ "no": 16,
+ "code": "1F619",
+ "char": "😙",
+ "name": "kissing face with smiling eyes"
+ },
+ {
+ "no": 17,
+ "code": "1F61A",
+ "char": "😚",
+ "name": "kissing face with closed eyes"
+ },
+ {
+ "no": 18,
+ "code": "263A",
+ "char": "☺",
+ "name": "smiling face"
+ },
+ {
+ "no": 19,
+ "code": "1F642",
+ "char": "🙂",
+ "name": "slightly smiling face"
+ },
+ {
+ "no": 20,
+ "code": "1F917",
+ "char": "🤗",
+ "name": "hugging face"
+ },
+ {
+ "no": 21,
+ "code": "1F929",
+ "char": "🤩",
+ "name": "⊛ star-struck"
+ },
+ {
+ "no": 22,
+ "code": "1F914",
+ "char": "🤔",
+ "name": "thinking face"
+ },
+ {
+ "no": 23,
+ "code": "1F928",
+ "char": "🤨",
+ "name": "⊛ face with raised eyebrow"
+ },
+ {
+ "no": 24,
+ "code": "1F610",
+ "char": "😐",
+ "name": "neutral face"
+ },
+ {
+ "no": 25,
+ "code": "1F611",
+ "char": "😑",
+ "name": "expressionless face"
+ },
+ {
+ "no": 26,
+ "code": "1F636",
+ "char": "😶",
+ "name": "face without mouth"
+ },
+ {
+ "no": 27,
+ "code": "1F644",
+ "char": "🙄",
+ "name": "face with rolling eyes"
+ },
+ {
+ "no": 28,
+ "code": "1F60F",
+ "char": "😏",
+ "name": "smirking face"
+ },
+ {
+ "no": 29,
+ "code": "1F623",
+ "char": "😣",
+ "name": "persevering face"
+ },
+ {
+ "no": 30,
+ "code": "1F625",
+ "char": "😥",
+ "name": "sad but relieved face"
+ },
+ {
+ "no": 31,
+ "code": "1F62E",
+ "char": "😮",
+ "name": "face with open mouth"
+ },
+ {
+ "no": 32,
+ "code": "1F910",
+ "char": "🤐",
+ "name": "zipper-mouth face"
+ },
+ {
+ "no": 33,
+ "code": "1F62F",
+ "char": "😯",
+ "name": "hushed face"
+ },
+ {
+ "no": 34,
+ "code": "1F62A",
+ "char": "😪",
+ "name": "sleepy face"
+ },
+ {
+ "no": 35,
+ "code": "1F62B",
+ "char": "😫",
+ "name": "tired face"
+ },
+ {
+ "no": 36,
+ "code": "1F634",
+ "char": "😴",
+ "name": "sleeping face"
+ },
+ {
+ "no": 37,
+ "code": "1F60C",
+ "char": "😌",
+ "name": "relieved face"
+ },
+ {
+ "no": 38,
+ "code": "1F61B",
+ "char": "😛",
+ "name": "face with tongue"
+ },
+ {
+ "no": 39,
+ "code": "1F61C",
+ "char": "😜",
+ "name": "winking face with tongue"
+ },
+ {
+ "no": 40,
+ "code": "1F61D",
+ "char": "😝",
+ "name": "squinting face with tongue"
+ },
+ {
+ "no": 41,
+ "code": "1F924",
+ "char": "🤤",
+ "name": "drooling face"
+ },
+ {
+ "no": 42,
+ "code": "1F612",
+ "char": "😒",
+ "name": "unamused face"
+ },
+ {
+ "no": 43,
+ "code": "1F613",
+ "char": "😓",
+ "name": "downcast face with sweat"
+ },
+ {
+ "no": 44,
+ "code": "1F614",
+ "char": "😔",
+ "name": "pensive face"
+ },
+ {
+ "no": 45,
+ "code": "1F615",
+ "char": "😕",
+ "name": "confused face"
+ },
+ {
+ "no": 46,
+ "code": "1F643",
+ "char": "🙃",
+ "name": "upside-down face"
+ },
+ {
+ "no": 47,
+ "code": "1F911",
+ "char": "🤑",
+ "name": "money-mouth face"
+ },
+ {
+ "no": 48,
+ "code": "1F632",
+ "char": "😲",
+ "name": "astonished face"
+ },
+ {
+ "no": 49,
+ "code": "2639",
+ "char": "☹",
+ "name": "frowning face"
+ },
+ {
+ "no": 50,
+ "code": "1F641",
+ "char": "🙁",
+ "name": "slightly frowning face"
+ },
+ {
+ "no": 51,
+ "code": "1F616",
+ "char": "😖",
+ "name": "confounded face"
+ },
+ {
+ "no": 52,
+ "code": "1F61E",
+ "char": "😞",
+ "name": "disappointed face"
+ },
+ {
+ "no": 53,
+ "code": "1F61F",
+ "char": "😟",
+ "name": "worried face"
+ },
+ {
+ "no": 54,
+ "code": "1F624",
+ "char": "😤",
+ "name": "face with steam from nose"
+ },
+ {
+ "no": 55,
+ "code": "1F622",
+ "char": "😢",
+ "name": "crying face"
+ },
+ {
+ "no": 56,
+ "code": "1F62D",
+ "char": "😭",
+ "name": "loudly crying face"
+ },
+ {
+ "no": 57,
+ "code": "1F626",
+ "char": "😦",
+ "name": "frowning face with open mouth"
+ },
+ {
+ "no": 58,
+ "code": "1F627",
+ "char": "😧",
+ "name": "anguished face"
+ },
+ {
+ "no": 59,
+ "code": "1F628",
+ "char": "😨",
+ "name": "fearful face"
+ },
+ {
+ "no": 60,
+ "code": "1F629",
+ "char": "😩",
+ "name": "weary face"
+ },
+ {
+ "no": 61,
+ "code": "1F92F",
+ "char": "🤯",
+ "name": "⊛ exploding head"
+ },
+ {
+ "no": 62,
+ "code": "1F62C",
+ "char": "😬",
+ "name": "grimacing face"
+ },
+ {
+ "no": 63,
+ "code": "1F630",
+ "char": "😰",
+ "name": "anxious face with sweat"
+ },
+ {
+ "no": 64,
+ "code": "1F631",
+ "char": "😱",
+ "name": "face screaming in fear"
+ },
+ {
+ "no": 65,
+ "code": "1F633",
+ "char": "😳",
+ "name": "flushed face"
+ },
+ {
+ "no": 66,
+ "code": "1F92A",
+ "char": "🤪",
+ "name": "⊛ crazy face"
+ },
+ {
+ "no": 67,
+ "code": "1F635",
+ "char": "😵",
+ "name": "dizzy face"
+ },
+ {
+ "no": 68,
+ "code": "1F621",
+ "char": "😡",
+ "name": "pouting face"
+ },
+ {
+ "no": 69,
+ "code": "1F620",
+ "char": "😠",
+ "name": "angry face"
+ },
+ {
+ "no": 70,
+ "code": "1F92C",
+ "char": "🤬",
+ "name": "⊛ face with symbols on mouth"
+ },
+ {
+ "no": 71,
+ "code": "1F637",
+ "char": "😷",
+ "name": "face with medical mask"
+ },
+ {
+ "no": 72,
+ "code": "1F912",
+ "char": "🤒",
+ "name": "face with thermometer"
+ },
+ {
+ "no": 73,
+ "code": "1F915",
+ "char": "🤕",
+ "name": "face with head-bandage"
+ },
+ {
+ "no": 74,
+ "code": "1F922",
+ "char": "🤢",
+ "name": "nauseated face"
+ },
+ {
+ "no": 75,
+ "code": "1F92E",
+ "char": "🤮",
+ "name": "⊛ face vomiting"
+ },
+ {
+ "no": 76,
+ "code": "1F927",
+ "char": "🤧",
+ "name": "sneezing face"
+ },
+ {
+ "no": 77,
+ "code": "1F607",
+ "char": "😇",
+ "name": "smiling face with halo"
+ },
+ {
+ "no": 78,
+ "code": "1F920",
+ "char": "🤠",
+ "name": "cowboy hat face"
+ },
+ {
+ "no": 79,
+ "code": "1F921",
+ "char": "🤡",
+ "name": "clown face"
+ },
+ {
+ "no": 80,
+ "code": "1F925",
+ "char": "🤥",
+ "name": "lying face"
+ },
+ {
+ "no": 81,
+ "code": "1F92B",
+ "char": "🤫",
+ "name": "⊛ shushing face"
+ },
+ {
+ "no": 82,
+ "code": "1F92D",
+ "char": "🤭",
+ "name": "⊛ face with hand over mouth"
+ },
+ {
+ "no": 83,
+ "code": "1F9D0",
+ "char": "🧐",
+ "name": "⊛ face with monocle"
+ },
+ {
+ "no": 84,
+ "code": "1F913",
+ "char": "🤓",
+ "name": "nerd face"
+ },
+ {
+ "no": 85,
+ "code": "1F608",
+ "char": "😈",
+ "name": "smiling face with horns"
+ },
+ {
+ "no": 86,
+ "code": "1F47F",
+ "char": "👿",
+ "name": "angry face with horns"
+ },
+ {
+ "no": 87,
+ "code": "1F479",
+ "char": "👹",
+ "name": "ogre"
+ },
+ {
+ "no": 88,
+ "code": "1F47A",
+ "char": "👺",
+ "name": "goblin"
+ },
+ {
+ "no": 89,
+ "code": "1F480",
+ "char": "💀",
+ "name": "skull"
+ },
+ {
+ "no": 90,
+ "code": "2620",
+ "char": "☠",
+ "name": "skull and crossbones"
+ },
+ {
+ "no": 91,
+ "code": "1F47B",
+ "char": "👻",
+ "name": "ghost"
+ },
+ {
+ "no": 92,
+ "code": "1F47D",
+ "char": "👽",
+ "name": "alien"
+ },
+ {
+ "no": 93,
+ "code": "1F47E",
+ "char": "👾",
+ "name": "alien monster"
+ },
+ {
+ "no": 94,
+ "code": "1F916",
+ "char": "🤖",
+ "name": "robot face"
+ },
+ {
+ "no": 95,
+ "code": "1F4A9",
+ "char": "💩",
+ "name": "pile of poo"
+ },
+ {
+ "no": 96,
+ "code": "1F63A",
+ "char": "😺",
+ "name": "grinning cat face"
+ },
+ {
+ "no": 97,
+ "code": "1F638",
+ "char": "😸",
+ "name": "grinning cat face with smiling eyes"
+ },
+ {
+ "no": 98,
+ "code": "1F639",
+ "char": "😹",
+ "name": "cat face with tears of joy"
+ },
+ {
+ "no": 99,
+ "code": "1F63B",
+ "char": "😻",
+ "name": "smiling cat face with heart-eyes"
+ },
+ {
+ "no": 100,
+ "code": "1F63C",
+ "char": "😼",
+ "name": "cat face with wry smile"
+ },
+ {
+ "no": 101,
+ "code": "1F63D",
+ "char": "😽",
+ "name": "kissing cat face"
+ },
+ {
+ "no": 102,
+ "code": "1F640",
+ "char": "🙀",
+ "name": "weary cat face"
+ },
+ {
+ "no": 103,
+ "code": "1F63F",
+ "char": "😿",
+ "name": "crying cat face"
+ },
+ {
+ "no": 104,
+ "code": "1F63E",
+ "char": "😾",
+ "name": "pouting cat face"
+ },
+ {
+ "no": 105,
+ "code": "1F648",
+ "char": "🙈",
+ "name": "see-no-evil monkey"
+ },
+ {
+ "no": 106,
+ "code": "1F649",
+ "char": "🙉",
+ "name": "hear-no-evil monkey"
+ },
+ {
+ "no": 107,
+ "code": "1F64A",
+ "char": "🙊",
+ "name": "speak-no-evil monkey"
+ },
+ {
+ "no": 108,
+ "code": "1F476",
+ "char": "👶",
+ "name": "baby"
+ },
+ {
+ "no": 109,
+ "code": "1F476 1F3FB",
+ "char": "👶🏻",
+ "name": "baby: light skin tone"
+ },
+ {
+ "no": 110,
+ "code": "1F476 1F3FC",
+ "char": "👶🏼",
+ "name": "baby: medium-light skin tone"
+ },
+ {
+ "no": 111,
+ "code": "1F476 1F3FD",
+ "char": "👶🏽",
+ "name": "baby: medium skin tone"
+ },
+ {
+ "no": 112,
+ "code": "1F476 1F3FE",
+ "char": "👶🏾",
+ "name": "baby: medium-dark skin tone"
+ },
+ {
+ "no": 113,
+ "code": "1F476 1F3FF",
+ "char": "👶🏿",
+ "name": "baby: dark skin tone"
+ },
+ {
+ "no": 114,
+ "code": "1F9D2",
+ "char": "🧒",
+ "name": "⊛ child"
+ },
+ {
+ "no": 115,
+ "code": "1F9D2 1F3FB",
+ "char": "🧒🏻",
+ "name": "⊛ child: light skin tone"
+ },
+ {
+ "no": 116,
+ "code": "1F9D2 1F3FC",
+ "char": "🧒🏼",
+ "name": "⊛ child: medium-light skin tone"
+ },
+ {
+ "no": 117,
+ "code": "1F9D2 1F3FD",
+ "char": "🧒🏽",
+ "name": "⊛ child: medium skin tone"
+ },
+ {
+ "no": 118,
+ "code": "1F9D2 1F3FE",
+ "char": "🧒🏾",
+ "name": "⊛ child: medium-dark skin tone"
+ },
+ {
+ "no": 119,
+ "code": "1F9D2 1F3FF",
+ "char": "🧒🏿",
+ "name": "⊛ child: dark skin tone"
+ },
+ {
+ "no": 120,
+ "code": "1F466",
+ "char": "👦",
+ "name": "boy"
+ },
+ {
+ "no": 121,
+ "code": "1F466 1F3FB",
+ "char": "👦🏻",
+ "name": "boy: light skin tone"
+ },
+ {
+ "no": 122,
+ "code": "1F466 1F3FC",
+ "char": "👦🏼",
+ "name": "boy: medium-light skin tone"
+ },
+ {
+ "no": 123,
+ "code": "1F466 1F3FD",
+ "char": "👦🏽",
+ "name": "boy: medium skin tone"
+ },
+ {
+ "no": 124,
+ "code": "1F466 1F3FE",
+ "char": "👦🏾",
+ "name": "boy: medium-dark skin tone"
+ },
+ {
+ "no": 125,
+ "code": "1F466 1F3FF",
+ "char": "👦🏿",
+ "name": "boy: dark skin tone"
+ },
+ {
+ "no": 126,
+ "code": "1F467",
+ "char": "👧",
+ "name": "girl"
+ },
+ {
+ "no": 127,
+ "code": "1F467 1F3FB",
+ "char": "👧🏻",
+ "name": "girl: light skin tone"
+ },
+ {
+ "no": 128,
+ "code": "1F467 1F3FC",
+ "char": "👧🏼",
+ "name": "girl: medium-light skin tone"
+ },
+ {
+ "no": 129,
+ "code": "1F467 1F3FD",
+ "char": "👧🏽",
+ "name": "girl: medium skin tone"
+ },
+ {
+ "no": 130,
+ "code": "1F467 1F3FE",
+ "char": "👧🏾",
+ "name": "girl: medium-dark skin tone"
+ },
+ {
+ "no": 131,
+ "code": "1F467 1F3FF",
+ "char": "👧🏿",
+ "name": "girl: dark skin tone"
+ },
+ {
+ "no": 132,
+ "code": "1F9D1",
+ "char": "🧑",
+ "name": "⊛ adult"
+ },
+ {
+ "no": 133,
+ "code": "1F9D1 1F3FB",
+ "char": "🧑🏻",
+ "name": "⊛ adult: light skin tone"
+ },
+ {
+ "no": 134,
+ "code": "1F9D1 1F3FC",
+ "char": "🧑🏼",
+ "name": "⊛ adult: medium-light skin tone"
+ },
+ {
+ "no": 135,
+ "code": "1F9D1 1F3FD",
+ "char": "🧑🏽",
+ "name": "⊛ adult: medium skin tone"
+ },
+ {
+ "no": 136,
+ "code": "1F9D1 1F3FE",
+ "char": "🧑🏾",
+ "name": "⊛ adult: medium-dark skin tone"
+ },
+ {
+ "no": 137,
+ "code": "1F9D1 1F3FF",
+ "char": "🧑🏿",
+ "name": "⊛ adult: dark skin tone"
+ },
+ {
+ "no": 138,
+ "code": "1F468",
+ "char": "👨",
+ "name": "man"
+ },
+ {
+ "no": 139,
+ "code": "1F468 1F3FB",
+ "char": "👨🏻",
+ "name": "man: light skin tone"
+ },
+ {
+ "no": 140,
+ "code": "1F468 1F3FC",
+ "char": "👨🏼",
+ "name": "man: medium-light skin tone"
+ },
+ {
+ "no": 141,
+ "code": "1F468 1F3FD",
+ "char": "👨🏽",
+ "name": "man: medium skin tone"
+ },
+ {
+ "no": 142,
+ "code": "1F468 1F3FE",
+ "char": "👨🏾",
+ "name": "man: medium-dark skin tone"
+ },
+ {
+ "no": 143,
+ "code": "1F468 1F3FF",
+ "char": "👨🏿",
+ "name": "man: dark skin tone"
+ },
+ {
+ "no": 144,
+ "code": "1F469",
+ "char": "👩",
+ "name": "woman"
+ },
+ {
+ "no": 145,
+ "code": "1F469 1F3FB",
+ "char": "👩🏻",
+ "name": "woman: light skin tone"
+ },
+ {
+ "no": 146,
+ "code": "1F469 1F3FC",
+ "char": "👩🏼",
+ "name": "woman: medium-light skin tone"
+ },
+ {
+ "no": 147,
+ "code": "1F469 1F3FD",
+ "char": "👩🏽",
+ "name": "woman: medium skin tone"
+ },
+ {
+ "no": 148,
+ "code": "1F469 1F3FE",
+ "char": "👩🏾",
+ "name": "woman: medium-dark skin tone"
+ },
+ {
+ "no": 149,
+ "code": "1F469 1F3FF",
+ "char": "👩🏿",
+ "name": "woman: dark skin tone"
+ },
+ {
+ "no": 150,
+ "code": "1F9D3",
+ "char": "🧓",
+ "name": "⊛ older adult"
+ },
+ {
+ "no": 151,
+ "code": "1F9D3 1F3FB",
+ "char": "🧓🏻",
+ "name": "⊛ older adult: light skin tone"
+ },
+ {
+ "no": 152,
+ "code": "1F9D3 1F3FC",
+ "char": "🧓🏼",
+ "name": "⊛ older adult: medium-light skin tone"
+ },
+ {
+ "no": 153,
+ "code": "1F9D3 1F3FD",
+ "char": "🧓🏽",
+ "name": "⊛ older adult: medium skin tone"
+ },
+ {
+ "no": 154,
+ "code": "1F9D3 1F3FE",
+ "char": "🧓🏾",
+ "name": "⊛ older adult: medium-dark skin tone"
+ },
+ {
+ "no": 155,
+ "code": "1F9D3 1F3FF",
+ "char": "🧓🏿",
+ "name": "⊛ older adult: dark skin tone"
+ },
+ {
+ "no": 156,
+ "code": "1F474",
+ "char": "👴",
+ "name": "old man"
+ },
+ {
+ "no": 157,
+ "code": "1F474 1F3FB",
+ "char": "👴🏻",
+ "name": "old man: light skin tone"
+ },
+ {
+ "no": 158,
+ "code": "1F474 1F3FC",
+ "char": "👴🏼",
+ "name": "old man: medium-light skin tone"
+ },
+ {
+ "no": 159,
+ "code": "1F474 1F3FD",
+ "char": "👴🏽",
+ "name": "old man: medium skin tone"
+ },
+ {
+ "no": 160,
+ "code": "1F474 1F3FE",
+ "char": "👴🏾",
+ "name": "old man: medium-dark skin tone"
+ },
+ {
+ "no": 161,
+ "code": "1F474 1F3FF",
+ "char": "👴🏿",
+ "name": "old man: dark skin tone"
+ },
+ {
+ "no": 162,
+ "code": "1F475",
+ "char": "👵",
+ "name": "old woman"
+ },
+ {
+ "no": 163,
+ "code": "1F475 1F3FB",
+ "char": "👵🏻",
+ "name": "old woman: light skin tone"
+ },
+ {
+ "no": 164,
+ "code": "1F475 1F3FC",
+ "char": "👵🏼",
+ "name": "old woman: medium-light skin tone"
+ },
+ {
+ "no": 165,
+ "code": "1F475 1F3FD",
+ "char": "👵🏽",
+ "name": "old woman: medium skin tone"
+ },
+ {
+ "no": 166,
+ "code": "1F475 1F3FE",
+ "char": "👵🏾",
+ "name": "old woman: medium-dark skin tone"
+ },
+ {
+ "no": 167,
+ "code": "1F475 1F3FF",
+ "char": "👵🏿",
+ "name": "old woman: dark skin tone"
+ },
+ {
+ "no": 168,
+ "code": "1F468 200D 2695 FE0F",
+ "char": "👨‍⚕️",
+ "name": "man health worker"
+ },
+ {
+ "no": 169,
+ "code": "1F468 1F3FB 200D 2695 FE0F",
+ "char": "👨🏻‍⚕️",
+ "name": "man health worker: light skin tone"
+ },
+ {
+ "no": 170,
+ "code": "1F468 1F3FC 200D 2695 FE0F",
+ "char": "👨🏼‍⚕️",
+ "name": "man health worker: medium-light skin tone"
+ },
+ {
+ "no": 171,
+ "code": "1F468 1F3FD 200D 2695 FE0F",
+ "char": "👨🏽‍⚕️",
+ "name": "man health worker: medium skin tone"
+ },
+ {
+ "no": 172,
+ "code": "1F468 1F3FE 200D 2695 FE0F",
+ "char": "👨🏾‍⚕️",
+ "name": "man health worker: medium-dark skin tone"
+ },
+ {
+ "no": 173,
+ "code": "1F468 1F3FF 200D 2695 FE0F",
+ "char": "👨🏿‍⚕️",
+ "name": "man health worker: dark skin tone"
+ },
+ {
+ "no": 174,
+ "code": "1F469 200D 2695 FE0F",
+ "char": "👩‍⚕️",
+ "name": "woman health worker"
+ },
+ {
+ "no": 175,
+ "code": "1F469 1F3FB 200D 2695 FE0F",
+ "char": "👩🏻‍⚕️",
+ "name": "woman health worker: light skin tone"
+ },
+ {
+ "no": 176,
+ "code": "1F469 1F3FC 200D 2695 FE0F",
+ "char": "👩🏼‍⚕️",
+ "name": "woman health worker: medium-light skin tone"
+ },
+ {
+ "no": 177,
+ "code": "1F469 1F3FD 200D 2695 FE0F",
+ "char": "👩🏽‍⚕️",
+ "name": "woman health worker: medium skin tone"
+ },
+ {
+ "no": 178,
+ "code": "1F469 1F3FE 200D 2695 FE0F",
+ "char": "👩🏾‍⚕️",
+ "name": "woman health worker: medium-dark skin tone"
+ },
+ {
+ "no": 179,
+ "code": "1F469 1F3FF 200D 2695 FE0F",
+ "char": "👩🏿‍⚕️",
+ "name": "woman health worker: dark skin tone"
+ },
+ {
+ "no": 180,
+ "code": "1F468 200D 1F393",
+ "char": "👨‍🎓",
+ "name": "man student"
+ },
+ {
+ "no": 181,
+ "code": "1F468 1F3FB 200D 1F393",
+ "char": "👨🏻‍🎓",
+ "name": "man student: light skin tone"
+ },
+ {
+ "no": 182,
+ "code": "1F468 1F3FC 200D 1F393",
+ "char": "👨🏼‍🎓",
+ "name": "man student: medium-light skin tone"
+ },
+ {
+ "no": 183,
+ "code": "1F468 1F3FD 200D 1F393",
+ "char": "👨🏽‍🎓",
+ "name": "man student: medium skin tone"
+ },
+ {
+ "no": 184,
+ "code": "1F468 1F3FE 200D 1F393",
+ "char": "👨🏾‍🎓",
+ "name": "man student: medium-dark skin tone"
+ },
+ {
+ "no": 185,
+ "code": "1F468 1F3FF 200D 1F393",
+ "char": "👨🏿‍🎓",
+ "name": "man student: dark skin tone"
+ },
+ {
+ "no": 186,
+ "code": "1F469 200D 1F393",
+ "char": "👩‍🎓",
+ "name": "woman student"
+ },
+ {
+ "no": 187,
+ "code": "1F469 1F3FB 200D 1F393",
+ "char": "👩🏻‍🎓",
+ "name": "woman student: light skin tone"
+ },
+ {
+ "no": 188,
+ "code": "1F469 1F3FC 200D 1F393",
+ "char": "👩🏼‍🎓",
+ "name": "woman student: medium-light skin tone"
+ },
+ {
+ "no": 189,
+ "code": "1F469 1F3FD 200D 1F393",
+ "char": "👩🏽‍🎓",
+ "name": "woman student: medium skin tone"
+ },
+ {
+ "no": 190,
+ "code": "1F469 1F3FE 200D 1F393",
+ "char": "👩🏾‍🎓",
+ "name": "woman student: medium-dark skin tone"
+ },
+ {
+ "no": 191,
+ "code": "1F469 1F3FF 200D 1F393",
+ "char": "👩🏿‍🎓",
+ "name": "woman student: dark skin tone"
+ },
+ {
+ "no": 192,
+ "code": "1F468 200D 1F3EB",
+ "char": "👨‍🏫",
+ "name": "man teacher"
+ },
+ {
+ "no": 193,
+ "code": "1F468 1F3FB 200D 1F3EB",
+ "char": "👨🏻‍🏫",
+ "name": "man teacher: light skin tone"
+ },
+ {
+ "no": 194,
+ "code": "1F468 1F3FC 200D 1F3EB",
+ "char": "👨🏼‍🏫",
+ "name": "man teacher: medium-light skin tone"
+ },
+ {
+ "no": 195,
+ "code": "1F468 1F3FD 200D 1F3EB",
+ "char": "👨🏽‍🏫",
+ "name": "man teacher: medium skin tone"
+ },
+ {
+ "no": 196,
+ "code": "1F468 1F3FE 200D 1F3EB",
+ "char": "👨🏾‍🏫",
+ "name": "man teacher: medium-dark skin tone"
+ },
+ {
+ "no": 197,
+ "code": "1F468 1F3FF 200D 1F3EB",
+ "char": "👨🏿‍🏫",
+ "name": "man teacher: dark skin tone"
+ },
+ {
+ "no": 198,
+ "code": "1F469 200D 1F3EB",
+ "char": "👩‍🏫",
+ "name": "woman teacher"
+ },
+ {
+ "no": 199,
+ "code": "1F469 1F3FB 200D 1F3EB",
+ "char": "👩🏻‍🏫",
+ "name": "woman teacher: light skin tone"
+ },
+ {
+ "no": 200,
+ "code": "1F469 1F3FC 200D 1F3EB",
+ "char": "👩🏼‍🏫",
+ "name": "woman teacher: medium-light skin tone"
+ },
+ {
+ "no": 201,
+ "code": "1F469 1F3FD 200D 1F3EB",
+ "char": "👩🏽‍🏫",
+ "name": "woman teacher: medium skin tone"
+ },
+ {
+ "no": 202,
+ "code": "1F469 1F3FE 200D 1F3EB",
+ "char": "👩🏾‍🏫",
+ "name": "woman teacher: medium-dark skin tone"
+ },
+ {
+ "no": 203,
+ "code": "1F469 1F3FF 200D 1F3EB",
+ "char": "👩🏿‍🏫",
+ "name": "woman teacher: dark skin tone"
+ },
+ {
+ "no": 204,
+ "code": "1F468 200D 2696 FE0F",
+ "char": "👨‍⚖️",
+ "name": "man judge"
+ },
+ {
+ "no": 205,
+ "code": "1F468 1F3FB 200D 2696 FE0F",
+ "char": "👨🏻‍⚖️",
+ "name": "man judge: light skin tone"
+ },
+ {
+ "no": 206,
+ "code": "1F468 1F3FC 200D 2696 FE0F",
+ "char": "👨🏼‍⚖️",
+ "name": "man judge: medium-light skin tone"
+ },
+ {
+ "no": 207,
+ "code": "1F468 1F3FD 200D 2696 FE0F",
+ "char": "👨🏽‍⚖️",
+ "name": "man judge: medium skin tone"
+ },
+ {
+ "no": 208,
+ "code": "1F468 1F3FE 200D 2696 FE0F",
+ "char": "👨🏾‍⚖️",
+ "name": "man judge: medium-dark skin tone"
+ },
+ {
+ "no": 209,
+ "code": "1F468 1F3FF 200D 2696 FE0F",
+ "char": "👨🏿‍⚖️",
+ "name": "man judge: dark skin tone"
+ },
+ {
+ "no": 210,
+ "code": "1F469 200D 2696 FE0F",
+ "char": "👩‍⚖️",
+ "name": "woman judge"
+ },
+ {
+ "no": 211,
+ "code": "1F469 1F3FB 200D 2696 FE0F",
+ "char": "👩🏻‍⚖️",
+ "name": "woman judge: light skin tone"
+ },
+ {
+ "no": 212,
+ "code": "1F469 1F3FC 200D 2696 FE0F",
+ "char": "👩🏼‍⚖️",
+ "name": "woman judge: medium-light skin tone"
+ },
+ {
+ "no": 213,
+ "code": "1F469 1F3FD 200D 2696 FE0F",
+ "char": "👩🏽‍⚖️",
+ "name": "woman judge: medium skin tone"
+ },
+ {
+ "no": 214,
+ "code": "1F469 1F3FE 200D 2696 FE0F",
+ "char": "👩🏾‍⚖️",
+ "name": "woman judge: medium-dark skin tone"
+ },
+ {
+ "no": 215,
+ "code": "1F469 1F3FF 200D 2696 FE0F",
+ "char": "👩🏿‍⚖️",
+ "name": "woman judge: dark skin tone"
+ },
+ {
+ "no": 216,
+ "code": "1F468 200D 1F33E",
+ "char": "👨‍🌾",
+ "name": "man farmer"
+ },
+ {
+ "no": 217,
+ "code": "1F468 1F3FB 200D 1F33E",
+ "char": "👨🏻‍🌾",
+ "name": "man farmer: light skin tone"
+ },
+ {
+ "no": 218,
+ "code": "1F468 1F3FC 200D 1F33E",
+ "char": "👨🏼‍🌾",
+ "name": "man farmer: medium-light skin tone"
+ },
+ {
+ "no": 219,
+ "code": "1F468 1F3FD 200D 1F33E",
+ "char": "👨🏽‍🌾",
+ "name": "man farmer: medium skin tone"
+ },
+ {
+ "no": 220,
+ "code": "1F468 1F3FE 200D 1F33E",
+ "char": "👨🏾‍🌾",
+ "name": "man farmer: medium-dark skin tone"
+ },
+ {
+ "no": 221,
+ "code": "1F468 1F3FF 200D 1F33E",
+ "char": "👨🏿‍🌾",
+ "name": "man farmer: dark skin tone"
+ },
+ {
+ "no": 222,
+ "code": "1F469 200D 1F33E",
+ "char": "👩‍🌾",
+ "name": "woman farmer"
+ },
+ {
+ "no": 223,
+ "code": "1F469 1F3FB 200D 1F33E",
+ "char": "👩🏻‍🌾",
+ "name": "woman farmer: light skin tone"
+ },
+ {
+ "no": 224,
+ "code": "1F469 1F3FC 200D 1F33E",
+ "char": "👩🏼‍🌾",
+ "name": "woman farmer: medium-light skin tone"
+ },
+ {
+ "no": 225,
+ "code": "1F469 1F3FD 200D 1F33E",
+ "char": "👩🏽‍🌾",
+ "name": "woman farmer: medium skin tone"
+ },
+ {
+ "no": 226,
+ "code": "1F469 1F3FE 200D 1F33E",
+ "char": "👩🏾‍🌾",
+ "name": "woman farmer: medium-dark skin tone"
+ },
+ {
+ "no": 227,
+ "code": "1F469 1F3FF 200D 1F33E",
+ "char": "👩🏿‍🌾",
+ "name": "woman farmer: dark skin tone"
+ },
+ {
+ "no": 228,
+ "code": "1F468 200D 1F373",
+ "char": "👨‍🍳",
+ "name": "man cook"
+ },
+ {
+ "no": 229,
+ "code": "1F468 1F3FB 200D 1F373",
+ "char": "👨🏻‍🍳",
+ "name": "man cook: light skin tone"
+ },
+ {
+ "no": 230,
+ "code": "1F468 1F3FC 200D 1F373",
+ "char": "👨🏼‍🍳",
+ "name": "man cook: medium-light skin tone"
+ },
+ {
+ "no": 231,
+ "code": "1F468 1F3FD 200D 1F373",
+ "char": "👨🏽‍🍳",
+ "name": "man cook: medium skin tone"
+ },
+ {
+ "no": 232,
+ "code": "1F468 1F3FE 200D 1F373",
+ "char": "👨🏾‍🍳",
+ "name": "man cook: medium-dark skin tone"
+ },
+ {
+ "no": 233,
+ "code": "1F468 1F3FF 200D 1F373",
+ "char": "👨🏿‍🍳",
+ "name": "man cook: dark skin tone"
+ },
+ {
+ "no": 234,
+ "code": "1F469 200D 1F373",
+ "char": "👩‍🍳",
+ "name": "woman cook"
+ },
+ {
+ "no": 235,
+ "code": "1F469 1F3FB 200D 1F373",
+ "char": "👩🏻‍🍳",
+ "name": "woman cook: light skin tone"
+ },
+ {
+ "no": 236,
+ "code": "1F469 1F3FC 200D 1F373",
+ "char": "👩🏼‍🍳",
+ "name": "woman cook: medium-light skin tone"
+ },
+ {
+ "no": 237,
+ "code": "1F469 1F3FD 200D 1F373",
+ "char": "👩🏽‍🍳",
+ "name": "woman cook: medium skin tone"
+ },
+ {
+ "no": 238,
+ "code": "1F469 1F3FE 200D 1F373",
+ "char": "👩🏾‍🍳",
+ "name": "woman cook: medium-dark skin tone"
+ },
+ {
+ "no": 239,
+ "code": "1F469 1F3FF 200D 1F373",
+ "char": "👩🏿‍🍳",
+ "name": "woman cook: dark skin tone"
+ },
+ {
+ "no": 240,
+ "code": "1F468 200D 1F527",
+ "char": "👨‍🔧",
+ "name": "man mechanic"
+ },
+ {
+ "no": 241,
+ "code": "1F468 1F3FB 200D 1F527",
+ "char": "👨🏻‍🔧",
+ "name": "man mechanic: light skin tone"
+ },
+ {
+ "no": 242,
+ "code": "1F468 1F3FC 200D 1F527",
+ "char": "👨🏼‍🔧",
+ "name": "man mechanic: medium-light skin tone"
+ },
+ {
+ "no": 243,
+ "code": "1F468 1F3FD 200D 1F527",
+ "char": "👨🏽‍🔧",
+ "name": "man mechanic: medium skin tone"
+ },
+ {
+ "no": 244,
+ "code": "1F468 1F3FE 200D 1F527",
+ "char": "👨🏾‍🔧",
+ "name": "man mechanic: medium-dark skin tone"
+ },
+ {
+ "no": 245,
+ "code": "1F468 1F3FF 200D 1F527",
+ "char": "👨🏿‍🔧",
+ "name": "man mechanic: dark skin tone"
+ },
+ {
+ "no": 246,
+ "code": "1F469 200D 1F527",
+ "char": "👩‍🔧",
+ "name": "woman mechanic"
+ },
+ {
+ "no": 247,
+ "code": "1F469 1F3FB 200D 1F527",
+ "char": "👩🏻‍🔧",
+ "name": "woman mechanic: light skin tone"
+ },
+ {
+ "no": 248,
+ "code": "1F469 1F3FC 200D 1F527",
+ "char": "👩🏼‍🔧",
+ "name": "woman mechanic: medium-light skin tone"
+ },
+ {
+ "no": 249,
+ "code": "1F469 1F3FD 200D 1F527",
+ "char": "👩🏽‍🔧",
+ "name": "woman mechanic: medium skin tone"
+ },
+ {
+ "no": 250,
+ "code": "1F469 1F3FE 200D 1F527",
+ "char": "👩🏾‍🔧",
+ "name": "woman mechanic: medium-dark skin tone"
+ },
+ {
+ "no": 251,
+ "code": "1F469 1F3FF 200D 1F527",
+ "char": "👩🏿‍🔧",
+ "name": "woman mechanic: dark skin tone"
+ },
+ {
+ "no": 252,
+ "code": "1F468 200D 1F3ED",
+ "char": "👨‍🏭",
+ "name": "man factory worker"
+ },
+ {
+ "no": 253,
+ "code": "1F468 1F3FB 200D 1F3ED",
+ "char": "👨🏻‍🏭",
+ "name": "man factory worker: light skin tone"
+ },
+ {
+ "no": 254,
+ "code": "1F468 1F3FC 200D 1F3ED",
+ "char": "👨🏼‍🏭",
+ "name": "man factory worker: medium-light skin tone"
+ },
+ {
+ "no": 255,
+ "code": "1F468 1F3FD 200D 1F3ED",
+ "char": "👨🏽‍🏭",
+ "name": "man factory worker: medium skin tone"
+ },
+ {
+ "no": 256,
+ "code": "1F468 1F3FE 200D 1F3ED",
+ "char": "👨🏾‍🏭",
+ "name": "man factory worker: medium-dark skin tone"
+ },
+ {
+ "no": 257,
+ "code": "1F468 1F3FF 200D 1F3ED",
+ "char": "👨🏿‍🏭",
+ "name": "man factory worker: dark skin tone"
+ },
+ {
+ "no": 258,
+ "code": "1F469 200D 1F3ED",
+ "char": "👩‍🏭",
+ "name": "woman factory worker"
+ },
+ {
+ "no": 259,
+ "code": "1F469 1F3FB 200D 1F3ED",
+ "char": "👩🏻‍🏭",
+ "name": "woman factory worker: light skin tone"
+ },
+ {
+ "no": 260,
+ "code": "1F469 1F3FC 200D 1F3ED",
+ "char": "👩🏼‍🏭",
+ "name": "woman factory worker: medium-light skin tone"
+ },
+ {
+ "no": 261,
+ "code": "1F469 1F3FD 200D 1F3ED",
+ "char": "👩🏽‍🏭",
+ "name": "woman factory worker: medium skin tone"
+ },
+ {
+ "no": 262,
+ "code": "1F469 1F3FE 200D 1F3ED",
+ "char": "👩🏾‍🏭",
+ "name": "woman factory worker: medium-dark skin tone"
+ },
+ {
+ "no": 263,
+ "code": "1F469 1F3FF 200D 1F3ED",
+ "char": "👩🏿‍🏭",
+ "name": "woman factory worker: dark skin tone"
+ },
+ {
+ "no": 264,
+ "code": "1F468 200D 1F4BC",
+ "char": "👨‍💼",
+ "name": "man office worker"
+ },
+ {
+ "no": 265,
+ "code": "1F468 1F3FB 200D 1F4BC",
+ "char": "👨🏻‍💼",
+ "name": "man office worker: light skin tone"
+ },
+ {
+ "no": 266,
+ "code": "1F468 1F3FC 200D 1F4BC",
+ "char": "👨🏼‍💼",
+ "name": "man office worker: medium-light skin tone"
+ },
+ {
+ "no": 267,
+ "code": "1F468 1F3FD 200D 1F4BC",
+ "char": "👨🏽‍💼",
+ "name": "man office worker: medium skin tone"
+ },
+ {
+ "no": 268,
+ "code": "1F468 1F3FE 200D 1F4BC",
+ "char": "👨🏾‍💼",
+ "name": "man office worker: medium-dark skin tone"
+ },
+ {
+ "no": 269,
+ "code": "1F468 1F3FF 200D 1F4BC",
+ "char": "👨🏿‍💼",
+ "name": "man office worker: dark skin tone"
+ },
+ {
+ "no": 270,
+ "code": "1F469 200D 1F4BC",
+ "char": "👩‍💼",
+ "name": "woman office worker"
+ },
+ {
+ "no": 271,
+ "code": "1F469 1F3FB 200D 1F4BC",
+ "char": "👩🏻‍💼",
+ "name": "woman office worker: light skin tone"
+ },
+ {
+ "no": 272,
+ "code": "1F469 1F3FC 200D 1F4BC",
+ "char": "👩🏼‍💼",
+ "name": "woman office worker: medium-light skin tone"
+ },
+ {
+ "no": 273,
+ "code": "1F469 1F3FD 200D 1F4BC",
+ "char": "👩🏽‍💼",
+ "name": "woman office worker: medium skin tone"
+ },
+ {
+ "no": 274,
+ "code": "1F469 1F3FE 200D 1F4BC",
+ "char": "👩🏾‍💼",
+ "name": "woman office worker: medium-dark skin tone"
+ },
+ {
+ "no": 275,
+ "code": "1F469 1F3FF 200D 1F4BC",
+ "char": "👩🏿‍💼",
+ "name": "woman office worker: dark skin tone"
+ },
+ {
+ "no": 276,
+ "code": "1F468 200D 1F52C",
+ "char": "👨‍🔬",
+ "name": "man scientist"
+ },
+ {
+ "no": 277,
+ "code": "1F468 1F3FB 200D 1F52C",
+ "char": "👨🏻‍🔬",
+ "name": "man scientist: light skin tone"
+ },
+ {
+ "no": 278,
+ "code": "1F468 1F3FC 200D 1F52C",
+ "char": "👨🏼‍🔬",
+ "name": "man scientist: medium-light skin tone"
+ },
+ {
+ "no": 279,
+ "code": "1F468 1F3FD 200D 1F52C",
+ "char": "👨🏽‍🔬",
+ "name": "man scientist: medium skin tone"
+ },
+ {
+ "no": 280,
+ "code": "1F468 1F3FE 200D 1F52C",
+ "char": "👨🏾‍🔬",
+ "name": "man scientist: medium-dark skin tone"
+ },
+ {
+ "no": 281,
+ "code": "1F468 1F3FF 200D 1F52C",
+ "char": "👨🏿‍🔬",
+ "name": "man scientist: dark skin tone"
+ },
+ {
+ "no": 282,
+ "code": "1F469 200D 1F52C",
+ "char": "👩‍🔬",
+ "name": "woman scientist"
+ },
+ {
+ "no": 283,
+ "code": "1F469 1F3FB 200D 1F52C",
+ "char": "👩🏻‍🔬",
+ "name": "woman scientist: light skin tone"
+ },
+ {
+ "no": 284,
+ "code": "1F469 1F3FC 200D 1F52C",
+ "char": "👩🏼‍🔬",
+ "name": "woman scientist: medium-light skin tone"
+ },
+ {
+ "no": 285,
+ "code": "1F469 1F3FD 200D 1F52C",
+ "char": "👩🏽‍🔬",
+ "name": "woman scientist: medium skin tone"
+ },
+ {
+ "no": 286,
+ "code": "1F469 1F3FE 200D 1F52C",
+ "char": "👩🏾‍🔬",
+ "name": "woman scientist: medium-dark skin tone"
+ },
+ {
+ "no": 287,
+ "code": "1F469 1F3FF 200D 1F52C",
+ "char": "👩🏿‍🔬",
+ "name": "woman scientist: dark skin tone"
+ },
+ {
+ "no": 288,
+ "code": "1F468 200D 1F4BB",
+ "char": "👨‍💻",
+ "name": "man technologist"
+ },
+ {
+ "no": 289,
+ "code": "1F468 1F3FB 200D 1F4BB",
+ "char": "👨🏻‍💻",
+ "name": "man technologist: light skin tone"
+ },
+ {
+ "no": 290,
+ "code": "1F468 1F3FC 200D 1F4BB",
+ "char": "👨🏼‍💻",
+ "name": "man technologist: medium-light skin tone"
+ },
+ {
+ "no": 291,
+ "code": "1F468 1F3FD 200D 1F4BB",
+ "char": "👨🏽‍💻",
+ "name": "man technologist: medium skin tone"
+ },
+ {
+ "no": 292,
+ "code": "1F468 1F3FE 200D 1F4BB",
+ "char": "👨🏾‍💻",
+ "name": "man technologist: medium-dark skin tone"
+ },
+ {
+ "no": 293,
+ "code": "1F468 1F3FF 200D 1F4BB",
+ "char": "👨🏿‍💻",
+ "name": "man technologist: dark skin tone"
+ },
+ {
+ "no": 294,
+ "code": "1F469 200D 1F4BB",
+ "char": "👩‍💻",
+ "name": "woman technologist"
+ },
+ {
+ "no": 295,
+ "code": "1F469 1F3FB 200D 1F4BB",
+ "char": "👩🏻‍💻",
+ "name": "woman technologist: light skin tone"
+ },
+ {
+ "no": 296,
+ "code": "1F469 1F3FC 200D 1F4BB",
+ "char": "👩🏼‍💻",
+ "name": "woman technologist: medium-light skin tone"
+ },
+ {
+ "no": 297,
+ "code": "1F469 1F3FD 200D 1F4BB",
+ "char": "👩🏽‍💻",
+ "name": "woman technologist: medium skin tone"
+ },
+ {
+ "no": 298,
+ "code": "1F469 1F3FE 200D 1F4BB",
+ "char": "👩🏾‍💻",
+ "name": "woman technologist: medium-dark skin tone"
+ },
+ {
+ "no": 299,
+ "code": "1F469 1F3FF 200D 1F4BB",
+ "char": "👩🏿‍💻",
+ "name": "woman technologist: dark skin tone"
+ },
+ {
+ "no": 300,
+ "code": "1F468 200D 1F3A4",
+ "char": "👨‍🎤",
+ "name": "man singer"
+ },
+ {
+ "no": 301,
+ "code": "1F468 1F3FB 200D 1F3A4",
+ "char": "👨🏻‍🎤",
+ "name": "man singer: light skin tone"
+ },
+ {
+ "no": 302,
+ "code": "1F468 1F3FC 200D 1F3A4",
+ "char": "👨🏼‍🎤",
+ "name": "man singer: medium-light skin tone"
+ },
+ {
+ "no": 303,
+ "code": "1F468 1F3FD 200D 1F3A4",
+ "char": "👨🏽‍🎤",
+ "name": "man singer: medium skin tone"
+ },
+ {
+ "no": 304,
+ "code": "1F468 1F3FE 200D 1F3A4",
+ "char": "👨🏾‍🎤",
+ "name": "man singer: medium-dark skin tone"
+ },
+ {
+ "no": 305,
+ "code": "1F468 1F3FF 200D 1F3A4",
+ "char": "👨🏿‍🎤",
+ "name": "man singer: dark skin tone"
+ },
+ {
+ "no": 306,
+ "code": "1F469 200D 1F3A4",
+ "char": "👩‍🎤",
+ "name": "woman singer"
+ },
+ {
+ "no": 307,
+ "code": "1F469 1F3FB 200D 1F3A4",
+ "char": "👩🏻‍🎤",
+ "name": "woman singer: light skin tone"
+ },
+ {
+ "no": 308,
+ "code": "1F469 1F3FC 200D 1F3A4",
+ "char": "👩🏼‍🎤",
+ "name": "woman singer: medium-light skin tone"
+ },
+ {
+ "no": 309,
+ "code": "1F469 1F3FD 200D 1F3A4",
+ "char": "👩🏽‍🎤",
+ "name": "woman singer: medium skin tone"
+ },
+ {
+ "no": 310,
+ "code": "1F469 1F3FE 200D 1F3A4",
+ "char": "👩🏾‍🎤",
+ "name": "woman singer: medium-dark skin tone"
+ },
+ {
+ "no": 311,
+ "code": "1F469 1F3FF 200D 1F3A4",
+ "char": "👩🏿‍🎤",
+ "name": "woman singer: dark skin tone"
+ },
+ {
+ "no": 312,
+ "code": "1F468 200D 1F3A8",
+ "char": "👨‍🎨",
+ "name": "man artist"
+ },
+ {
+ "no": 313,
+ "code": "1F468 1F3FB 200D 1F3A8",
+ "char": "👨🏻‍🎨",
+ "name": "man artist: light skin tone"
+ },
+ {
+ "no": 314,
+ "code": "1F468 1F3FC 200D 1F3A8",
+ "char": "👨🏼‍🎨",
+ "name": "man artist: medium-light skin tone"
+ },
+ {
+ "no": 315,
+ "code": "1F468 1F3FD 200D 1F3A8",
+ "char": "👨🏽‍🎨",
+ "name": "man artist: medium skin tone"
+ },
+ {
+ "no": 316,
+ "code": "1F468 1F3FE 200D 1F3A8",
+ "char": "👨🏾‍🎨",
+ "name": "man artist: medium-dark skin tone"
+ },
+ {
+ "no": 317,
+ "code": "1F468 1F3FF 200D 1F3A8",
+ "char": "👨🏿‍🎨",
+ "name": "man artist: dark skin tone"
+ },
+ {
+ "no": 318,
+ "code": "1F469 200D 1F3A8",
+ "char": "👩‍🎨",
+ "name": "woman artist"
+ },
+ {
+ "no": 319,
+ "code": "1F469 1F3FB 200D 1F3A8",
+ "char": "👩🏻‍🎨",
+ "name": "woman artist: light skin tone"
+ },
+ {
+ "no": 320,
+ "code": "1F469 1F3FC 200D 1F3A8",
+ "char": "👩🏼‍🎨",
+ "name": "woman artist: medium-light skin tone"
+ },
+ {
+ "no": 321,
+ "code": "1F469 1F3FD 200D 1F3A8",
+ "char": "👩🏽‍🎨",
+ "name": "woman artist: medium skin tone"
+ },
+ {
+ "no": 322,
+ "code": "1F469 1F3FE 200D 1F3A8",
+ "char": "👩🏾‍🎨",
+ "name": "woman artist: medium-dark skin tone"
+ },
+ {
+ "no": 323,
+ "code": "1F469 1F3FF 200D 1F3A8",
+ "char": "👩🏿‍🎨",
+ "name": "woman artist: dark skin tone"
+ },
+ {
+ "no": 324,
+ "code": "1F468 200D 2708 FE0F",
+ "char": "👨‍✈️",
+ "name": "man pilot"
+ },
+ {
+ "no": 325,
+ "code": "1F468 1F3FB 200D 2708 FE0F",
+ "char": "👨🏻‍✈️",
+ "name": "man pilot: light skin tone"
+ },
+ {
+ "no": 326,
+ "code": "1F468 1F3FC 200D 2708 FE0F",
+ "char": "👨🏼‍✈️",
+ "name": "man pilot: medium-light skin tone"
+ },
+ {
+ "no": 327,
+ "code": "1F468 1F3FD 200D 2708 FE0F",
+ "char": "👨🏽‍✈️",
+ "name": "man pilot: medium skin tone"
+ },
+ {
+ "no": 328,
+ "code": "1F468 1F3FE 200D 2708 FE0F",
+ "char": "👨🏾‍✈️",
+ "name": "man pilot: medium-dark skin tone"
+ },
+ {
+ "no": 329,
+ "code": "1F468 1F3FF 200D 2708 FE0F",
+ "char": "👨🏿‍✈️",
+ "name": "man pilot: dark skin tone"
+ },
+ {
+ "no": 330,
+ "code": "1F469 200D 2708 FE0F",
+ "char": "👩‍✈️",
+ "name": "woman pilot"
+ },
+ {
+ "no": 331,
+ "code": "1F469 1F3FB 200D 2708 FE0F",
+ "char": "👩🏻‍✈️",
+ "name": "woman pilot: light skin tone"
+ },
+ {
+ "no": 332,
+ "code": "1F469 1F3FC 200D 2708 FE0F",
+ "char": "👩🏼‍✈️",
+ "name": "woman pilot: medium-light skin tone"
+ },
+ {
+ "no": 333,
+ "code": "1F469 1F3FD 200D 2708 FE0F",
+ "char": "👩🏽‍✈️",
+ "name": "woman pilot: medium skin tone"
+ },
+ {
+ "no": 334,
+ "code": "1F469 1F3FE 200D 2708 FE0F",
+ "char": "👩🏾‍✈️",
+ "name": "woman pilot: medium-dark skin tone"
+ },
+ {
+ "no": 335,
+ "code": "1F469 1F3FF 200D 2708 FE0F",
+ "char": "👩🏿‍✈️",
+ "name": "woman pilot: dark skin tone"
+ },
+ {
+ "no": 336,
+ "code": "1F468 200D 1F680",
+ "char": "👨‍🚀",
+ "name": "man astronaut"
+ },
+ {
+ "no": 337,
+ "code": "1F468 1F3FB 200D 1F680",
+ "char": "👨🏻‍🚀",
+ "name": "man astronaut: light skin tone"
+ },
+ {
+ "no": 338,
+ "code": "1F468 1F3FC 200D 1F680",
+ "char": "👨🏼‍🚀",
+ "name": "man astronaut: medium-light skin tone"
+ },
+ {
+ "no": 339,
+ "code": "1F468 1F3FD 200D 1F680",
+ "char": "👨🏽‍🚀",
+ "name": "man astronaut: medium skin tone"
+ },
+ {
+ "no": 340,
+ "code": "1F468 1F3FE 200D 1F680",
+ "char": "👨🏾‍🚀",
+ "name": "man astronaut: medium-dark skin tone"
+ },
+ {
+ "no": 341,
+ "code": "1F468 1F3FF 200D 1F680",
+ "char": "👨🏿‍🚀",
+ "name": "man astronaut: dark skin tone"
+ },
+ {
+ "no": 342,
+ "code": "1F469 200D 1F680",
+ "char": "👩‍🚀",
+ "name": "woman astronaut"
+ },
+ {
+ "no": 343,
+ "code": "1F469 1F3FB 200D 1F680",
+ "char": "👩🏻‍🚀",
+ "name": "woman astronaut: light skin tone"
+ },
+ {
+ "no": 344,
+ "code": "1F469 1F3FC 200D 1F680",
+ "char": "👩🏼‍🚀",
+ "name": "woman astronaut: medium-light skin tone"
+ },
+ {
+ "no": 345,
+ "code": "1F469 1F3FD 200D 1F680",
+ "char": "👩🏽‍🚀",
+ "name": "woman astronaut: medium skin tone"
+ },
+ {
+ "no": 346,
+ "code": "1F469 1F3FE 200D 1F680",
+ "char": "👩🏾‍🚀",
+ "name": "woman astronaut: medium-dark skin tone"
+ },
+ {
+ "no": 347,
+ "code": "1F469 1F3FF 200D 1F680",
+ "char": "👩🏿‍🚀",
+ "name": "woman astronaut: dark skin tone"
+ },
+ {
+ "no": 348,
+ "code": "1F468 200D 1F692",
+ "char": "👨‍🚒",
+ "name": "man firefighter"
+ },
+ {
+ "no": 349,
+ "code": "1F468 1F3FB 200D 1F692",
+ "char": "👨🏻‍🚒",
+ "name": "man firefighter: light skin tone"
+ },
+ {
+ "no": 350,
+ "code": "1F468 1F3FC 200D 1F692",
+ "char": "👨🏼‍🚒",
+ "name": "man firefighter: medium-light skin tone"
+ },
+ {
+ "no": 351,
+ "code": "1F468 1F3FD 200D 1F692",
+ "char": "👨🏽‍🚒",
+ "name": "man firefighter: medium skin tone"
+ },
+ {
+ "no": 352,
+ "code": "1F468 1F3FE 200D 1F692",
+ "char": "👨🏾‍🚒",
+ "name": "man firefighter: medium-dark skin tone"
+ },
+ {
+ "no": 353,
+ "code": "1F468 1F3FF 200D 1F692",
+ "char": "👨🏿‍🚒",
+ "name": "man firefighter: dark skin tone"
+ },
+ {
+ "no": 354,
+ "code": "1F469 200D 1F692",
+ "char": "👩‍🚒",
+ "name": "woman firefighter"
+ },
+ {
+ "no": 355,
+ "code": "1F469 1F3FB 200D 1F692",
+ "char": "👩🏻‍🚒",
+ "name": "woman firefighter: light skin tone"
+ },
+ {
+ "no": 356,
+ "code": "1F469 1F3FC 200D 1F692",
+ "char": "👩🏼‍🚒",
+ "name": "woman firefighter: medium-light skin tone"
+ },
+ {
+ "no": 357,
+ "code": "1F469 1F3FD 200D 1F692",
+ "char": "👩🏽‍🚒",
+ "name": "woman firefighter: medium skin tone"
+ },
+ {
+ "no": 358,
+ "code": "1F469 1F3FE 200D 1F692",
+ "char": "👩🏾‍🚒",
+ "name": "woman firefighter: medium-dark skin tone"
+ },
+ {
+ "no": 359,
+ "code": "1F469 1F3FF 200D 1F692",
+ "char": "👩🏿‍🚒",
+ "name": "woman firefighter: dark skin tone"
+ },
+ {
+ "no": 360,
+ "code": "1F46E",
+ "char": "👮",
+ "name": "police officer"
+ },
+ {
+ "no": 361,
+ "code": "1F46E 1F3FB",
+ "char": "👮🏻",
+ "name": "police officer: light skin tone"
+ },
+ {
+ "no": 362,
+ "code": "1F46E 1F3FC",
+ "char": "👮🏼",
+ "name": "police officer: medium-light skin tone"
+ },
+ {
+ "no": 363,
+ "code": "1F46E 1F3FD",
+ "char": "👮🏽",
+ "name": "police officer: medium skin tone"
+ },
+ {
+ "no": 364,
+ "code": "1F46E 1F3FE",
+ "char": "👮🏾",
+ "name": "police officer: medium-dark skin tone"
+ },
+ {
+ "no": 365,
+ "code": "1F46E 1F3FF",
+ "char": "👮🏿",
+ "name": "police officer: dark skin tone"
+ },
+ {
+ "no": 366,
+ "code": "1F46E 200D 2642 FE0F",
+ "char": "👮‍♂️",
+ "name": "man police officer"
+ },
+ {
+ "no": 367,
+ "code": "1F46E 1F3FB 200D 2642 FE0F",
+ "char": "👮🏻‍♂️",
+ "name": "man police officer: light skin tone"
+ },
+ {
+ "no": 368,
+ "code": "1F46E 1F3FC 200D 2642 FE0F",
+ "char": "👮🏼‍♂️",
+ "name": "man police officer: medium-light skin tone"
+ },
+ {
+ "no": 369,
+ "code": "1F46E 1F3FD 200D 2642 FE0F",
+ "char": "👮🏽‍♂️",
+ "name": "man police officer: medium skin tone"
+ },
+ {
+ "no": 370,
+ "code": "1F46E 1F3FE 200D 2642 FE0F",
+ "char": "👮🏾‍♂️",
+ "name": "man police officer: medium-dark skin tone"
+ },
+ {
+ "no": 371,
+ "code": "1F46E 1F3FF 200D 2642 FE0F",
+ "char": "👮🏿‍♂️",
+ "name": "man police officer: dark skin tone"
+ },
+ {
+ "no": 372,
+ "code": "1F46E 200D 2640 FE0F",
+ "char": "👮‍♀️",
+ "name": "woman police officer"
+ },
+ {
+ "no": 373,
+ "code": "1F46E 1F3FB 200D 2640 FE0F",
+ "char": "👮🏻‍♀️",
+ "name": "woman police officer: light skin tone"
+ },
+ {
+ "no": 374,
+ "code": "1F46E 1F3FC 200D 2640 FE0F",
+ "char": "👮🏼‍♀️",
+ "name": "woman police officer: medium-light skin tone"
+ },
+ {
+ "no": 375,
+ "code": "1F46E 1F3FD 200D 2640 FE0F",
+ "char": "👮🏽‍♀️",
+ "name": "woman police officer: medium skin tone"
+ },
+ {
+ "no": 376,
+ "code": "1F46E 1F3FE 200D 2640 FE0F",
+ "char": "👮🏾‍♀️",
+ "name": "woman police officer: medium-dark skin tone"
+ },
+ {
+ "no": 377,
+ "code": "1F46E 1F3FF 200D 2640 FE0F",
+ "char": "👮🏿‍♀️",
+ "name": "woman police officer: dark skin tone"
+ },
+ {
+ "no": 378,
+ "code": "1F575",
+ "char": "🕵",
+ "name": "detective"
+ },
+ {
+ "no": 379,
+ "code": "1F575 1F3FB",
+ "char": "🕵🏻",
+ "name": "detective: light skin tone"
+ },
+ {
+ "no": 380,
+ "code": "1F575 1F3FC",
+ "char": "🕵🏼",
+ "name": "detective: medium-light skin tone"
+ },
+ {
+ "no": 381,
+ "code": "1F575 1F3FD",
+ "char": "🕵🏽",
+ "name": "detective: medium skin tone"
+ },
+ {
+ "no": 382,
+ "code": "1F575 1F3FE",
+ "char": "🕵🏾",
+ "name": "detective: medium-dark skin tone"
+ },
+ {
+ "no": 383,
+ "code": "1F575 1F3FF",
+ "char": "🕵🏿",
+ "name": "detective: dark skin tone"
+ },
+ {
+ "no": 384,
+ "code": "1F575 FE0F 200D 2642 FE0F",
+ "char": "🕵️‍♂️",
+ "name": "man detective"
+ },
+ {
+ "no": 385,
+ "code": "1F575 1F3FB 200D 2642 FE0F",
+ "char": "🕵🏻‍♂️",
+ "name": "man detective: light skin tone"
+ },
+ {
+ "no": 386,
+ "code": "1F575 1F3FC 200D 2642 FE0F",
+ "char": "🕵🏼‍♂️",
+ "name": "man detective: medium-light skin tone"
+ },
+ {
+ "no": 387,
+ "code": "1F575 1F3FD 200D 2642 FE0F",
+ "char": "🕵🏽‍♂️",
+ "name": "man detective: medium skin tone"
+ },
+ {
+ "no": 388,
+ "code": "1F575 1F3FE 200D 2642 FE0F",
+ "char": "🕵🏾‍♂️",
+ "name": "man detective: medium-dark skin tone"
+ },
+ {
+ "no": 389,
+ "code": "1F575 1F3FF 200D 2642 FE0F",
+ "char": "🕵🏿‍♂️",
+ "name": "man detective: dark skin tone"
+ },
+ {
+ "no": 390,
+ "code": "1F575 FE0F 200D 2640 FE0F",
+ "char": "🕵️‍♀️",
+ "name": "woman detective"
+ },
+ {
+ "no": 391,
+ "code": "1F575 1F3FB 200D 2640 FE0F",
+ "char": "🕵🏻‍♀️",
+ "name": "woman detective: light skin tone"
+ },
+ {
+ "no": 392,
+ "code": "1F575 1F3FC 200D 2640 FE0F",
+ "char": "🕵🏼‍♀️",
+ "name": "woman detective: medium-light skin tone"
+ },
+ {
+ "no": 393,
+ "code": "1F575 1F3FD 200D 2640 FE0F",
+ "char": "🕵🏽‍♀️",
+ "name": "woman detective: medium skin tone"
+ },
+ {
+ "no": 394,
+ "code": "1F575 1F3FE 200D 2640 FE0F",
+ "char": "🕵🏾‍♀️",
+ "name": "woman detective: medium-dark skin tone"
+ },
+ {
+ "no": 395,
+ "code": "1F575 1F3FF 200D 2640 FE0F",
+ "char": "🕵🏿‍♀️",
+ "name": "woman detective: dark skin tone"
+ },
+ {
+ "no": 396,
+ "code": "1F482",
+ "char": "💂",
+ "name": "guard"
+ },
+ {
+ "no": 397,
+ "code": "1F482 1F3FB",
+ "char": "💂🏻",
+ "name": "guard: light skin tone"
+ },
+ {
+ "no": 398,
+ "code": "1F482 1F3FC",
+ "char": "💂🏼",
+ "name": "guard: medium-light skin tone"
+ },
+ {
+ "no": 399,
+ "code": "1F482 1F3FD",
+ "char": "💂🏽",
+ "name": "guard: medium skin tone"
+ },
+ {
+ "no": 400,
+ "code": "1F482 1F3FE",
+ "char": "💂🏾",
+ "name": "guard: medium-dark skin tone"
+ },
+ {
+ "no": 401,
+ "code": "1F482 1F3FF",
+ "char": "💂🏿",
+ "name": "guard: dark skin tone"
+ },
+ {
+ "no": 402,
+ "code": "1F482 200D 2642 FE0F",
+ "char": "💂‍♂️",
+ "name": "man guard"
+ },
+ {
+ "no": 403,
+ "code": "1F482 1F3FB 200D 2642 FE0F",
+ "char": "💂🏻‍♂️",
+ "name": "man guard: light skin tone"
+ },
+ {
+ "no": 404,
+ "code": "1F482 1F3FC 200D 2642 FE0F",
+ "char": "💂🏼‍♂️",
+ "name": "man guard: medium-light skin tone"
+ },
+ {
+ "no": 405,
+ "code": "1F482 1F3FD 200D 2642 FE0F",
+ "char": "💂🏽‍♂️",
+ "name": "man guard: medium skin tone"
+ },
+ {
+ "no": 406,
+ "code": "1F482 1F3FE 200D 2642 FE0F",
+ "char": "💂🏾‍♂️",
+ "name": "man guard: medium-dark skin tone"
+ },
+ {
+ "no": 407,
+ "code": "1F482 1F3FF 200D 2642 FE0F",
+ "char": "💂🏿‍♂️",
+ "name": "man guard: dark skin tone"
+ },
+ {
+ "no": 408,
+ "code": "1F482 200D 2640 FE0F",
+ "char": "💂‍♀️",
+ "name": "woman guard"
+ },
+ {
+ "no": 409,
+ "code": "1F482 1F3FB 200D 2640 FE0F",
+ "char": "💂🏻‍♀️",
+ "name": "woman guard: light skin tone"
+ },
+ {
+ "no": 410,
+ "code": "1F482 1F3FC 200D 2640 FE0F",
+ "char": "💂🏼‍♀️",
+ "name": "woman guard: medium-light skin tone"
+ },
+ {
+ "no": 411,
+ "code": "1F482 1F3FD 200D 2640 FE0F",
+ "char": "💂🏽‍♀️",
+ "name": "woman guard: medium skin tone"
+ },
+ {
+ "no": 412,
+ "code": "1F482 1F3FE 200D 2640 FE0F",
+ "char": "💂🏾‍♀️",
+ "name": "woman guard: medium-dark skin tone"
+ },
+ {
+ "no": 413,
+ "code": "1F482 1F3FF 200D 2640 FE0F",
+ "char": "💂🏿‍♀️",
+ "name": "woman guard: dark skin tone"
+ },
+ {
+ "no": 414,
+ "code": "1F477",
+ "char": "👷",
+ "name": "construction worker"
+ },
+ {
+ "no": 415,
+ "code": "1F477 1F3FB",
+ "char": "👷🏻",
+ "name": "construction worker: light skin tone"
+ },
+ {
+ "no": 416,
+ "code": "1F477 1F3FC",
+ "char": "👷🏼",
+ "name": "construction worker: medium-light skin tone"
+ },
+ {
+ "no": 417,
+ "code": "1F477 1F3FD",
+ "char": "👷🏽",
+ "name": "construction worker: medium skin tone"
+ },
+ {
+ "no": 418,
+ "code": "1F477 1F3FE",
+ "char": "👷🏾",
+ "name": "construction worker: medium-dark skin tone"
+ },
+ {
+ "no": 419,
+ "code": "1F477 1F3FF",
+ "char": "👷🏿",
+ "name": "construction worker: dark skin tone"
+ },
+ {
+ "no": 420,
+ "code": "1F477 200D 2642 FE0F",
+ "char": "👷‍♂️",
+ "name": "man construction worker"
+ },
+ {
+ "no": 421,
+ "code": "1F477 1F3FB 200D 2642 FE0F",
+ "char": "👷🏻‍♂️",
+ "name": "man construction worker: light skin tone"
+ },
+ {
+ "no": 422,
+ "code": "1F477 1F3FC 200D 2642 FE0F",
+ "char": "👷🏼‍♂️",
+ "name": "man construction worker: medium-light skin tone"
+ },
+ {
+ "no": 423,
+ "code": "1F477 1F3FD 200D 2642 FE0F",
+ "char": "👷🏽‍♂️",
+ "name": "man construction worker: medium skin tone"
+ },
+ {
+ "no": 424,
+ "code": "1F477 1F3FE 200D 2642 FE0F",
+ "char": "👷🏾‍♂️",
+ "name": "man construction worker: medium-dark skin tone"
+ },
+ {
+ "no": 425,
+ "code": "1F477 1F3FF 200D 2642 FE0F",
+ "char": "👷🏿‍♂️",
+ "name": "man construction worker: dark skin tone"
+ },
+ {
+ "no": 426,
+ "code": "1F477 200D 2640 FE0F",
+ "char": "👷‍♀️",
+ "name": "woman construction worker"
+ },
+ {
+ "no": 427,
+ "code": "1F477 1F3FB 200D 2640 FE0F",
+ "char": "👷🏻‍♀️",
+ "name": "woman construction worker: light skin tone"
+ },
+ {
+ "no": 428,
+ "code": "1F477 1F3FC 200D 2640 FE0F",
+ "char": "👷🏼‍♀️",
+ "name": "woman construction worker: medium-light skin tone"
+ },
+ {
+ "no": 429,
+ "code": "1F477 1F3FD 200D 2640 FE0F",
+ "char": "👷🏽‍♀️",
+ "name": "woman construction worker: medium skin tone"
+ },
+ {
+ "no": 430,
+ "code": "1F477 1F3FE 200D 2640 FE0F",
+ "char": "👷🏾‍♀️",
+ "name": "woman construction worker: medium-dark skin tone"
+ },
+ {
+ "no": 431,
+ "code": "1F477 1F3FF 200D 2640 FE0F",
+ "char": "👷🏿‍♀️",
+ "name": "woman construction worker: dark skin tone"
+ },
+ {
+ "no": 432,
+ "code": "1F934",
+ "char": "🤴",
+ "name": "prince"
+ },
+ {
+ "no": 433,
+ "code": "1F934 1F3FB",
+ "char": "🤴🏻",
+ "name": "prince: light skin tone"
+ },
+ {
+ "no": 434,
+ "code": "1F934 1F3FC",
+ "char": "🤴🏼",
+ "name": "prince: medium-light skin tone"
+ },
+ {
+ "no": 435,
+ "code": "1F934 1F3FD",
+ "char": "🤴🏽",
+ "name": "prince: medium skin tone"
+ },
+ {
+ "no": 436,
+ "code": "1F934 1F3FE",
+ "char": "🤴🏾",
+ "name": "prince: medium-dark skin tone"
+ },
+ {
+ "no": 437,
+ "code": "1F934 1F3FF",
+ "char": "🤴🏿",
+ "name": "prince: dark skin tone"
+ },
+ {
+ "no": 438,
+ "code": "1F478",
+ "char": "👸",
+ "name": "princess"
+ },
+ {
+ "no": 439,
+ "code": "1F478 1F3FB",
+ "char": "👸🏻",
+ "name": "princess: light skin tone"
+ },
+ {
+ "no": 440,
+ "code": "1F478 1F3FC",
+ "char": "👸🏼",
+ "name": "princess: medium-light skin tone"
+ },
+ {
+ "no": 441,
+ "code": "1F478 1F3FD",
+ "char": "👸🏽",
+ "name": "princess: medium skin tone"
+ },
+ {
+ "no": 442,
+ "code": "1F478 1F3FE",
+ "char": "👸🏾",
+ "name": "princess: medium-dark skin tone"
+ },
+ {
+ "no": 443,
+ "code": "1F478 1F3FF",
+ "char": "👸🏿",
+ "name": "princess: dark skin tone"
+ },
+ {
+ "no": 444,
+ "code": "1F473",
+ "char": "👳",
+ "name": "person wearing turban"
+ },
+ {
+ "no": 445,
+ "code": "1F473 1F3FB",
+ "char": "👳🏻",
+ "name": "person wearing turban: light skin tone"
+ },
+ {
+ "no": 446,
+ "code": "1F473 1F3FC",
+ "char": "👳🏼",
+ "name": "person wearing turban: medium-light skin tone"
+ },
+ {
+ "no": 447,
+ "code": "1F473 1F3FD",
+ "char": "👳🏽",
+ "name": "person wearing turban: medium skin tone"
+ },
+ {
+ "no": 448,
+ "code": "1F473 1F3FE",
+ "char": "👳🏾",
+ "name": "person wearing turban: medium-dark skin tone"
+ },
+ {
+ "no": 449,
+ "code": "1F473 1F3FF",
+ "char": "👳🏿",
+ "name": "person wearing turban: dark skin tone"
+ },
+ {
+ "no": 450,
+ "code": "1F473 200D 2642 FE0F",
+ "char": "👳‍♂️",
+ "name": "man wearing turban"
+ },
+ {
+ "no": 451,
+ "code": "1F473 1F3FB 200D 2642 FE0F",
+ "char": "👳🏻‍♂️",
+ "name": "man wearing turban: light skin tone"
+ },
+ {
+ "no": 452,
+ "code": "1F473 1F3FC 200D 2642 FE0F",
+ "char": "👳🏼‍♂️",
+ "name": "man wearing turban: medium-light skin tone"
+ },
+ {
+ "no": 453,
+ "code": "1F473 1F3FD 200D 2642 FE0F",
+ "char": "👳🏽‍♂️",
+ "name": "man wearing turban: medium skin tone"
+ },
+ {
+ "no": 454,
+ "code": "1F473 1F3FE 200D 2642 FE0F",
+ "char": "👳🏾‍♂️",
+ "name": "man wearing turban: medium-dark skin tone"
+ },
+ {
+ "no": 455,
+ "code": "1F473 1F3FF 200D 2642 FE0F",
+ "char": "👳🏿‍♂️",
+ "name": "man wearing turban: dark skin tone"
+ },
+ {
+ "no": 456,
+ "code": "1F473 200D 2640 FE0F",
+ "char": "👳‍♀️",
+ "name": "woman wearing turban"
+ },
+ {
+ "no": 457,
+ "code": "1F473 1F3FB 200D 2640 FE0F",
+ "char": "👳🏻‍♀️",
+ "name": "woman wearing turban: light skin tone"
+ },
+ {
+ "no": 458,
+ "code": "1F473 1F3FC 200D 2640 FE0F",
+ "char": "👳🏼‍♀️",
+ "name": "woman wearing turban: medium-light skin tone"
+ },
+ {
+ "no": 459,
+ "code": "1F473 1F3FD 200D 2640 FE0F",
+ "char": "👳🏽‍♀️",
+ "name": "woman wearing turban: medium skin tone"
+ },
+ {
+ "no": 460,
+ "code": "1F473 1F3FE 200D 2640 FE0F",
+ "char": "👳🏾‍♀️",
+ "name": "woman wearing turban: medium-dark skin tone"
+ },
+ {
+ "no": 461,
+ "code": "1F473 1F3FF 200D 2640 FE0F",
+ "char": "👳🏿‍♀️",
+ "name": "woman wearing turban: dark skin tone"
+ },
+ {
+ "no": 462,
+ "code": "1F472",
+ "char": "👲",
+ "name": "man with Chinese cap"
+ },
+ {
+ "no": 463,
+ "code": "1F472 1F3FB",
+ "char": "👲🏻",
+ "name": "man with Chinese cap: light skin tone"
+ },
+ {
+ "no": 464,
+ "code": "1F472 1F3FC",
+ "char": "👲🏼",
+ "name": "man with Chinese cap: medium-light skin tone"
+ },
+ {
+ "no": 465,
+ "code": "1F472 1F3FD",
+ "char": "👲🏽",
+ "name": "man with Chinese cap: medium skin tone"
+ },
+ {
+ "no": 466,
+ "code": "1F472 1F3FE",
+ "char": "👲🏾",
+ "name": "man with Chinese cap: medium-dark skin tone"
+ },
+ {
+ "no": 467,
+ "code": "1F472 1F3FF",
+ "char": "👲🏿",
+ "name": "man with Chinese cap: dark skin tone"
+ },
+ {
+ "no": 468,
+ "code": "1F9D5",
+ "char": "🧕",
+ "name": "⊛ woman with headscarf"
+ },
+ {
+ "no": 469,
+ "code": "1F9D5 1F3FB",
+ "char": "🧕🏻",
+ "name": "⊛ woman with headscarf: light skin tone"
+ },
+ {
+ "no": 470,
+ "code": "1F9D5 1F3FC",
+ "char": "🧕🏼",
+ "name": "⊛ woman with headscarf: medium-light skin tone"
+ },
+ {
+ "no": 471,
+ "code": "1F9D5 1F3FD",
+ "char": "🧕🏽",
+ "name": "⊛ woman with headscarf: medium skin tone"
+ },
+ {
+ "no": 472,
+ "code": "1F9D5 1F3FE",
+ "char": "🧕🏾",
+ "name": "⊛ woman with headscarf: medium-dark skin tone"
+ },
+ {
+ "no": 473,
+ "code": "1F9D5 1F3FF",
+ "char": "🧕🏿",
+ "name": "⊛ woman with headscarf: dark skin tone"
+ },
+ {
+ "no": 474,
+ "code": "1F9D4",
+ "char": "🧔",
+ "name": "⊛ bearded person"
+ },
+ {
+ "no": 475,
+ "code": "1F9D4 1F3FB",
+ "char": "🧔🏻",
+ "name": "⊛ bearded person: light skin tone"
+ },
+ {
+ "no": 476,
+ "code": "1F9D4 1F3FC",
+ "char": "🧔🏼",
+ "name": "⊛ bearded person: medium-light skin tone"
+ },
+ {
+ "no": 477,
+ "code": "1F9D4 1F3FD",
+ "char": "🧔🏽",
+ "name": "⊛ bearded person: medium skin tone"
+ },
+ {
+ "no": 478,
+ "code": "1F9D4 1F3FE",
+ "char": "🧔🏾",
+ "name": "⊛ bearded person: medium-dark skin tone"
+ },
+ {
+ "no": 479,
+ "code": "1F9D4 1F3FF",
+ "char": "🧔🏿",
+ "name": "⊛ bearded person: dark skin tone"
+ },
+ {
+ "no": 480,
+ "code": "1F471",
+ "char": "👱",
+ "name": "blond-haired person"
+ },
+ {
+ "no": 481,
+ "code": "1F471 1F3FB",
+ "char": "👱🏻",
+ "name": "blond-haired person: light skin tone"
+ },
+ {
+ "no": 482,
+ "code": "1F471 1F3FC",
+ "char": "👱🏼",
+ "name": "blond-haired person: medium-light skin tone"
+ },
+ {
+ "no": 483,
+ "code": "1F471 1F3FD",
+ "char": "👱🏽",
+ "name": "blond-haired person: medium skin tone"
+ },
+ {
+ "no": 484,
+ "code": "1F471 1F3FE",
+ "char": "👱🏾",
+ "name": "blond-haired person: medium-dark skin tone"
+ },
+ {
+ "no": 485,
+ "code": "1F471 1F3FF",
+ "char": "👱🏿",
+ "name": "blond-haired person: dark skin tone"
+ },
+ {
+ "no": 486,
+ "code": "1F471 200D 2642 FE0F",
+ "char": "👱‍♂️",
+ "name": "blond-haired man"
+ },
+ {
+ "no": 487,
+ "code": "1F471 1F3FB 200D 2642 FE0F",
+ "char": "👱🏻‍♂️",
+ "name": "blond-haired man: light skin tone"
+ },
+ {
+ "no": 488,
+ "code": "1F471 1F3FC 200D 2642 FE0F",
+ "char": "👱🏼‍♂️",
+ "name": "blond-haired man: medium-light skin tone"
+ },
+ {
+ "no": 489,
+ "code": "1F471 1F3FD 200D 2642 FE0F",
+ "char": "👱🏽‍♂️",
+ "name": "blond-haired man: medium skin tone"
+ },
+ {
+ "no": 490,
+ "code": "1F471 1F3FE 200D 2642 FE0F",
+ "char": "👱🏾‍♂️",
+ "name": "blond-haired man: medium-dark skin tone"
+ },
+ {
+ "no": 491,
+ "code": "1F471 1F3FF 200D 2642 FE0F",
+ "char": "👱🏿‍♂️",
+ "name": "blond-haired man: dark skin tone"
+ },
+ {
+ "no": 492,
+ "code": "1F471 200D 2640 FE0F",
+ "char": "👱‍♀️",
+ "name": "blond-haired woman"
+ },
+ {
+ "no": 493,
+ "code": "1F471 1F3FB 200D 2640 FE0F",
+ "char": "👱🏻‍♀️",
+ "name": "blond-haired woman: light skin tone"
+ },
+ {
+ "no": 494,
+ "code": "1F471 1F3FC 200D 2640 FE0F",
+ "char": "👱🏼‍♀️",
+ "name": "blond-haired woman: medium-light skin tone"
+ },
+ {
+ "no": 495,
+ "code": "1F471 1F3FD 200D 2640 FE0F",
+ "char": "👱🏽‍♀️",
+ "name": "blond-haired woman: medium skin tone"
+ },
+ {
+ "no": 496,
+ "code": "1F471 1F3FE 200D 2640 FE0F",
+ "char": "👱🏾‍♀️",
+ "name": "blond-haired woman: medium-dark skin tone"
+ },
+ {
+ "no": 497,
+ "code": "1F471 1F3FF 200D 2640 FE0F",
+ "char": "👱🏿‍♀️",
+ "name": "blond-haired woman: dark skin tone"
+ },
+ {
+ "no": 498,
+ "code": "1F935",
+ "char": "🤵",
+ "name": "man in tuxedo"
+ },
+ {
+ "no": 499,
+ "code": "1F935 1F3FB",
+ "char": "🤵🏻",
+ "name": "man in tuxedo: light skin tone"
+ },
+ {
+ "no": 500,
+ "code": "1F935 1F3FC",
+ "char": "🤵🏼",
+ "name": "man in tuxedo: medium-light skin tone"
+ },
+ {
+ "no": 501,
+ "code": "1F935 1F3FD",
+ "char": "🤵🏽",
+ "name": "man in tuxedo: medium skin tone"
+ },
+ {
+ "no": 502,
+ "code": "1F935 1F3FE",
+ "char": "🤵🏾",
+ "name": "man in tuxedo: medium-dark skin tone"
+ },
+ {
+ "no": 503,
+ "code": "1F935 1F3FF",
+ "char": "🤵🏿",
+ "name": "man in tuxedo: dark skin tone"
+ },
+ {
+ "no": 504,
+ "code": "1F470",
+ "char": "👰",
+ "name": "bride with veil"
+ },
+ {
+ "no": 505,
+ "code": "1F470 1F3FB",
+ "char": "👰🏻",
+ "name": "bride with veil: light skin tone"
+ },
+ {
+ "no": 506,
+ "code": "1F470 1F3FC",
+ "char": "👰🏼",
+ "name": "bride with veil: medium-light skin tone"
+ },
+ {
+ "no": 507,
+ "code": "1F470 1F3FD",
+ "char": "👰🏽",
+ "name": "bride with veil: medium skin tone"
+ },
+ {
+ "no": 508,
+ "code": "1F470 1F3FE",
+ "char": "👰🏾",
+ "name": "bride with veil: medium-dark skin tone"
+ },
+ {
+ "no": 509,
+ "code": "1F470 1F3FF",
+ "char": "👰🏿",
+ "name": "bride with veil: dark skin tone"
+ },
+ {
+ "no": 510,
+ "code": "1F930",
+ "char": "🤰",
+ "name": "pregnant woman"
+ },
+ {
+ "no": 511,
+ "code": "1F930 1F3FB",
+ "char": "🤰🏻",
+ "name": "pregnant woman: light skin tone"
+ },
+ {
+ "no": 512,
+ "code": "1F930 1F3FC",
+ "char": "🤰🏼",
+ "name": "pregnant woman: medium-light skin tone"
+ },
+ {
+ "no": 513,
+ "code": "1F930 1F3FD",
+ "char": "🤰🏽",
+ "name": "pregnant woman: medium skin tone"
+ },
+ {
+ "no": 514,
+ "code": "1F930 1F3FE",
+ "char": "🤰🏾",
+ "name": "pregnant woman: medium-dark skin tone"
+ },
+ {
+ "no": 515,
+ "code": "1F930 1F3FF",
+ "char": "🤰🏿",
+ "name": "pregnant woman: dark skin tone"
+ },
+ {
+ "no": 516,
+ "code": "1F931",
+ "char": "🤱",
+ "name": "⊛ breast-feeding"
+ },
+ {
+ "no": 517,
+ "code": "1F931 1F3FB",
+ "char": "🤱🏻",
+ "name": "⊛ breast-feeding: light skin tone"
+ },
+ {
+ "no": 518,
+ "code": "1F931 1F3FC",
+ "char": "🤱🏼",
+ "name": "⊛ breast-feeding: medium-light skin tone"
+ },
+ {
+ "no": 519,
+ "code": "1F931 1F3FD",
+ "char": "🤱🏽",
+ "name": "⊛ breast-feeding: medium skin tone"
+ },
+ {
+ "no": 520,
+ "code": "1F931 1F3FE",
+ "char": "🤱🏾",
+ "name": "⊛ breast-feeding: medium-dark skin tone"
+ },
+ {
+ "no": 521,
+ "code": "1F931 1F3FF",
+ "char": "🤱🏿",
+ "name": "⊛ breast-feeding: dark skin tone"
+ },
+ {
+ "no": 522,
+ "code": "1F47C",
+ "char": "👼",
+ "name": "baby angel"
+ },
+ {
+ "no": 523,
+ "code": "1F47C 1F3FB",
+ "char": "👼🏻",
+ "name": "baby angel: light skin tone"
+ },
+ {
+ "no": 524,
+ "code": "1F47C 1F3FC",
+ "char": "👼🏼",
+ "name": "baby angel: medium-light skin tone"
+ },
+ {
+ "no": 525,
+ "code": "1F47C 1F3FD",
+ "char": "👼🏽",
+ "name": "baby angel: medium skin tone"
+ },
+ {
+ "no": 526,
+ "code": "1F47C 1F3FE",
+ "char": "👼🏾",
+ "name": "baby angel: medium-dark skin tone"
+ },
+ {
+ "no": 527,
+ "code": "1F47C 1F3FF",
+ "char": "👼🏿",
+ "name": "baby angel: dark skin tone"
+ },
+ {
+ "no": 528,
+ "code": "1F385",
+ "char": "🎅",
+ "name": "Santa Claus"
+ },
+ {
+ "no": 529,
+ "code": "1F385 1F3FB",
+ "char": "🎅🏻",
+ "name": "Santa Claus: light skin tone"
+ },
+ {
+ "no": 530,
+ "code": "1F385 1F3FC",
+ "char": "🎅🏼",
+ "name": "Santa Claus: medium-light skin tone"
+ },
+ {
+ "no": 531,
+ "code": "1F385 1F3FD",
+ "char": "🎅🏽",
+ "name": "Santa Claus: medium skin tone"
+ },
+ {
+ "no": 532,
+ "code": "1F385 1F3FE",
+ "char": "🎅🏾",
+ "name": "Santa Claus: medium-dark skin tone"
+ },
+ {
+ "no": 533,
+ "code": "1F385 1F3FF",
+ "char": "🎅🏿",
+ "name": "Santa Claus: dark skin tone"
+ },
+ {
+ "no": 534,
+ "code": "1F936",
+ "char": "🤶",
+ "name": "Mrs. Claus"
+ },
+ {
+ "no": 535,
+ "code": "1F936 1F3FB",
+ "char": "🤶🏻",
+ "name": "Mrs. Claus: light skin tone"
+ },
+ {
+ "no": 536,
+ "code": "1F936 1F3FC",
+ "char": "🤶🏼",
+ "name": "Mrs. Claus: medium-light skin tone"
+ },
+ {
+ "no": 537,
+ "code": "1F936 1F3FD",
+ "char": "🤶🏽",
+ "name": "Mrs. Claus: medium skin tone"
+ },
+ {
+ "no": 538,
+ "code": "1F936 1F3FE",
+ "char": "🤶🏾",
+ "name": "Mrs. Claus: medium-dark skin tone"
+ },
+ {
+ "no": 539,
+ "code": "1F936 1F3FF",
+ "char": "🤶🏿",
+ "name": "Mrs. Claus: dark skin tone"
+ },
+ {
+ "no": 540,
+ "code": "1F9D9",
+ "char": "🧙",
+ "name": "⊛ mage"
+ },
+ {
+ "no": 541,
+ "code": "1F9D9 1F3FB",
+ "char": "🧙🏻",
+ "name": "⊛ mage: light skin tone"
+ },
+ {
+ "no": 542,
+ "code": "1F9D9 1F3FC",
+ "char": "🧙🏼",
+ "name": "⊛ mage: medium-light skin tone"
+ },
+ {
+ "no": 543,
+ "code": "1F9D9 1F3FD",
+ "char": "🧙🏽",
+ "name": "⊛ mage: medium skin tone"
+ },
+ {
+ "no": 544,
+ "code": "1F9D9 1F3FE",
+ "char": "🧙🏾",
+ "name": "⊛ mage: medium-dark skin tone"
+ },
+ {
+ "no": 545,
+ "code": "1F9D9 1F3FF",
+ "char": "🧙🏿",
+ "name": "⊛ mage: dark skin tone"
+ },
+ {
+ "no": 546,
+ "code": "1F9D9 200D 2640 FE0F",
+ "char": "🧙‍♀️",
+ "name": "⊛ woman mage"
+ },
+ {
+ "no": 547,
+ "code": "1F9D9 1F3FB 200D 2640 FE0F",
+ "char": "🧙🏻‍♀️",
+ "name": "⊛ woman mage: light skin tone"
+ },
+ {
+ "no": 548,
+ "code": "1F9D9 1F3FC 200D 2640 FE0F",
+ "char": "🧙🏼‍♀️",
+ "name": "⊛ woman mage: medium-light skin tone"
+ },
+ {
+ "no": 549,
+ "code": "1F9D9 1F3FD 200D 2640 FE0F",
+ "char": "🧙🏽‍♀️",
+ "name": "⊛ woman mage: medium skin tone"
+ },
+ {
+ "no": 550,
+ "code": "1F9D9 1F3FE 200D 2640 FE0F",
+ "char": "🧙🏾‍♀️",
+ "name": "⊛ woman mage: medium-dark skin tone"
+ },
+ {
+ "no": 551,
+ "code": "1F9D9 1F3FF 200D 2640 FE0F",
+ "char": "🧙🏿‍♀️",
+ "name": "⊛ woman mage: dark skin tone"
+ },
+ {
+ "no": 552,
+ "code": "1F9D9 200D 2642 FE0F",
+ "char": "🧙‍♂️",
+ "name": "⊛ man mage"
+ },
+ {
+ "no": 553,
+ "code": "1F9D9 1F3FB 200D 2642 FE0F",
+ "char": "🧙🏻‍♂️",
+ "name": "⊛ man mage: light skin tone"
+ },
+ {
+ "no": 554,
+ "code": "1F9D9 1F3FC 200D 2642 FE0F",
+ "char": "🧙🏼‍♂️",
+ "name": "⊛ man mage: medium-light skin tone"
+ },
+ {
+ "no": 555,
+ "code": "1F9D9 1F3FD 200D 2642 FE0F",
+ "char": "🧙🏽‍♂️",
+ "name": "⊛ man mage: medium skin tone"
+ },
+ {
+ "no": 556,
+ "code": "1F9D9 1F3FE 200D 2642 FE0F",
+ "char": "🧙🏾‍♂️",
+ "name": "⊛ man mage: medium-dark skin tone"
+ },
+ {
+ "no": 557,
+ "code": "1F9D9 1F3FF 200D 2642 FE0F",
+ "char": "🧙🏿‍♂️",
+ "name": "⊛ man mage: dark skin tone"
+ },
+ {
+ "no": 558,
+ "code": "1F9DA",
+ "char": "🧚",
+ "name": "⊛ fairy"
+ },
+ {
+ "no": 559,
+ "code": "1F9DA 1F3FB",
+ "char": "🧚🏻",
+ "name": "⊛ fairy: light skin tone"
+ },
+ {
+ "no": 560,
+ "code": "1F9DA 1F3FC",
+ "char": "🧚🏼",
+ "name": "⊛ fairy: medium-light skin tone"
+ },
+ {
+ "no": 561,
+ "code": "1F9DA 1F3FD",
+ "char": "🧚🏽",
+ "name": "⊛ fairy: medium skin tone"
+ },
+ {
+ "no": 562,
+ "code": "1F9DA 1F3FE",
+ "char": "🧚🏾",
+ "name": "⊛ fairy: medium-dark skin tone"
+ },
+ {
+ "no": 563,
+ "code": "1F9DA 1F3FF",
+ "char": "🧚🏿",
+ "name": "⊛ fairy: dark skin tone"
+ },
+ {
+ "no": 564,
+ "code": "1F9DA 200D 2640 FE0F",
+ "char": "🧚‍♀️",
+ "name": "⊛ woman fairy"
+ },
+ {
+ "no": 565,
+ "code": "1F9DA 1F3FB 200D 2640 FE0F",
+ "char": "🧚🏻‍♀️",
+ "name": "⊛ woman fairy: light skin tone"
+ },
+ {
+ "no": 566,
+ "code": "1F9DA 1F3FC 200D 2640 FE0F",
+ "char": "🧚🏼‍♀️",
+ "name": "⊛ woman fairy: medium-light skin tone"
+ },
+ {
+ "no": 567,
+ "code": "1F9DA 1F3FD 200D 2640 FE0F",
+ "char": "🧚🏽‍♀️",
+ "name": "⊛ woman fairy: medium skin tone"
+ },
+ {
+ "no": 568,
+ "code": "1F9DA 1F3FE 200D 2640 FE0F",
+ "char": "🧚🏾‍♀️",
+ "name": "⊛ woman fairy: medium-dark skin tone"
+ },
+ {
+ "no": 569,
+ "code": "1F9DA 1F3FF 200D 2640 FE0F",
+ "char": "🧚🏿‍♀️",
+ "name": "⊛ woman fairy: dark skin tone"
+ },
+ {
+ "no": 570,
+ "code": "1F9DA 200D 2642 FE0F",
+ "char": "🧚‍♂️",
+ "name": "⊛ man fairy"
+ },
+ {
+ "no": 571,
+ "code": "1F9DA 1F3FB 200D 2642 FE0F",
+ "char": "🧚🏻‍♂️",
+ "name": "⊛ man fairy: light skin tone"
+ },
+ {
+ "no": 572,
+ "code": "1F9DA 1F3FC 200D 2642 FE0F",
+ "char": "🧚🏼‍♂️",
+ "name": "⊛ man fairy: medium-light skin tone"
+ },
+ {
+ "no": 573,
+ "code": "1F9DA 1F3FD 200D 2642 FE0F",
+ "char": "🧚🏽‍♂️",
+ "name": "⊛ man fairy: medium skin tone"
+ },
+ {
+ "no": 574,
+ "code": "1F9DA 1F3FE 200D 2642 FE0F",
+ "char": "🧚🏾‍♂️",
+ "name": "⊛ man fairy: medium-dark skin tone"
+ },
+ {
+ "no": 575,
+ "code": "1F9DA 1F3FF 200D 2642 FE0F",
+ "char": "🧚🏿‍♂️",
+ "name": "⊛ man fairy: dark skin tone"
+ },
+ {
+ "no": 576,
+ "code": "1F9DB",
+ "char": "🧛",
+ "name": "⊛ vampire"
+ },
+ {
+ "no": 577,
+ "code": "1F9DB 1F3FB",
+ "char": "🧛🏻",
+ "name": "⊛ vampire: light skin tone"
+ },
+ {
+ "no": 578,
+ "code": "1F9DB 1F3FC",
+ "char": "🧛🏼",
+ "name": "⊛ vampire: medium-light skin tone"
+ },
+ {
+ "no": 579,
+ "code": "1F9DB 1F3FD",
+ "char": "🧛🏽",
+ "name": "⊛ vampire: medium skin tone"
+ },
+ {
+ "no": 580,
+ "code": "1F9DB 1F3FE",
+ "char": "🧛🏾",
+ "name": "⊛ vampire: medium-dark skin tone"
+ },
+ {
+ "no": 581,
+ "code": "1F9DB 1F3FF",
+ "char": "🧛🏿",
+ "name": "⊛ vampire: dark skin tone"
+ },
+ {
+ "no": 582,
+ "code": "1F9DB 200D 2640 FE0F",
+ "char": "🧛‍♀️",
+ "name": "⊛ woman vampire"
+ },
+ {
+ "no": 583,
+ "code": "1F9DB 1F3FB 200D 2640 FE0F",
+ "char": "🧛🏻‍♀️",
+ "name": "⊛ woman vampire: light skin tone"
+ },
+ {
+ "no": 584,
+ "code": "1F9DB 1F3FC 200D 2640 FE0F",
+ "char": "🧛🏼‍♀️",
+ "name": "⊛ woman vampire: medium-light skin tone"
+ },
+ {
+ "no": 585,
+ "code": "1F9DB 1F3FD 200D 2640 FE0F",
+ "char": "🧛🏽‍♀️",
+ "name": "⊛ woman vampire: medium skin tone"
+ },
+ {
+ "no": 586,
+ "code": "1F9DB 1F3FE 200D 2640 FE0F",
+ "char": "🧛🏾‍♀️",
+ "name": "⊛ woman vampire: medium-dark skin tone"
+ },
+ {
+ "no": 587,
+ "code": "1F9DB 1F3FF 200D 2640 FE0F",
+ "char": "🧛🏿‍♀️",
+ "name": "⊛ woman vampire: dark skin tone"
+ },
+ {
+ "no": 588,
+ "code": "1F9DB 200D 2642 FE0F",
+ "char": "🧛‍♂️",
+ "name": "⊛ man vampire"
+ },
+ {
+ "no": 589,
+ "code": "1F9DB 1F3FB 200D 2642 FE0F",
+ "char": "🧛🏻‍♂️",
+ "name": "⊛ man vampire: light skin tone"
+ },
+ {
+ "no": 590,
+ "code": "1F9DB 1F3FC 200D 2642 FE0F",
+ "char": "🧛🏼‍♂️",
+ "name": "⊛ man vampire: medium-light skin tone"
+ },
+ {
+ "no": 591,
+ "code": "1F9DB 1F3FD 200D 2642 FE0F",
+ "char": "🧛🏽‍♂️",
+ "name": "⊛ man vampire: medium skin tone"
+ },
+ {
+ "no": 592,
+ "code": "1F9DB 1F3FE 200D 2642 FE0F",
+ "char": "🧛🏾‍♂️",
+ "name": "⊛ man vampire: medium-dark skin tone"
+ },
+ {
+ "no": 593,
+ "code": "1F9DB 1F3FF 200D 2642 FE0F",
+ "char": "🧛🏿‍♂️",
+ "name": "⊛ man vampire: dark skin tone"
+ },
+ {
+ "no": 594,
+ "code": "1F9DC",
+ "char": "🧜",
+ "name": "⊛ merperson"
+ },
+ {
+ "no": 595,
+ "code": "1F9DC 1F3FB",
+ "char": "🧜🏻",
+ "name": "⊛ merperson: light skin tone"
+ },
+ {
+ "no": 596,
+ "code": "1F9DC 1F3FC",
+ "char": "🧜🏼",
+ "name": "⊛ merperson: medium-light skin tone"
+ },
+ {
+ "no": 597,
+ "code": "1F9DC 1F3FD",
+ "char": "🧜🏽",
+ "name": "⊛ merperson: medium skin tone"
+ },
+ {
+ "no": 598,
+ "code": "1F9DC 1F3FE",
+ "char": "🧜🏾",
+ "name": "⊛ merperson: medium-dark skin tone"
+ },
+ {
+ "no": 599,
+ "code": "1F9DC 1F3FF",
+ "char": "🧜🏿",
+ "name": "⊛ merperson: dark skin tone"
+ },
+ {
+ "no": 600,
+ "code": "1F9DC 200D 2640 FE0F",
+ "char": "🧜‍♀️",
+ "name": "⊛ mermaid"
+ },
+ {
+ "no": 601,
+ "code": "1F9DC 1F3FB 200D 2640 FE0F",
+ "char": "🧜🏻‍♀️",
+ "name": "⊛ mermaid: light skin tone"
+ },
+ {
+ "no": 602,
+ "code": "1F9DC 1F3FC 200D 2640 FE0F",
+ "char": "🧜🏼‍♀️",
+ "name": "⊛ mermaid: medium-light skin tone"
+ },
+ {
+ "no": 603,
+ "code": "1F9DC 1F3FD 200D 2640 FE0F",
+ "char": "🧜🏽‍♀️",
+ "name": "⊛ mermaid: medium skin tone"
+ },
+ {
+ "no": 604,
+ "code": "1F9DC 1F3FE 200D 2640 FE0F",
+ "char": "🧜🏾‍♀️",
+ "name": "⊛ mermaid: medium-dark skin tone"
+ },
+ {
+ "no": 605,
+ "code": "1F9DC 1F3FF 200D 2640 FE0F",
+ "char": "🧜🏿‍♀️",
+ "name": "⊛ mermaid: dark skin tone"
+ },
+ {
+ "no": 606,
+ "code": "1F9DC 200D 2642 FE0F",
+ "char": "🧜‍♂️",
+ "name": "⊛ merman"
+ },
+ {
+ "no": 607,
+ "code": "1F9DC 1F3FB 200D 2642 FE0F",
+ "char": "🧜🏻‍♂️",
+ "name": "⊛ merman: light skin tone"
+ },
+ {
+ "no": 608,
+ "code": "1F9DC 1F3FC 200D 2642 FE0F",
+ "char": "🧜🏼‍♂️",
+ "name": "⊛ merman: medium-light skin tone"
+ },
+ {
+ "no": 609,
+ "code": "1F9DC 1F3FD 200D 2642 FE0F",
+ "char": "🧜🏽‍♂️",
+ "name": "⊛ merman: medium skin tone"
+ },
+ {
+ "no": 610,
+ "code": "1F9DC 1F3FE 200D 2642 FE0F",
+ "char": "🧜🏾‍♂️",
+ "name": "⊛ merman: medium-dark skin tone"
+ },
+ {
+ "no": 611,
+ "code": "1F9DC 1F3FF 200D 2642 FE0F",
+ "char": "🧜🏿‍♂️",
+ "name": "⊛ merman: dark skin tone"
+ },
+ {
+ "no": 612,
+ "code": "1F9DD",
+ "char": "🧝",
+ "name": "⊛ elf"
+ },
+ {
+ "no": 613,
+ "code": "1F9DD 1F3FB",
+ "char": "🧝🏻",
+ "name": "⊛ elf: light skin tone"
+ },
+ {
+ "no": 614,
+ "code": "1F9DD 1F3FC",
+ "char": "🧝🏼",
+ "name": "⊛ elf: medium-light skin tone"
+ },
+ {
+ "no": 615,
+ "code": "1F9DD 1F3FD",
+ "char": "🧝🏽",
+ "name": "⊛ elf: medium skin tone"
+ },
+ {
+ "no": 616,
+ "code": "1F9DD 1F3FE",
+ "char": "🧝🏾",
+ "name": "⊛ elf: medium-dark skin tone"
+ },
+ {
+ "no": 617,
+ "code": "1F9DD 1F3FF",
+ "char": "🧝🏿",
+ "name": "⊛ elf: dark skin tone"
+ },
+ {
+ "no": 618,
+ "code": "1F9DD 200D 2640 FE0F",
+ "char": "🧝‍♀️",
+ "name": "⊛ woman elf"
+ },
+ {
+ "no": 619,
+ "code": "1F9DD 1F3FB 200D 2640 FE0F",
+ "char": "🧝🏻‍♀️",
+ "name": "⊛ woman elf: light skin tone"
+ },
+ {
+ "no": 620,
+ "code": "1F9DD 1F3FC 200D 2640 FE0F",
+ "char": "🧝🏼‍♀️",
+ "name": "⊛ woman elf: medium-light skin tone"
+ },
+ {
+ "no": 621,
+ "code": "1F9DD 1F3FD 200D 2640 FE0F",
+ "char": "🧝🏽‍♀️",
+ "name": "⊛ woman elf: medium skin tone"
+ },
+ {
+ "no": 622,
+ "code": "1F9DD 1F3FE 200D 2640 FE0F",
+ "char": "🧝🏾‍♀️",
+ "name": "⊛ woman elf: medium-dark skin tone"
+ },
+ {
+ "no": 623,
+ "code": "1F9DD 1F3FF 200D 2640 FE0F",
+ "char": "🧝🏿‍♀️",
+ "name": "⊛ woman elf: dark skin tone"
+ },
+ {
+ "no": 624,
+ "code": "1F9DD 200D 2642 FE0F",
+ "char": "🧝‍♂️",
+ "name": "⊛ man elf"
+ },
+ {
+ "no": 625,
+ "code": "1F9DD 1F3FB 200D 2642 FE0F",
+ "char": "🧝🏻‍♂️",
+ "name": "⊛ man elf: light skin tone"
+ },
+ {
+ "no": 626,
+ "code": "1F9DD 1F3FC 200D 2642 FE0F",
+ "char": "🧝🏼‍♂️",
+ "name": "⊛ man elf: medium-light skin tone"
+ },
+ {
+ "no": 627,
+ "code": "1F9DD 1F3FD 200D 2642 FE0F",
+ "char": "🧝🏽‍♂️",
+ "name": "⊛ man elf: medium skin tone"
+ },
+ {
+ "no": 628,
+ "code": "1F9DD 1F3FE 200D 2642 FE0F",
+ "char": "🧝🏾‍♂️",
+ "name": "⊛ man elf: medium-dark skin tone"
+ },
+ {
+ "no": 629,
+ "code": "1F9DD 1F3FF 200D 2642 FE0F",
+ "char": "🧝🏿‍♂️",
+ "name": "⊛ man elf: dark skin tone"
+ },
+ {
+ "no": 630,
+ "code": "1F9DE",
+ "char": "🧞",
+ "name": "⊛ genie"
+ },
+ {
+ "no": 631,
+ "code": "1F9DE 200D 2640 FE0F",
+ "char": "🧞‍♀️",
+ "name": "⊛ woman genie"
+ },
+ {
+ "no": 632,
+ "code": "1F9DE 200D 2642 FE0F",
+ "char": "🧞‍♂️",
+ "name": "⊛ man genie"
+ },
+ {
+ "no": 633,
+ "code": "1F9DF",
+ "char": "🧟",
+ "name": "⊛ zombie"
+ },
+ {
+ "no": 634,
+ "code": "1F9DF 200D 2640 FE0F",
+ "char": "🧟‍♀️",
+ "name": "⊛ woman zombie"
+ },
+ {
+ "no": 635,
+ "code": "1F9DF 200D 2642 FE0F",
+ "char": "🧟‍♂️",
+ "name": "⊛ man zombie"
+ },
+ {
+ "no": 636,
+ "code": "1F64D",
+ "char": "🙍",
+ "name": "person frowning"
+ },
+ {
+ "no": 637,
+ "code": "1F64D 1F3FB",
+ "char": "🙍🏻",
+ "name": "person frowning: light skin tone"
+ },
+ {
+ "no": 638,
+ "code": "1F64D 1F3FC",
+ "char": "🙍🏼",
+ "name": "person frowning: medium-light skin tone"
+ },
+ {
+ "no": 639,
+ "code": "1F64D 1F3FD",
+ "char": "🙍🏽",
+ "name": "person frowning: medium skin tone"
+ },
+ {
+ "no": 640,
+ "code": "1F64D 1F3FE",
+ "char": "🙍🏾",
+ "name": "person frowning: medium-dark skin tone"
+ },
+ {
+ "no": 641,
+ "code": "1F64D 1F3FF",
+ "char": "🙍🏿",
+ "name": "person frowning: dark skin tone"
+ },
+ {
+ "no": 642,
+ "code": "1F64D 200D 2642 FE0F",
+ "char": "🙍‍♂️",
+ "name": "man frowning"
+ },
+ {
+ "no": 643,
+ "code": "1F64D 1F3FB 200D 2642 FE0F",
+ "char": "🙍🏻‍♂️",
+ "name": "man frowning: light skin tone"
+ },
+ {
+ "no": 644,
+ "code": "1F64D 1F3FC 200D 2642 FE0F",
+ "char": "🙍🏼‍♂️",
+ "name": "man frowning: medium-light skin tone"
+ },
+ {
+ "no": 645,
+ "code": "1F64D 1F3FD 200D 2642 FE0F",
+ "char": "🙍🏽‍♂️",
+ "name": "man frowning: medium skin tone"
+ },
+ {
+ "no": 646,
+ "code": "1F64D 1F3FE 200D 2642 FE0F",
+ "char": "🙍🏾‍♂️",
+ "name": "man frowning: medium-dark skin tone"
+ },
+ {
+ "no": 647,
+ "code": "1F64D 1F3FF 200D 2642 FE0F",
+ "char": "🙍🏿‍♂️",
+ "name": "man frowning: dark skin tone"
+ },
+ {
+ "no": 648,
+ "code": "1F64D 200D 2640 FE0F",
+ "char": "🙍‍♀️",
+ "name": "woman frowning"
+ },
+ {
+ "no": 649,
+ "code": "1F64D 1F3FB 200D 2640 FE0F",
+ "char": "🙍🏻‍♀️",
+ "name": "woman frowning: light skin tone"
+ },
+ {
+ "no": 650,
+ "code": "1F64D 1F3FC 200D 2640 FE0F",
+ "char": "🙍🏼‍♀️",
+ "name": "woman frowning: medium-light skin tone"
+ },
+ {
+ "no": 651,
+ "code": "1F64D 1F3FD 200D 2640 FE0F",
+ "char": "🙍🏽‍♀️",
+ "name": "woman frowning: medium skin tone"
+ },
+ {
+ "no": 652,
+ "code": "1F64D 1F3FE 200D 2640 FE0F",
+ "char": "🙍🏾‍♀️",
+ "name": "woman frowning: medium-dark skin tone"
+ },
+ {
+ "no": 653,
+ "code": "1F64D 1F3FF 200D 2640 FE0F",
+ "char": "🙍🏿‍♀️",
+ "name": "woman frowning: dark skin tone"
+ },
+ {
+ "no": 654,
+ "code": "1F64E",
+ "char": "🙎",
+ "name": "person pouting"
+ },
+ {
+ "no": 655,
+ "code": "1F64E 1F3FB",
+ "char": "🙎🏻",
+ "name": "person pouting: light skin tone"
+ },
+ {
+ "no": 656,
+ "code": "1F64E 1F3FC",
+ "char": "🙎🏼",
+ "name": "person pouting: medium-light skin tone"
+ },
+ {
+ "no": 657,
+ "code": "1F64E 1F3FD",
+ "char": "🙎🏽",
+ "name": "person pouting: medium skin tone"
+ },
+ {
+ "no": 658,
+ "code": "1F64E 1F3FE",
+ "char": "🙎🏾",
+ "name": "person pouting: medium-dark skin tone"
+ },
+ {
+ "no": 659,
+ "code": "1F64E 1F3FF",
+ "char": "🙎🏿",
+ "name": "person pouting: dark skin tone"
+ },
+ {
+ "no": 660,
+ "code": "1F64E 200D 2642 FE0F",
+ "char": "🙎‍♂️",
+ "name": "man pouting"
+ },
+ {
+ "no": 661,
+ "code": "1F64E 1F3FB 200D 2642 FE0F",
+ "char": "🙎🏻‍♂️",
+ "name": "man pouting: light skin tone"
+ },
+ {
+ "no": 662,
+ "code": "1F64E 1F3FC 200D 2642 FE0F",
+ "char": "🙎🏼‍♂️",
+ "name": "man pouting: medium-light skin tone"
+ },
+ {
+ "no": 663,
+ "code": "1F64E 1F3FD 200D 2642 FE0F",
+ "char": "🙎🏽‍♂️",
+ "name": "man pouting: medium skin tone"
+ },
+ {
+ "no": 664,
+ "code": "1F64E 1F3FE 200D 2642 FE0F",
+ "char": "🙎🏾‍♂️",
+ "name": "man pouting: medium-dark skin tone"
+ },
+ {
+ "no": 665,
+ "code": "1F64E 1F3FF 200D 2642 FE0F",
+ "char": "🙎🏿‍♂️",
+ "name": "man pouting: dark skin tone"
+ },
+ {
+ "no": 666,
+ "code": "1F64E 200D 2640 FE0F",
+ "char": "🙎‍♀️",
+ "name": "woman pouting"
+ },
+ {
+ "no": 667,
+ "code": "1F64E 1F3FB 200D 2640 FE0F",
+ "char": "🙎🏻‍♀️",
+ "name": "woman pouting: light skin tone"
+ },
+ {
+ "no": 668,
+ "code": "1F64E 1F3FC 200D 2640 FE0F",
+ "char": "🙎🏼‍♀️",
+ "name": "woman pouting: medium-light skin tone"
+ },
+ {
+ "no": 669,
+ "code": "1F64E 1F3FD 200D 2640 FE0F",
+ "char": "🙎🏽‍♀️",
+ "name": "woman pouting: medium skin tone"
+ },
+ {
+ "no": 670,
+ "code": "1F64E 1F3FE 200D 2640 FE0F",
+ "char": "🙎🏾‍♀️",
+ "name": "woman pouting: medium-dark skin tone"
+ },
+ {
+ "no": 671,
+ "code": "1F64E 1F3FF 200D 2640 FE0F",
+ "char": "🙎🏿‍♀️",
+ "name": "woman pouting: dark skin tone"
+ },
+ {
+ "no": 672,
+ "code": "1F645",
+ "char": "🙅",
+ "name": "person gesturing NO"
+ },
+ {
+ "no": 673,
+ "code": "1F645 1F3FB",
+ "char": "🙅🏻",
+ "name": "person gesturing NO: light skin tone"
+ },
+ {
+ "no": 674,
+ "code": "1F645 1F3FC",
+ "char": "🙅🏼",
+ "name": "person gesturing NO: medium-light skin tone"
+ },
+ {
+ "no": 675,
+ "code": "1F645 1F3FD",
+ "char": "🙅🏽",
+ "name": "person gesturing NO: medium skin tone"
+ },
+ {
+ "no": 676,
+ "code": "1F645 1F3FE",
+ "char": "🙅🏾",
+ "name": "person gesturing NO: medium-dark skin tone"
+ },
+ {
+ "no": 677,
+ "code": "1F645 1F3FF",
+ "char": "🙅🏿",
+ "name": "person gesturing NO: dark skin tone"
+ },
+ {
+ "no": 678,
+ "code": "1F645 200D 2642 FE0F",
+ "char": "🙅‍♂️",
+ "name": "man gesturing NO"
+ },
+ {
+ "no": 679,
+ "code": "1F645 1F3FB 200D 2642 FE0F",
+ "char": "🙅🏻‍♂️",
+ "name": "man gesturing NO: light skin tone"
+ },
+ {
+ "no": 680,
+ "code": "1F645 1F3FC 200D 2642 FE0F",
+ "char": "🙅🏼‍♂️",
+ "name": "man gesturing NO: medium-light skin tone"
+ },
+ {
+ "no": 681,
+ "code": "1F645 1F3FD 200D 2642 FE0F",
+ "char": "🙅🏽‍♂️",
+ "name": "man gesturing NO: medium skin tone"
+ },
+ {
+ "no": 682,
+ "code": "1F645 1F3FE 200D 2642 FE0F",
+ "char": "🙅🏾‍♂️",
+ "name": "man gesturing NO: medium-dark skin tone"
+ },
+ {
+ "no": 683,
+ "code": "1F645 1F3FF 200D 2642 FE0F",
+ "char": "🙅🏿‍♂️",
+ "name": "man gesturing NO: dark skin tone"
+ },
+ {
+ "no": 684,
+ "code": "1F645 200D 2640 FE0F",
+ "char": "🙅‍♀️",
+ "name": "woman gesturing NO"
+ },
+ {
+ "no": 685,
+ "code": "1F645 1F3FB 200D 2640 FE0F",
+ "char": "🙅🏻‍♀️",
+ "name": "woman gesturing NO: light skin tone"
+ },
+ {
+ "no": 686,
+ "code": "1F645 1F3FC 200D 2640 FE0F",
+ "char": "🙅🏼‍♀️",
+ "name": "woman gesturing NO: medium-light skin tone"
+ },
+ {
+ "no": 687,
+ "code": "1F645 1F3FD 200D 2640 FE0F",
+ "char": "🙅🏽‍♀️",
+ "name": "woman gesturing NO: medium skin tone"
+ },
+ {
+ "no": 688,
+ "code": "1F645 1F3FE 200D 2640 FE0F",
+ "char": "🙅🏾‍♀️",
+ "name": "woman gesturing NO: medium-dark skin tone"
+ },
+ {
+ "no": 689,
+ "code": "1F645 1F3FF 200D 2640 FE0F",
+ "char": "🙅🏿‍♀️",
+ "name": "woman gesturing NO: dark skin tone"
+ },
+ {
+ "no": 690,
+ "code": "1F646",
+ "char": "🙆",
+ "name": "person gesturing OK"
+ },
+ {
+ "no": 691,
+ "code": "1F646 1F3FB",
+ "char": "🙆🏻",
+ "name": "person gesturing OK: light skin tone"
+ },
+ {
+ "no": 692,
+ "code": "1F646 1F3FC",
+ "char": "🙆🏼",
+ "name": "person gesturing OK: medium-light skin tone"
+ },
+ {
+ "no": 693,
+ "code": "1F646 1F3FD",
+ "char": "🙆🏽",
+ "name": "person gesturing OK: medium skin tone"
+ },
+ {
+ "no": 694,
+ "code": "1F646 1F3FE",
+ "char": "🙆🏾",
+ "name": "person gesturing OK: medium-dark skin tone"
+ },
+ {
+ "no": 695,
+ "code": "1F646 1F3FF",
+ "char": "🙆🏿",
+ "name": "person gesturing OK: dark skin tone"
+ },
+ {
+ "no": 696,
+ "code": "1F646 200D 2642 FE0F",
+ "char": "🙆‍♂️",
+ "name": "man gesturing OK"
+ },
+ {
+ "no": 697,
+ "code": "1F646 1F3FB 200D 2642 FE0F",
+ "char": "🙆🏻‍♂️",
+ "name": "man gesturing OK: light skin tone"
+ },
+ {
+ "no": 698,
+ "code": "1F646 1F3FC 200D 2642 FE0F",
+ "char": "🙆🏼‍♂️",
+ "name": "man gesturing OK: medium-light skin tone"
+ },
+ {
+ "no": 699,
+ "code": "1F646 1F3FD 200D 2642 FE0F",
+ "char": "🙆🏽‍♂️",
+ "name": "man gesturing OK: medium skin tone"
+ },
+ {
+ "no": 700,
+ "code": "1F646 1F3FE 200D 2642 FE0F",
+ "char": "🙆🏾‍♂️",
+ "name": "man gesturing OK: medium-dark skin tone"
+ },
+ {
+ "no": 701,
+ "code": "1F646 1F3FF 200D 2642 FE0F",
+ "char": "🙆🏿‍♂️",
+ "name": "man gesturing OK: dark skin tone"
+ },
+ {
+ "no": 702,
+ "code": "1F646 200D 2640 FE0F",
+ "char": "🙆‍♀️",
+ "name": "woman gesturing OK"
+ },
+ {
+ "no": 703,
+ "code": "1F646 1F3FB 200D 2640 FE0F",
+ "char": "🙆🏻‍♀️",
+ "name": "woman gesturing OK: light skin tone"
+ },
+ {
+ "no": 704,
+ "code": "1F646 1F3FC 200D 2640 FE0F",
+ "char": "🙆🏼‍♀️",
+ "name": "woman gesturing OK: medium-light skin tone"
+ },
+ {
+ "no": 705,
+ "code": "1F646 1F3FD 200D 2640 FE0F",
+ "char": "🙆🏽‍♀️",
+ "name": "woman gesturing OK: medium skin tone"
+ },
+ {
+ "no": 706,
+ "code": "1F646 1F3FE 200D 2640 FE0F",
+ "char": "🙆🏾‍♀️",
+ "name": "woman gesturing OK: medium-dark skin tone"
+ },
+ {
+ "no": 707,
+ "code": "1F646 1F3FF 200D 2640 FE0F",
+ "char": "🙆🏿‍♀️",
+ "name": "woman gesturing OK: dark skin tone"
+ },
+ {
+ "no": 708,
+ "code": "1F481",
+ "char": "💁",
+ "name": "person tipping hand"
+ },
+ {
+ "no": 709,
+ "code": "1F481 1F3FB",
+ "char": "💁🏻",
+ "name": "person tipping hand: light skin tone"
+ },
+ {
+ "no": 710,
+ "code": "1F481 1F3FC",
+ "char": "💁🏼",
+ "name": "person tipping hand: medium-light skin tone"
+ },
+ {
+ "no": 711,
+ "code": "1F481 1F3FD",
+ "char": "💁🏽",
+ "name": "person tipping hand: medium skin tone"
+ },
+ {
+ "no": 712,
+ "code": "1F481 1F3FE",
+ "char": "💁🏾",
+ "name": "person tipping hand: medium-dark skin tone"
+ },
+ {
+ "no": 713,
+ "code": "1F481 1F3FF",
+ "char": "💁🏿",
+ "name": "person tipping hand: dark skin tone"
+ },
+ {
+ "no": 714,
+ "code": "1F481 200D 2642 FE0F",
+ "char": "💁‍♂️",
+ "name": "man tipping hand"
+ },
+ {
+ "no": 715,
+ "code": "1F481 1F3FB 200D 2642 FE0F",
+ "char": "💁🏻‍♂️",
+ "name": "man tipping hand: light skin tone"
+ },
+ {
+ "no": 716,
+ "code": "1F481 1F3FC 200D 2642 FE0F",
+ "char": "💁🏼‍♂️",
+ "name": "man tipping hand: medium-light skin tone"
+ },
+ {
+ "no": 717,
+ "code": "1F481 1F3FD 200D 2642 FE0F",
+ "char": "💁🏽‍♂️",
+ "name": "man tipping hand: medium skin tone"
+ },
+ {
+ "no": 718,
+ "code": "1F481 1F3FE 200D 2642 FE0F",
+ "char": "💁🏾‍♂️",
+ "name": "man tipping hand: medium-dark skin tone"
+ },
+ {
+ "no": 719,
+ "code": "1F481 1F3FF 200D 2642 FE0F",
+ "char": "💁🏿‍♂️",
+ "name": "man tipping hand: dark skin tone"
+ },
+ {
+ "no": 720,
+ "code": "1F481 200D 2640 FE0F",
+ "char": "💁‍♀️",
+ "name": "woman tipping hand"
+ },
+ {
+ "no": 721,
+ "code": "1F481 1F3FB 200D 2640 FE0F",
+ "char": "💁🏻‍♀️",
+ "name": "woman tipping hand: light skin tone"
+ },
+ {
+ "no": 722,
+ "code": "1F481 1F3FC 200D 2640 FE0F",
+ "char": "💁🏼‍♀️",
+ "name": "woman tipping hand: medium-light skin tone"
+ },
+ {
+ "no": 723,
+ "code": "1F481 1F3FD 200D 2640 FE0F",
+ "char": "💁🏽‍♀️",
+ "name": "woman tipping hand: medium skin tone"
+ },
+ {
+ "no": 724,
+ "code": "1F481 1F3FE 200D 2640 FE0F",
+ "char": "💁🏾‍♀️",
+ "name": "woman tipping hand: medium-dark skin tone"
+ },
+ {
+ "no": 725,
+ "code": "1F481 1F3FF 200D 2640 FE0F",
+ "char": "💁🏿‍♀️",
+ "name": "woman tipping hand: dark skin tone"
+ },
+ {
+ "no": 726,
+ "code": "1F64B",
+ "char": "🙋",
+ "name": "person raising hand"
+ },
+ {
+ "no": 727,
+ "code": "1F64B 1F3FB",
+ "char": "🙋🏻",
+ "name": "person raising hand: light skin tone"
+ },
+ {
+ "no": 728,
+ "code": "1F64B 1F3FC",
+ "char": "🙋🏼",
+ "name": "person raising hand: medium-light skin tone"
+ },
+ {
+ "no": 729,
+ "code": "1F64B 1F3FD",
+ "char": "🙋🏽",
+ "name": "person raising hand: medium skin tone"
+ },
+ {
+ "no": 730,
+ "code": "1F64B 1F3FE",
+ "char": "🙋🏾",
+ "name": "person raising hand: medium-dark skin tone"
+ },
+ {
+ "no": 731,
+ "code": "1F64B 1F3FF",
+ "char": "🙋🏿",
+ "name": "person raising hand: dark skin tone"
+ },
+ {
+ "no": 732,
+ "code": "1F64B 200D 2642 FE0F",
+ "char": "🙋‍♂️",
+ "name": "man raising hand"
+ },
+ {
+ "no": 733,
+ "code": "1F64B 1F3FB 200D 2642 FE0F",
+ "char": "🙋🏻‍♂️",
+ "name": "man raising hand: light skin tone"
+ },
+ {
+ "no": 734,
+ "code": "1F64B 1F3FC 200D 2642 FE0F",
+ "char": "🙋🏼‍♂️",
+ "name": "man raising hand: medium-light skin tone"
+ },
+ {
+ "no": 735,
+ "code": "1F64B 1F3FD 200D 2642 FE0F",
+ "char": "🙋🏽‍♂️",
+ "name": "man raising hand: medium skin tone"
+ },
+ {
+ "no": 736,
+ "code": "1F64B 1F3FE 200D 2642 FE0F",
+ "char": "🙋🏾‍♂️",
+ "name": "man raising hand: medium-dark skin tone"
+ },
+ {
+ "no": 737,
+ "code": "1F64B 1F3FF 200D 2642 FE0F",
+ "char": "🙋🏿‍♂️",
+ "name": "man raising hand: dark skin tone"
+ },
+ {
+ "no": 738,
+ "code": "1F64B 200D 2640 FE0F",
+ "char": "🙋‍♀️",
+ "name": "woman raising hand"
+ },
+ {
+ "no": 739,
+ "code": "1F64B 1F3FB 200D 2640 FE0F",
+ "char": "🙋🏻‍♀️",
+ "name": "woman raising hand: light skin tone"
+ },
+ {
+ "no": 740,
+ "code": "1F64B 1F3FC 200D 2640 FE0F",
+ "char": "🙋🏼‍♀️",
+ "name": "woman raising hand: medium-light skin tone"
+ },
+ {
+ "no": 741,
+ "code": "1F64B 1F3FD 200D 2640 FE0F",
+ "char": "🙋🏽‍♀️",
+ "name": "woman raising hand: medium skin tone"
+ },
+ {
+ "no": 742,
+ "code": "1F64B 1F3FE 200D 2640 FE0F",
+ "char": "🙋🏾‍♀️",
+ "name": "woman raising hand: medium-dark skin tone"
+ },
+ {
+ "no": 743,
+ "code": "1F64B 1F3FF 200D 2640 FE0F",
+ "char": "🙋🏿‍♀️",
+ "name": "woman raising hand: dark skin tone"
+ },
+ {
+ "no": 744,
+ "code": "1F647",
+ "char": "🙇",
+ "name": "person bowing"
+ },
+ {
+ "no": 745,
+ "code": "1F647 1F3FB",
+ "char": "🙇🏻",
+ "name": "person bowing: light skin tone"
+ },
+ {
+ "no": 746,
+ "code": "1F647 1F3FC",
+ "char": "🙇🏼",
+ "name": "person bowing: medium-light skin tone"
+ },
+ {
+ "no": 747,
+ "code": "1F647 1F3FD",
+ "char": "🙇🏽",
+ "name": "person bowing: medium skin tone"
+ },
+ {
+ "no": 748,
+ "code": "1F647 1F3FE",
+ "char": "🙇🏾",
+ "name": "person bowing: medium-dark skin tone"
+ },
+ {
+ "no": 749,
+ "code": "1F647 1F3FF",
+ "char": "🙇🏿",
+ "name": "person bowing: dark skin tone"
+ },
+ {
+ "no": 750,
+ "code": "1F647 200D 2642 FE0F",
+ "char": "🙇‍♂️",
+ "name": "man bowing"
+ },
+ {
+ "no": 751,
+ "code": "1F647 1F3FB 200D 2642 FE0F",
+ "char": "🙇🏻‍♂️",
+ "name": "man bowing: light skin tone"
+ },
+ {
+ "no": 752,
+ "code": "1F647 1F3FC 200D 2642 FE0F",
+ "char": "🙇🏼‍♂️",
+ "name": "man bowing: medium-light skin tone"
+ },
+ {
+ "no": 753,
+ "code": "1F647 1F3FD 200D 2642 FE0F",
+ "char": "🙇🏽‍♂️",
+ "name": "man bowing: medium skin tone"
+ },
+ {
+ "no": 754,
+ "code": "1F647 1F3FE 200D 2642 FE0F",
+ "char": "🙇🏾‍♂️",
+ "name": "man bowing: medium-dark skin tone"
+ },
+ {
+ "no": 755,
+ "code": "1F647 1F3FF 200D 2642 FE0F",
+ "char": "🙇🏿‍♂️",
+ "name": "man bowing: dark skin tone"
+ },
+ {
+ "no": 756,
+ "code": "1F647 200D 2640 FE0F",
+ "char": "🙇‍♀️",
+ "name": "woman bowing"
+ },
+ {
+ "no": 757,
+ "code": "1F647 1F3FB 200D 2640 FE0F",
+ "char": "🙇🏻‍♀️",
+ "name": "woman bowing: light skin tone"
+ },
+ {
+ "no": 758,
+ "code": "1F647 1F3FC 200D 2640 FE0F",
+ "char": "🙇🏼‍♀️",
+ "name": "woman bowing: medium-light skin tone"
+ },
+ {
+ "no": 759,
+ "code": "1F647 1F3FD 200D 2640 FE0F",
+ "char": "🙇🏽‍♀️",
+ "name": "woman bowing: medium skin tone"
+ },
+ {
+ "no": 760,
+ "code": "1F647 1F3FE 200D 2640 FE0F",
+ "char": "🙇🏾‍♀️",
+ "name": "woman bowing: medium-dark skin tone"
+ },
+ {
+ "no": 761,
+ "code": "1F647 1F3FF 200D 2640 FE0F",
+ "char": "🙇🏿‍♀️",
+ "name": "woman bowing: dark skin tone"
+ },
+ {
+ "no": 762,
+ "code": "1F926",
+ "char": "🤦",
+ "name": "person facepalming"
+ },
+ {
+ "no": 763,
+ "code": "1F926 1F3FB",
+ "char": "🤦🏻",
+ "name": "person facepalming: light skin tone"
+ },
+ {
+ "no": 764,
+ "code": "1F926 1F3FC",
+ "char": "🤦🏼",
+ "name": "person facepalming: medium-light skin tone"
+ },
+ {
+ "no": 765,
+ "code": "1F926 1F3FD",
+ "char": "🤦🏽",
+ "name": "person facepalming: medium skin tone"
+ },
+ {
+ "no": 766,
+ "code": "1F926 1F3FE",
+ "char": "🤦🏾",
+ "name": "person facepalming: medium-dark skin tone"
+ },
+ {
+ "no": 767,
+ "code": "1F926 1F3FF",
+ "char": "🤦🏿",
+ "name": "person facepalming: dark skin tone"
+ },
+ {
+ "no": 768,
+ "code": "1F926 200D 2642 FE0F",
+ "char": "🤦‍♂️",
+ "name": "man facepalming"
+ },
+ {
+ "no": 769,
+ "code": "1F926 1F3FB 200D 2642 FE0F",
+ "char": "🤦🏻‍♂️",
+ "name": "man facepalming: light skin tone"
+ },
+ {
+ "no": 770,
+ "code": "1F926 1F3FC 200D 2642 FE0F",
+ "char": "🤦🏼‍♂️",
+ "name": "man facepalming: medium-light skin tone"
+ },
+ {
+ "no": 771,
+ "code": "1F926 1F3FD 200D 2642 FE0F",
+ "char": "🤦🏽‍♂️",
+ "name": "man facepalming: medium skin tone"
+ },
+ {
+ "no": 772,
+ "code": "1F926 1F3FE 200D 2642 FE0F",
+ "char": "🤦🏾‍♂️",
+ "name": "man facepalming: medium-dark skin tone"
+ },
+ {
+ "no": 773,
+ "code": "1F926 1F3FF 200D 2642 FE0F",
+ "char": "🤦🏿‍♂️",
+ "name": "man facepalming: dark skin tone"
+ },
+ {
+ "no": 774,
+ "code": "1F926 200D 2640 FE0F",
+ "char": "🤦‍♀️",
+ "name": "woman facepalming"
+ },
+ {
+ "no": 775,
+ "code": "1F926 1F3FB 200D 2640 FE0F",
+ "char": "🤦🏻‍♀️",
+ "name": "woman facepalming: light skin tone"
+ },
+ {
+ "no": 776,
+ "code": "1F926 1F3FC 200D 2640 FE0F",
+ "char": "🤦🏼‍♀️",
+ "name": "woman facepalming: medium-light skin tone"
+ },
+ {
+ "no": 777,
+ "code": "1F926 1F3FD 200D 2640 FE0F",
+ "char": "🤦🏽‍♀️",
+ "name": "woman facepalming: medium skin tone"
+ },
+ {
+ "no": 778,
+ "code": "1F926 1F3FE 200D 2640 FE0F",
+ "char": "🤦🏾‍♀️",
+ "name": "woman facepalming: medium-dark skin tone"
+ },
+ {
+ "no": 779,
+ "code": "1F926 1F3FF 200D 2640 FE0F",
+ "char": "🤦🏿‍♀️",
+ "name": "woman facepalming: dark skin tone"
+ },
+ {
+ "no": 780,
+ "code": "1F937",
+ "char": "🤷",
+ "name": "person shrugging"
+ },
+ {
+ "no": 781,
+ "code": "1F937 1F3FB",
+ "char": "🤷🏻",
+ "name": "person shrugging: light skin tone"
+ },
+ {
+ "no": 782,
+ "code": "1F937 1F3FC",
+ "char": "🤷🏼",
+ "name": "person shrugging: medium-light skin tone"
+ },
+ {
+ "no": 783,
+ "code": "1F937 1F3FD",
+ "char": "🤷🏽",
+ "name": "person shrugging: medium skin tone"
+ },
+ {
+ "no": 784,
+ "code": "1F937 1F3FE",
+ "char": "🤷🏾",
+ "name": "person shrugging: medium-dark skin tone"
+ },
+ {
+ "no": 785,
+ "code": "1F937 1F3FF",
+ "char": "🤷🏿",
+ "name": "person shrugging: dark skin tone"
+ },
+ {
+ "no": 786,
+ "code": "1F937 200D 2642 FE0F",
+ "char": "🤷‍♂️",
+ "name": "man shrugging"
+ },
+ {
+ "no": 787,
+ "code": "1F937 1F3FB 200D 2642 FE0F",
+ "char": "🤷🏻‍♂️",
+ "name": "man shrugging: light skin tone"
+ },
+ {
+ "no": 788,
+ "code": "1F937 1F3FC 200D 2642 FE0F",
+ "char": "🤷🏼‍♂️",
+ "name": "man shrugging: medium-light skin tone"
+ },
+ {
+ "no": 789,
+ "code": "1F937 1F3FD 200D 2642 FE0F",
+ "char": "🤷🏽‍♂️",
+ "name": "man shrugging: medium skin tone"
+ },
+ {
+ "no": 790,
+ "code": "1F937 1F3FE 200D 2642 FE0F",
+ "char": "🤷🏾‍♂️",
+ "name": "man shrugging: medium-dark skin tone"
+ },
+ {
+ "no": 791,
+ "code": "1F937 1F3FF 200D 2642 FE0F",
+ "char": "🤷🏿‍♂️",
+ "name": "man shrugging: dark skin tone"
+ },
+ {
+ "no": 792,
+ "code": "1F937 200D 2640 FE0F",
+ "char": "🤷‍♀️",
+ "name": "woman shrugging"
+ },
+ {
+ "no": 793,
+ "code": "1F937 1F3FB 200D 2640 FE0F",
+ "char": "🤷🏻‍♀️",
+ "name": "woman shrugging: light skin tone"
+ },
+ {
+ "no": 794,
+ "code": "1F937 1F3FC 200D 2640 FE0F",
+ "char": "🤷🏼‍♀️",
+ "name": "woman shrugging: medium-light skin tone"
+ },
+ {
+ "no": 795,
+ "code": "1F937 1F3FD 200D 2640 FE0F",
+ "char": "🤷🏽‍♀️",
+ "name": "woman shrugging: medium skin tone"
+ },
+ {
+ "no": 796,
+ "code": "1F937 1F3FE 200D 2640 FE0F",
+ "char": "🤷🏾‍♀️",
+ "name": "woman shrugging: medium-dark skin tone"
+ },
+ {
+ "no": 797,
+ "code": "1F937 1F3FF 200D 2640 FE0F",
+ "char": "🤷🏿‍♀️",
+ "name": "woman shrugging: dark skin tone"
+ },
+ {
+ "no": 798,
+ "code": "1F486",
+ "char": "💆",
+ "name": "person getting massage"
+ },
+ {
+ "no": 799,
+ "code": "1F486 1F3FB",
+ "char": "💆🏻",
+ "name": "person getting massage: light skin tone"
+ },
+ {
+ "no": 800,
+ "code": "1F486 1F3FC",
+ "char": "💆🏼",
+ "name": "person getting massage: medium-light skin tone"
+ },
+ {
+ "no": 801,
+ "code": "1F486 1F3FD",
+ "char": "💆🏽",
+ "name": "person getting massage: medium skin tone"
+ },
+ {
+ "no": 802,
+ "code": "1F486 1F3FE",
+ "char": "💆🏾",
+ "name": "person getting massage: medium-dark skin tone"
+ },
+ {
+ "no": 803,
+ "code": "1F486 1F3FF",
+ "char": "💆🏿",
+ "name": "person getting massage: dark skin tone"
+ },
+ {
+ "no": 804,
+ "code": "1F486 200D 2642 FE0F",
+ "char": "💆‍♂️",
+ "name": "man getting massage"
+ },
+ {
+ "no": 805,
+ "code": "1F486 1F3FB 200D 2642 FE0F",
+ "char": "💆🏻‍♂️",
+ "name": "man getting massage: light skin tone"
+ },
+ {
+ "no": 806,
+ "code": "1F486 1F3FC 200D 2642 FE0F",
+ "char": "💆🏼‍♂️",
+ "name": "man getting massage: medium-light skin tone"
+ },
+ {
+ "no": 807,
+ "code": "1F486 1F3FD 200D 2642 FE0F",
+ "char": "💆🏽‍♂️",
+ "name": "man getting massage: medium skin tone"
+ },
+ {
+ "no": 808,
+ "code": "1F486 1F3FE 200D 2642 FE0F",
+ "char": "💆🏾‍♂️",
+ "name": "man getting massage: medium-dark skin tone"
+ },
+ {
+ "no": 809,
+ "code": "1F486 1F3FF 200D 2642 FE0F",
+ "char": "💆🏿‍♂️",
+ "name": "man getting massage: dark skin tone"
+ },
+ {
+ "no": 810,
+ "code": "1F486 200D 2640 FE0F",
+ "char": "💆‍♀️",
+ "name": "woman getting massage"
+ },
+ {
+ "no": 811,
+ "code": "1F486 1F3FB 200D 2640 FE0F",
+ "char": "💆🏻‍♀️",
+ "name": "woman getting massage: light skin tone"
+ },
+ {
+ "no": 812,
+ "code": "1F486 1F3FC 200D 2640 FE0F",
+ "char": "💆🏼‍♀️",
+ "name": "woman getting massage: medium-light skin tone"
+ },
+ {
+ "no": 813,
+ "code": "1F486 1F3FD 200D 2640 FE0F",
+ "char": "💆🏽‍♀️",
+ "name": "woman getting massage: medium skin tone"
+ },
+ {
+ "no": 814,
+ "code": "1F486 1F3FE 200D 2640 FE0F",
+ "char": "💆🏾‍♀️",
+ "name": "woman getting massage: medium-dark skin tone"
+ },
+ {
+ "no": 815,
+ "code": "1F486 1F3FF 200D 2640 FE0F",
+ "char": "💆🏿‍♀️",
+ "name": "woman getting massage: dark skin tone"
+ },
+ {
+ "no": 816,
+ "code": "1F487",
+ "char": "💇",
+ "name": "person getting haircut"
+ },
+ {
+ "no": 817,
+ "code": "1F487 1F3FB",
+ "char": "💇🏻",
+ "name": "person getting haircut: light skin tone"
+ },
+ {
+ "no": 818,
+ "code": "1F487 1F3FC",
+ "char": "💇🏼",
+ "name": "person getting haircut: medium-light skin tone"
+ },
+ {
+ "no": 819,
+ "code": "1F487 1F3FD",
+ "char": "💇🏽",
+ "name": "person getting haircut: medium skin tone"
+ },
+ {
+ "no": 820,
+ "code": "1F487 1F3FE",
+ "char": "💇🏾",
+ "name": "person getting haircut: medium-dark skin tone"
+ },
+ {
+ "no": 821,
+ "code": "1F487 1F3FF",
+ "char": "💇🏿",
+ "name": "person getting haircut: dark skin tone"
+ },
+ {
+ "no": 822,
+ "code": "1F487 200D 2642 FE0F",
+ "char": "💇‍♂️",
+ "name": "man getting haircut"
+ },
+ {
+ "no": 823,
+ "code": "1F487 1F3FB 200D 2642 FE0F",
+ "char": "💇🏻‍♂️",
+ "name": "man getting haircut: light skin tone"
+ },
+ {
+ "no": 824,
+ "code": "1F487 1F3FC 200D 2642 FE0F",
+ "char": "💇🏼‍♂️",
+ "name": "man getting haircut: medium-light skin tone"
+ },
+ {
+ "no": 825,
+ "code": "1F487 1F3FD 200D 2642 FE0F",
+ "char": "💇🏽‍♂️",
+ "name": "man getting haircut: medium skin tone"
+ },
+ {
+ "no": 826,
+ "code": "1F487 1F3FE 200D 2642 FE0F",
+ "char": "💇🏾‍♂️",
+ "name": "man getting haircut: medium-dark skin tone"
+ },
+ {
+ "no": 827,
+ "code": "1F487 1F3FF 200D 2642 FE0F",
+ "char": "💇🏿‍♂️",
+ "name": "man getting haircut: dark skin tone"
+ },
+ {
+ "no": 828,
+ "code": "1F487 200D 2640 FE0F",
+ "char": "💇‍♀️",
+ "name": "woman getting haircut"
+ },
+ {
+ "no": 829,
+ "code": "1F487 1F3FB 200D 2640 FE0F",
+ "char": "💇🏻‍♀️",
+ "name": "woman getting haircut: light skin tone"
+ },
+ {
+ "no": 830,
+ "code": "1F487 1F3FC 200D 2640 FE0F",
+ "char": "💇🏼‍♀️",
+ "name": "woman getting haircut: medium-light skin tone"
+ },
+ {
+ "no": 831,
+ "code": "1F487 1F3FD 200D 2640 FE0F",
+ "char": "💇🏽‍♀️",
+ "name": "woman getting haircut: medium skin tone"
+ },
+ {
+ "no": 832,
+ "code": "1F487 1F3FE 200D 2640 FE0F",
+ "char": "💇🏾‍♀️",
+ "name": "woman getting haircut: medium-dark skin tone"
+ },
+ {
+ "no": 833,
+ "code": "1F487 1F3FF 200D 2640 FE0F",
+ "char": "💇🏿‍♀️",
+ "name": "woman getting haircut: dark skin tone"
+ },
+ {
+ "no": 834,
+ "code": "1F6B6",
+ "char": "🚶",
+ "name": "person walking"
+ },
+ {
+ "no": 835,
+ "code": "1F6B6 1F3FB",
+ "char": "🚶🏻",
+ "name": "person walking: light skin tone"
+ },
+ {
+ "no": 836,
+ "code": "1F6B6 1F3FC",
+ "char": "🚶🏼",
+ "name": "person walking: medium-light skin tone"
+ },
+ {
+ "no": 837,
+ "code": "1F6B6 1F3FD",
+ "char": "🚶🏽",
+ "name": "person walking: medium skin tone"
+ },
+ {
+ "no": 838,
+ "code": "1F6B6 1F3FE",
+ "char": "🚶🏾",
+ "name": "person walking: medium-dark skin tone"
+ },
+ {
+ "no": 839,
+ "code": "1F6B6 1F3FF",
+ "char": "🚶🏿",
+ "name": "person walking: dark skin tone"
+ },
+ {
+ "no": 840,
+ "code": "1F6B6 200D 2642 FE0F",
+ "char": "🚶‍♂️",
+ "name": "man walking"
+ },
+ {
+ "no": 841,
+ "code": "1F6B6 1F3FB 200D 2642 FE0F",
+ "char": "🚶🏻‍♂️",
+ "name": "man walking: light skin tone"
+ },
+ {
+ "no": 842,
+ "code": "1F6B6 1F3FC 200D 2642 FE0F",
+ "char": "🚶🏼‍♂️",
+ "name": "man walking: medium-light skin tone"
+ },
+ {
+ "no": 843,
+ "code": "1F6B6 1F3FD 200D 2642 FE0F",
+ "char": "🚶🏽‍♂️",
+ "name": "man walking: medium skin tone"
+ },
+ {
+ "no": 844,
+ "code": "1F6B6 1F3FE 200D 2642 FE0F",
+ "char": "🚶🏾‍♂️",
+ "name": "man walking: medium-dark skin tone"
+ },
+ {
+ "no": 845,
+ "code": "1F6B6 1F3FF 200D 2642 FE0F",
+ "char": "🚶🏿‍♂️",
+ "name": "man walking: dark skin tone"
+ },
+ {
+ "no": 846,
+ "code": "1F6B6 200D 2640 FE0F",
+ "char": "🚶‍♀️",
+ "name": "woman walking"
+ },
+ {
+ "no": 847,
+ "code": "1F6B6 1F3FB 200D 2640 FE0F",
+ "char": "🚶🏻‍♀️",
+ "name": "woman walking: light skin tone"
+ },
+ {
+ "no": 848,
+ "code": "1F6B6 1F3FC 200D 2640 FE0F",
+ "char": "🚶🏼‍♀️",
+ "name": "woman walking: medium-light skin tone"
+ },
+ {
+ "no": 849,
+ "code": "1F6B6 1F3FD 200D 2640 FE0F",
+ "char": "🚶🏽‍♀️",
+ "name": "woman walking: medium skin tone"
+ },
+ {
+ "no": 850,
+ "code": "1F6B6 1F3FE 200D 2640 FE0F",
+ "char": "🚶🏾‍♀️",
+ "name": "woman walking: medium-dark skin tone"
+ },
+ {
+ "no": 851,
+ "code": "1F6B6 1F3FF 200D 2640 FE0F",
+ "char": "🚶🏿‍♀️",
+ "name": "woman walking: dark skin tone"
+ },
+ {
+ "no": 852,
+ "code": "1F3C3",
+ "char": "🏃",
+ "name": "person running"
+ },
+ {
+ "no": 853,
+ "code": "1F3C3 1F3FB",
+ "char": "🏃🏻",
+ "name": "person running: light skin tone"
+ },
+ {
+ "no": 854,
+ "code": "1F3C3 1F3FC",
+ "char": "🏃🏼",
+ "name": "person running: medium-light skin tone"
+ },
+ {
+ "no": 855,
+ "code": "1F3C3 1F3FD",
+ "char": "🏃🏽",
+ "name": "person running: medium skin tone"
+ },
+ {
+ "no": 856,
+ "code": "1F3C3 1F3FE",
+ "char": "🏃🏾",
+ "name": "person running: medium-dark skin tone"
+ },
+ {
+ "no": 857,
+ "code": "1F3C3 1F3FF",
+ "char": "🏃🏿",
+ "name": "person running: dark skin tone"
+ },
+ {
+ "no": 858,
+ "code": "1F3C3 200D 2642 FE0F",
+ "char": "🏃‍♂️",
+ "name": "man running"
+ },
+ {
+ "no": 859,
+ "code": "1F3C3 1F3FB 200D 2642 FE0F",
+ "char": "🏃🏻‍♂️",
+ "name": "man running: light skin tone"
+ },
+ {
+ "no": 860,
+ "code": "1F3C3 1F3FC 200D 2642 FE0F",
+ "char": "🏃🏼‍♂️",
+ "name": "man running: medium-light skin tone"
+ },
+ {
+ "no": 861,
+ "code": "1F3C3 1F3FD 200D 2642 FE0F",
+ "char": "🏃🏽‍♂️",
+ "name": "man running: medium skin tone"
+ },
+ {
+ "no": 862,
+ "code": "1F3C3 1F3FE 200D 2642 FE0F",
+ "char": "🏃🏾‍♂️",
+ "name": "man running: medium-dark skin tone"
+ },
+ {
+ "no": 863,
+ "code": "1F3C3 1F3FF 200D 2642 FE0F",
+ "char": "🏃🏿‍♂️",
+ "name": "man running: dark skin tone"
+ },
+ {
+ "no": 864,
+ "code": "1F3C3 200D 2640 FE0F",
+ "char": "🏃‍♀️",
+ "name": "woman running"
+ },
+ {
+ "no": 865,
+ "code": "1F3C3 1F3FB 200D 2640 FE0F",
+ "char": "🏃🏻‍♀️",
+ "name": "woman running: light skin tone"
+ },
+ {
+ "no": 866,
+ "code": "1F3C3 1F3FC 200D 2640 FE0F",
+ "char": "🏃🏼‍♀️",
+ "name": "woman running: medium-light skin tone"
+ },
+ {
+ "no": 867,
+ "code": "1F3C3 1F3FD 200D 2640 FE0F",
+ "char": "🏃🏽‍♀️",
+ "name": "woman running: medium skin tone"
+ },
+ {
+ "no": 868,
+ "code": "1F3C3 1F3FE 200D 2640 FE0F",
+ "char": "🏃🏾‍♀️",
+ "name": "woman running: medium-dark skin tone"
+ },
+ {
+ "no": 869,
+ "code": "1F3C3 1F3FF 200D 2640 FE0F",
+ "char": "🏃🏿‍♀️",
+ "name": "woman running: dark skin tone"
+ },
+ {
+ "no": 870,
+ "code": "1F483",
+ "char": "💃",
+ "name": "woman dancing"
+ },
+ {
+ "no": 871,
+ "code": "1F483 1F3FB",
+ "char": "💃🏻",
+ "name": "woman dancing: light skin tone"
+ },
+ {
+ "no": 872,
+ "code": "1F483 1F3FC",
+ "char": "💃🏼",
+ "name": "woman dancing: medium-light skin tone"
+ },
+ {
+ "no": 873,
+ "code": "1F483 1F3FD",
+ "char": "💃🏽",
+ "name": "woman dancing: medium skin tone"
+ },
+ {
+ "no": 874,
+ "code": "1F483 1F3FE",
+ "char": "💃🏾",
+ "name": "woman dancing: medium-dark skin tone"
+ },
+ {
+ "no": 875,
+ "code": "1F483 1F3FF",
+ "char": "💃🏿",
+ "name": "woman dancing: dark skin tone"
+ },
+ {
+ "no": 876,
+ "code": "1F57A",
+ "char": "🕺",
+ "name": "man dancing"
+ },
+ {
+ "no": 877,
+ "code": "1F57A 1F3FB",
+ "char": "🕺🏻",
+ "name": "man dancing: light skin tone"
+ },
+ {
+ "no": 878,
+ "code": "1F57A 1F3FC",
+ "char": "🕺🏼",
+ "name": "man dancing: medium-light skin tone"
+ },
+ {
+ "no": 879,
+ "code": "1F57A 1F3FD",
+ "char": "🕺🏽",
+ "name": "man dancing: medium skin tone"
+ },
+ {
+ "no": 880,
+ "code": "1F57A 1F3FE",
+ "char": "🕺🏾",
+ "name": "man dancing: medium-dark skin tone"
+ },
+ {
+ "no": 881,
+ "code": "1F57A 1F3FF",
+ "char": "🕺🏿",
+ "name": "man dancing: dark skin tone"
+ },
+ {
+ "no": 882,
+ "code": "1F46F",
+ "char": "👯",
+ "name": "people with bunny ears"
+ },
+ {
+ "no": 883,
+ "code": "1F46F 200D 2642 FE0F",
+ "char": "👯‍♂️",
+ "name": "men with bunny ears"
+ },
+ {
+ "no": 884,
+ "code": "1F46F 200D 2640 FE0F",
+ "char": "👯‍♀️",
+ "name": "women with bunny ears"
+ },
+ {
+ "no": 885,
+ "code": "1F9D6",
+ "char": "🧖",
+ "name": "⊛ person in steamy room"
+ },
+ {
+ "no": 886,
+ "code": "1F9D6 1F3FB",
+ "char": "🧖🏻",
+ "name": "⊛ person in steamy room: light skin tone"
+ },
+ {
+ "no": 887,
+ "code": "1F9D6 1F3FC",
+ "char": "🧖🏼",
+ "name": "⊛ person in steamy room: medium-light skin tone"
+ },
+ {
+ "no": 888,
+ "code": "1F9D6 1F3FD",
+ "char": "🧖🏽",
+ "name": "⊛ person in steamy room: medium skin tone"
+ },
+ {
+ "no": 889,
+ "code": "1F9D6 1F3FE",
+ "char": "🧖🏾",
+ "name": "⊛ person in steamy room: medium-dark skin tone"
+ },
+ {
+ "no": 890,
+ "code": "1F9D6 1F3FF",
+ "char": "🧖🏿",
+ "name": "⊛ person in steamy room: dark skin tone"
+ },
+ {
+ "no": 891,
+ "code": "1F9D6 200D 2640 FE0F",
+ "char": "🧖‍♀️",
+ "name": "⊛ woman in steamy room"
+ },
+ {
+ "no": 892,
+ "code": "1F9D6 1F3FB 200D 2640 FE0F",
+ "char": "🧖🏻‍♀️",
+ "name": "⊛ woman in steamy room: light skin tone"
+ },
+ {
+ "no": 893,
+ "code": "1F9D6 1F3FC 200D 2640 FE0F",
+ "char": "🧖🏼‍♀️",
+ "name": "⊛ woman in steamy room: medium-light skin tone"
+ },
+ {
+ "no": 894,
+ "code": "1F9D6 1F3FD 200D 2640 FE0F",
+ "char": "🧖🏽‍♀️",
+ "name": "⊛ woman in steamy room: medium skin tone"
+ },
+ {
+ "no": 895,
+ "code": "1F9D6 1F3FE 200D 2640 FE0F",
+ "char": "🧖🏾‍♀️",
+ "name": "⊛ woman in steamy room: medium-dark skin tone"
+ },
+ {
+ "no": 896,
+ "code": "1F9D6 1F3FF 200D 2640 FE0F",
+ "char": "🧖🏿‍♀️",
+ "name": "⊛ woman in steamy room: dark skin tone"
+ },
+ {
+ "no": 897,
+ "code": "1F9D6 200D 2642 FE0F",
+ "char": "🧖‍♂️",
+ "name": "⊛ man in steamy room"
+ },
+ {
+ "no": 898,
+ "code": "1F9D6 1F3FB 200D 2642 FE0F",
+ "char": "🧖🏻‍♂️",
+ "name": "⊛ man in steamy room: light skin tone"
+ },
+ {
+ "no": 899,
+ "code": "1F9D6 1F3FC 200D 2642 FE0F",
+ "char": "🧖🏼‍♂️",
+ "name": "⊛ man in steamy room: medium-light skin tone"
+ },
+ {
+ "no": 900,
+ "code": "1F9D6 1F3FD 200D 2642 FE0F",
+ "char": "🧖🏽‍♂️",
+ "name": "⊛ man in steamy room: medium skin tone"
+ },
+ {
+ "no": 901,
+ "code": "1F9D6 1F3FE 200D 2642 FE0F",
+ "char": "🧖🏾‍♂️",
+ "name": "⊛ man in steamy room: medium-dark skin tone"
+ },
+ {
+ "no": 902,
+ "code": "1F9D6 1F3FF 200D 2642 FE0F",
+ "char": "🧖🏿‍♂️",
+ "name": "⊛ man in steamy room: dark skin tone"
+ },
+ {
+ "no": 903,
+ "code": "1F9D7",
+ "char": "🧗",
+ "name": "⊛ person climbing"
+ },
+ {
+ "no": 904,
+ "code": "1F9D7 1F3FB",
+ "char": "🧗🏻",
+ "name": "⊛ person climbing: light skin tone"
+ },
+ {
+ "no": 905,
+ "code": "1F9D7 1F3FC",
+ "char": "🧗🏼",
+ "name": "⊛ person climbing: medium-light skin tone"
+ },
+ {
+ "no": 906,
+ "code": "1F9D7 1F3FD",
+ "char": "🧗🏽",
+ "name": "⊛ person climbing: medium skin tone"
+ },
+ {
+ "no": 907,
+ "code": "1F9D7 1F3FE",
+ "char": "🧗🏾",
+ "name": "⊛ person climbing: medium-dark skin tone"
+ },
+ {
+ "no": 908,
+ "code": "1F9D7 1F3FF",
+ "char": "🧗🏿",
+ "name": "⊛ person climbing: dark skin tone"
+ },
+ {
+ "no": 909,
+ "code": "1F9D7 200D 2640 FE0F",
+ "char": "🧗‍♀️",
+ "name": "⊛ woman climbing"
+ },
+ {
+ "no": 910,
+ "code": "1F9D7 1F3FB 200D 2640 FE0F",
+ "char": "🧗🏻‍♀️",
+ "name": "⊛ woman climbing: light skin tone"
+ },
+ {
+ "no": 911,
+ "code": "1F9D7 1F3FC 200D 2640 FE0F",
+ "char": "🧗🏼‍♀️",
+ "name": "⊛ woman climbing: medium-light skin tone"
+ },
+ {
+ "no": 912,
+ "code": "1F9D7 1F3FD 200D 2640 FE0F",
+ "char": "🧗🏽‍♀️",
+ "name": "⊛ woman climbing: medium skin tone"
+ },
+ {
+ "no": 913,
+ "code": "1F9D7 1F3FE 200D 2640 FE0F",
+ "char": "🧗🏾‍♀️",
+ "name": "⊛ woman climbing: medium-dark skin tone"
+ },
+ {
+ "no": 914,
+ "code": "1F9D7 1F3FF 200D 2640 FE0F",
+ "char": "🧗🏿‍♀️",
+ "name": "⊛ woman climbing: dark skin tone"
+ },
+ {
+ "no": 915,
+ "code": "1F9D7 200D 2642 FE0F",
+ "char": "🧗‍♂️",
+ "name": "⊛ man climbing"
+ },
+ {
+ "no": 916,
+ "code": "1F9D7 1F3FB 200D 2642 FE0F",
+ "char": "🧗🏻‍♂️",
+ "name": "⊛ man climbing: light skin tone"
+ },
+ {
+ "no": 917,
+ "code": "1F9D7 1F3FC 200D 2642 FE0F",
+ "char": "🧗🏼‍♂️",
+ "name": "⊛ man climbing: medium-light skin tone"
+ },
+ {
+ "no": 918,
+ "code": "1F9D7 1F3FD 200D 2642 FE0F",
+ "char": "🧗🏽‍♂️",
+ "name": "⊛ man climbing: medium skin tone"
+ },
+ {
+ "no": 919,
+ "code": "1F9D7 1F3FE 200D 2642 FE0F",
+ "char": "🧗🏾‍♂️",
+ "name": "⊛ man climbing: medium-dark skin tone"
+ },
+ {
+ "no": 920,
+ "code": "1F9D7 1F3FF 200D 2642 FE0F",
+ "char": "🧗🏿‍♂️",
+ "name": "⊛ man climbing: dark skin tone"
+ },
+ {
+ "no": 921,
+ "code": "1F9D8",
+ "char": "🧘",
+ "name": "⊛ person in lotus position"
+ },
+ {
+ "no": 922,
+ "code": "1F9D8 1F3FB",
+ "char": "🧘🏻",
+ "name": "⊛ person in lotus position: light skin tone"
+ },
+ {
+ "no": 923,
+ "code": "1F9D8 1F3FC",
+ "char": "🧘🏼",
+ "name": "⊛ person in lotus position: medium-light skin tone"
+ },
+ {
+ "no": 924,
+ "code": "1F9D8 1F3FD",
+ "char": "🧘🏽",
+ "name": "⊛ person in lotus position: medium skin tone"
+ },
+ {
+ "no": 925,
+ "code": "1F9D8 1F3FE",
+ "char": "🧘🏾",
+ "name": "⊛ person in lotus position: medium-dark skin tone"
+ },
+ {
+ "no": 926,
+ "code": "1F9D8 1F3FF",
+ "char": "🧘🏿",
+ "name": "⊛ person in lotus position: dark skin tone"
+ },
+ {
+ "no": 927,
+ "code": "1F9D8 200D 2640 FE0F",
+ "char": "🧘‍♀️",
+ "name": "⊛ woman in lotus position"
+ },
+ {
+ "no": 928,
+ "code": "1F9D8 1F3FB 200D 2640 FE0F",
+ "char": "🧘🏻‍♀️",
+ "name": "⊛ woman in lotus position: light skin tone"
+ },
+ {
+ "no": 929,
+ "code": "1F9D8 1F3FC 200D 2640 FE0F",
+ "char": "🧘🏼‍♀️",
+ "name": "⊛ woman in lotus position: medium-light skin tone"
+ },
+ {
+ "no": 930,
+ "code": "1F9D8 1F3FD 200D 2640 FE0F",
+ "char": "🧘🏽‍♀️",
+ "name": "⊛ woman in lotus position: medium skin tone"
+ },
+ {
+ "no": 931,
+ "code": "1F9D8 1F3FE 200D 2640 FE0F",
+ "char": "🧘🏾‍♀️",
+ "name": "⊛ woman in lotus position: medium-dark skin tone"
+ },
+ {
+ "no": 932,
+ "code": "1F9D8 1F3FF 200D 2640 FE0F",
+ "char": "🧘🏿‍♀️",
+ "name": "⊛ woman in lotus position: dark skin tone"
+ },
+ {
+ "no": 933,
+ "code": "1F9D8 200D 2642 FE0F",
+ "char": "🧘‍♂️",
+ "name": "⊛ man in lotus position"
+ },
+ {
+ "no": 934,
+ "code": "1F9D8 1F3FB 200D 2642 FE0F",
+ "char": "🧘🏻‍♂️",
+ "name": "⊛ man in lotus position: light skin tone"
+ },
+ {
+ "no": 935,
+ "code": "1F9D8 1F3FC 200D 2642 FE0F",
+ "char": "🧘🏼‍♂️",
+ "name": "⊛ man in lotus position: medium-light skin tone"
+ },
+ {
+ "no": 936,
+ "code": "1F9D8 1F3FD 200D 2642 FE0F",
+ "char": "🧘🏽‍♂️",
+ "name": "⊛ man in lotus position: medium skin tone"
+ },
+ {
+ "no": 937,
+ "code": "1F9D8 1F3FE 200D 2642 FE0F",
+ "char": "🧘🏾‍♂️",
+ "name": "⊛ man in lotus position: medium-dark skin tone"
+ },
+ {
+ "no": 938,
+ "code": "1F9D8 1F3FF 200D 2642 FE0F",
+ "char": "🧘🏿‍♂️",
+ "name": "⊛ man in lotus position: dark skin tone"
+ },
+ {
+ "no": 939,
+ "code": "1F6C0",
+ "char": "🛀",
+ "name": "person taking bath"
+ },
+ {
+ "no": 940,
+ "code": "1F6C0 1F3FB",
+ "char": "🛀🏻",
+ "name": "person taking bath: light skin tone"
+ },
+ {
+ "no": 941,
+ "code": "1F6C0 1F3FC",
+ "char": "🛀🏼",
+ "name": "person taking bath: medium-light skin tone"
+ },
+ {
+ "no": 942,
+ "code": "1F6C0 1F3FD",
+ "char": "🛀🏽",
+ "name": "person taking bath: medium skin tone"
+ },
+ {
+ "no": 943,
+ "code": "1F6C0 1F3FE",
+ "char": "🛀🏾",
+ "name": "person taking bath: medium-dark skin tone"
+ },
+ {
+ "no": 944,
+ "code": "1F6C0 1F3FF",
+ "char": "🛀🏿",
+ "name": "person taking bath: dark skin tone"
+ },
+ {
+ "no": 945,
+ "code": "1F6CC",
+ "char": "🛌",
+ "name": "person in bed"
+ },
+ {
+ "no": 946,
+ "code": "1F6CC 1F3FB",
+ "char": "🛌🏻",
+ "name": "person in bed: light skin tone"
+ },
+ {
+ "no": 947,
+ "code": "1F6CC 1F3FC",
+ "char": "🛌🏼",
+ "name": "person in bed: medium-light skin tone"
+ },
+ {
+ "no": 948,
+ "code": "1F6CC 1F3FD",
+ "char": "🛌🏽",
+ "name": "person in bed: medium skin tone"
+ },
+ {
+ "no": 949,
+ "code": "1F6CC 1F3FE",
+ "char": "🛌🏾",
+ "name": "person in bed: medium-dark skin tone"
+ },
+ {
+ "no": 950,
+ "code": "1F6CC 1F3FF",
+ "char": "🛌🏿",
+ "name": "person in bed: dark skin tone"
+ },
+ {
+ "no": 951,
+ "code": "1F574",
+ "char": "🕴",
+ "name": "man in suit levitating"
+ },
+ {
+ "no": 952,
+ "code": "1F574 1F3FB",
+ "char": "🕴🏻",
+ "name": "man in suit levitating: light skin tone"
+ },
+ {
+ "no": 953,
+ "code": "1F574 1F3FC",
+ "char": "🕴🏼",
+ "name": "man in suit levitating: medium-light skin tone"
+ },
+ {
+ "no": 954,
+ "code": "1F574 1F3FD",
+ "char": "🕴🏽",
+ "name": "man in suit levitating: medium skin tone"
+ },
+ {
+ "no": 955,
+ "code": "1F574 1F3FE",
+ "char": "🕴🏾",
+ "name": "man in suit levitating: medium-dark skin tone"
+ },
+ {
+ "no": 956,
+ "code": "1F574 1F3FF",
+ "char": "🕴🏿",
+ "name": "man in suit levitating: dark skin tone"
+ },
+ {
+ "no": 957,
+ "code": "1F5E3",
+ "char": "🗣",
+ "name": "speaking head"
+ },
+ {
+ "no": 958,
+ "code": "1F464",
+ "char": "👤",
+ "name": "bust in silhouette"
+ },
+ {
+ "no": 959,
+ "code": "1F465",
+ "char": "👥",
+ "name": "busts in silhouette"
+ },
+ {
+ "no": 960,
+ "code": "1F93A",
+ "char": "🤺",
+ "name": "person fencing"
+ },
+ {
+ "no": 961,
+ "code": "1F3C7",
+ "char": "🏇",
+ "name": "horse racing"
+ },
+ {
+ "no": 962,
+ "code": "1F3C7 1F3FB",
+ "char": "🏇🏻",
+ "name": "horse racing: light skin tone"
+ },
+ {
+ "no": 963,
+ "code": "1F3C7 1F3FC",
+ "char": "🏇🏼",
+ "name": "horse racing: medium-light skin tone"
+ },
+ {
+ "no": 964,
+ "code": "1F3C7 1F3FD",
+ "char": "🏇🏽",
+ "name": "horse racing: medium skin tone"
+ },
+ {
+ "no": 965,
+ "code": "1F3C7 1F3FE",
+ "char": "🏇🏾",
+ "name": "horse racing: medium-dark skin tone"
+ },
+ {
+ "no": 966,
+ "code": "1F3C7 1F3FF",
+ "char": "🏇🏿",
+ "name": "horse racing: dark skin tone"
+ },
+ {
+ "no": 967,
+ "code": "26F7",
+ "char": "⛷",
+ "name": "skier"
+ },
+ {
+ "no": 968,
+ "code": "1F3C2",
+ "char": "🏂",
+ "name": "snowboarder"
+ },
+ {
+ "no": 969,
+ "code": "1F3C2 1F3FB",
+ "char": "🏂🏻",
+ "name": "snowboarder: light skin tone"
+ },
+ {
+ "no": 970,
+ "code": "1F3C2 1F3FC",
+ "char": "🏂🏼",
+ "name": "snowboarder: medium-light skin tone"
+ },
+ {
+ "no": 971,
+ "code": "1F3C2 1F3FD",
+ "char": "🏂🏽",
+ "name": "snowboarder: medium skin tone"
+ },
+ {
+ "no": 972,
+ "code": "1F3C2 1F3FE",
+ "char": "🏂🏾",
+ "name": "snowboarder: medium-dark skin tone"
+ },
+ {
+ "no": 973,
+ "code": "1F3C2 1F3FF",
+ "char": "🏂🏿",
+ "name": "snowboarder: dark skin tone"
+ },
+ {
+ "no": 974,
+ "code": "1F3CC",
+ "char": "🏌",
+ "name": "person golfing"
+ },
+ {
+ "no": 975,
+ "code": "1F3CC 1F3FB",
+ "char": "🏌🏻",
+ "name": "person golfing: light skin tone"
+ },
+ {
+ "no": 976,
+ "code": "1F3CC 1F3FC",
+ "char": "🏌🏼",
+ "name": "person golfing: medium-light skin tone"
+ },
+ {
+ "no": 977,
+ "code": "1F3CC 1F3FD",
+ "char": "🏌🏽",
+ "name": "person golfing: medium skin tone"
+ },
+ {
+ "no": 978,
+ "code": "1F3CC 1F3FE",
+ "char": "🏌🏾",
+ "name": "person golfing: medium-dark skin tone"
+ },
+ {
+ "no": 979,
+ "code": "1F3CC 1F3FF",
+ "char": "🏌🏿",
+ "name": "person golfing: dark skin tone"
+ },
+ {
+ "no": 980,
+ "code": "1F3CC FE0F 200D 2642 FE0F",
+ "char": "🏌️‍♂️",
+ "name": "man golfing"
+ },
+ {
+ "no": 981,
+ "code": "1F3CC 1F3FB 200D 2642 FE0F",
+ "char": "🏌🏻‍♂️",
+ "name": "man golfing: light skin tone"
+ },
+ {
+ "no": 982,
+ "code": "1F3CC 1F3FC 200D 2642 FE0F",
+ "char": "🏌🏼‍♂️",
+ "name": "man golfing: medium-light skin tone"
+ },
+ {
+ "no": 983,
+ "code": "1F3CC 1F3FD 200D 2642 FE0F",
+ "char": "🏌🏽‍♂️",
+ "name": "man golfing: medium skin tone"
+ },
+ {
+ "no": 984,
+ "code": "1F3CC 1F3FE 200D 2642 FE0F",
+ "char": "🏌🏾‍♂️",
+ "name": "man golfing: medium-dark skin tone"
+ },
+ {
+ "no": 985,
+ "code": "1F3CC 1F3FF 200D 2642 FE0F",
+ "char": "🏌🏿‍♂️",
+ "name": "man golfing: dark skin tone"
+ },
+ {
+ "no": 986,
+ "code": "1F3CC FE0F 200D 2640 FE0F",
+ "char": "🏌️‍♀️",
+ "name": "woman golfing"
+ },
+ {
+ "no": 987,
+ "code": "1F3CC 1F3FB 200D 2640 FE0F",
+ "char": "🏌🏻‍♀️",
+ "name": "woman golfing: light skin tone"
+ },
+ {
+ "no": 988,
+ "code": "1F3CC 1F3FC 200D 2640 FE0F",
+ "char": "🏌🏼‍♀️",
+ "name": "woman golfing: medium-light skin tone"
+ },
+ {
+ "no": 989,
+ "code": "1F3CC 1F3FD 200D 2640 FE0F",
+ "char": "🏌🏽‍♀️",
+ "name": "woman golfing: medium skin tone"
+ },
+ {
+ "no": 990,
+ "code": "1F3CC 1F3FE 200D 2640 FE0F",
+ "char": "🏌🏾‍♀️",
+ "name": "woman golfing: medium-dark skin tone"
+ },
+ {
+ "no": 991,
+ "code": "1F3CC 1F3FF 200D 2640 FE0F",
+ "char": "🏌🏿‍♀️",
+ "name": "woman golfing: dark skin tone"
+ },
+ {
+ "no": 992,
+ "code": "1F3C4",
+ "char": "🏄",
+ "name": "person surfing"
+ },
+ {
+ "no": 993,
+ "code": "1F3C4 1F3FB",
+ "char": "🏄🏻",
+ "name": "person surfing: light skin tone"
+ },
+ {
+ "no": 994,
+ "code": "1F3C4 1F3FC",
+ "char": "🏄🏼",
+ "name": "person surfing: medium-light skin tone"
+ },
+ {
+ "no": 995,
+ "code": "1F3C4 1F3FD",
+ "char": "🏄🏽",
+ "name": "person surfing: medium skin tone"
+ },
+ {
+ "no": 996,
+ "code": "1F3C4 1F3FE",
+ "char": "🏄🏾",
+ "name": "person surfing: medium-dark skin tone"
+ },
+ {
+ "no": 997,
+ "code": "1F3C4 1F3FF",
+ "char": "🏄🏿",
+ "name": "person surfing: dark skin tone"
+ },
+ {
+ "no": 998,
+ "code": "1F3C4 200D 2642 FE0F",
+ "char": "🏄‍♂️",
+ "name": "man surfing"
+ },
+ {
+ "no": 999,
+ "code": "1F3C4 1F3FB 200D 2642 FE0F",
+ "char": "🏄🏻‍♂️",
+ "name": "man surfing: light skin tone"
+ },
+ {
+ "no": 1000,
+ "code": "1F3C4 1F3FC 200D 2642 FE0F",
+ "char": "🏄🏼‍♂️",
+ "name": "man surfing: medium-light skin tone"
+ },
+ {
+ "no": 1001,
+ "code": "1F3C4 1F3FD 200D 2642 FE0F",
+ "char": "🏄🏽‍♂️",
+ "name": "man surfing: medium skin tone"
+ },
+ {
+ "no": 1002,
+ "code": "1F3C4 1F3FE 200D 2642 FE0F",
+ "char": "🏄🏾‍♂️",
+ "name": "man surfing: medium-dark skin tone"
+ },
+ {
+ "no": 1003,
+ "code": "1F3C4 1F3FF 200D 2642 FE0F",
+ "char": "🏄🏿‍♂️",
+ "name": "man surfing: dark skin tone"
+ },
+ {
+ "no": 1004,
+ "code": "1F3C4 200D 2640 FE0F",
+ "char": "🏄‍♀️",
+ "name": "woman surfing"
+ },
+ {
+ "no": 1005,
+ "code": "1F3C4 1F3FB 200D 2640 FE0F",
+ "char": "🏄🏻‍♀️",
+ "name": "woman surfing: light skin tone"
+ },
+ {
+ "no": 1006,
+ "code": "1F3C4 1F3FC 200D 2640 FE0F",
+ "char": "🏄🏼‍♀️",
+ "name": "woman surfing: medium-light skin tone"
+ },
+ {
+ "no": 1007,
+ "code": "1F3C4 1F3FD 200D 2640 FE0F",
+ "char": "🏄🏽‍♀️",
+ "name": "woman surfing: medium skin tone"
+ },
+ {
+ "no": 1008,
+ "code": "1F3C4 1F3FE 200D 2640 FE0F",
+ "char": "🏄🏾‍♀️",
+ "name": "woman surfing: medium-dark skin tone"
+ },
+ {
+ "no": 1009,
+ "code": "1F3C4 1F3FF 200D 2640 FE0F",
+ "char": "🏄🏿‍♀️",
+ "name": "woman surfing: dark skin tone"
+ },
+ {
+ "no": 1010,
+ "code": "1F6A3",
+ "char": "🚣",
+ "name": "person rowing boat"
+ },
+ {
+ "no": 1011,
+ "code": "1F6A3 1F3FB",
+ "char": "🚣🏻",
+ "name": "person rowing boat: light skin tone"
+ },
+ {
+ "no": 1012,
+ "code": "1F6A3 1F3FC",
+ "char": "🚣🏼",
+ "name": "person rowing boat: medium-light skin tone"
+ },
+ {
+ "no": 1013,
+ "code": "1F6A3 1F3FD",
+ "char": "🚣🏽",
+ "name": "person rowing boat: medium skin tone"
+ },
+ {
+ "no": 1014,
+ "code": "1F6A3 1F3FE",
+ "char": "🚣🏾",
+ "name": "person rowing boat: medium-dark skin tone"
+ },
+ {
+ "no": 1015,
+ "code": "1F6A3 1F3FF",
+ "char": "🚣🏿",
+ "name": "person rowing boat: dark skin tone"
+ },
+ {
+ "no": 1016,
+ "code": "1F6A3 200D 2642 FE0F",
+ "char": "🚣‍♂️",
+ "name": "man rowing boat"
+ },
+ {
+ "no": 1017,
+ "code": "1F6A3 1F3FB 200D 2642 FE0F",
+ "char": "🚣🏻‍♂️",
+ "name": "man rowing boat: light skin tone"
+ },
+ {
+ "no": 1018,
+ "code": "1F6A3 1F3FC 200D 2642 FE0F",
+ "char": "🚣🏼‍♂️",
+ "name": "man rowing boat: medium-light skin tone"
+ },
+ {
+ "no": 1019,
+ "code": "1F6A3 1F3FD 200D 2642 FE0F",
+ "char": "🚣🏽‍♂️",
+ "name": "man rowing boat: medium skin tone"
+ },
+ {
+ "no": 1020,
+ "code": "1F6A3 1F3FE 200D 2642 FE0F",
+ "char": "🚣🏾‍♂️",
+ "name": "man rowing boat: medium-dark skin tone"
+ },
+ {
+ "no": 1021,
+ "code": "1F6A3 1F3FF 200D 2642 FE0F",
+ "char": "🚣🏿‍♂️",
+ "name": "man rowing boat: dark skin tone"
+ },
+ {
+ "no": 1022,
+ "code": "1F6A3 200D 2640 FE0F",
+ "char": "🚣‍♀️",
+ "name": "woman rowing boat"
+ },
+ {
+ "no": 1023,
+ "code": "1F6A3 1F3FB 200D 2640 FE0F",
+ "char": "🚣🏻‍♀️",
+ "name": "woman rowing boat: light skin tone"
+ },
+ {
+ "no": 1024,
+ "code": "1F6A3 1F3FC 200D 2640 FE0F",
+ "char": "🚣🏼‍♀️",
+ "name": "woman rowing boat: medium-light skin tone"
+ },
+ {
+ "no": 1025,
+ "code": "1F6A3 1F3FD 200D 2640 FE0F",
+ "char": "🚣🏽‍♀️",
+ "name": "woman rowing boat: medium skin tone"
+ },
+ {
+ "no": 1026,
+ "code": "1F6A3 1F3FE 200D 2640 FE0F",
+ "char": "🚣🏾‍♀️",
+ "name": "woman rowing boat: medium-dark skin tone"
+ },
+ {
+ "no": 1027,
+ "code": "1F6A3 1F3FF 200D 2640 FE0F",
+ "char": "🚣🏿‍♀️",
+ "name": "woman rowing boat: dark skin tone"
+ },
+ {
+ "no": 1028,
+ "code": "1F3CA",
+ "char": "🏊",
+ "name": "person swimming"
+ },
+ {
+ "no": 1029,
+ "code": "1F3CA 1F3FB",
+ "char": "🏊🏻",
+ "name": "person swimming: light skin tone"
+ },
+ {
+ "no": 1030,
+ "code": "1F3CA 1F3FC",
+ "char": "🏊🏼",
+ "name": "person swimming: medium-light skin tone"
+ },
+ {
+ "no": 1031,
+ "code": "1F3CA 1F3FD",
+ "char": "🏊🏽",
+ "name": "person swimming: medium skin tone"
+ },
+ {
+ "no": 1032,
+ "code": "1F3CA 1F3FE",
+ "char": "🏊🏾",
+ "name": "person swimming: medium-dark skin tone"
+ },
+ {
+ "no": 1033,
+ "code": "1F3CA 1F3FF",
+ "char": "🏊🏿",
+ "name": "person swimming: dark skin tone"
+ },
+ {
+ "no": 1034,
+ "code": "1F3CA 200D 2642 FE0F",
+ "char": "🏊‍♂️",
+ "name": "man swimming"
+ },
+ {
+ "no": 1035,
+ "code": "1F3CA 1F3FB 200D 2642 FE0F",
+ "char": "🏊🏻‍♂️",
+ "name": "man swimming: light skin tone"
+ },
+ {
+ "no": 1036,
+ "code": "1F3CA 1F3FC 200D 2642 FE0F",
+ "char": "🏊🏼‍♂️",
+ "name": "man swimming: medium-light skin tone"
+ },
+ {
+ "no": 1037,
+ "code": "1F3CA 1F3FD 200D 2642 FE0F",
+ "char": "🏊🏽‍♂️",
+ "name": "man swimming: medium skin tone"
+ },
+ {
+ "no": 1038,
+ "code": "1F3CA 1F3FE 200D 2642 FE0F",
+ "char": "🏊🏾‍♂️",
+ "name": "man swimming: medium-dark skin tone"
+ },
+ {
+ "no": 1039,
+ "code": "1F3CA 1F3FF 200D 2642 FE0F",
+ "char": "🏊🏿‍♂️",
+ "name": "man swimming: dark skin tone"
+ },
+ {
+ "no": 1040,
+ "code": "1F3CA 200D 2640 FE0F",
+ "char": "🏊‍♀️",
+ "name": "woman swimming"
+ },
+ {
+ "no": 1041,
+ "code": "1F3CA 1F3FB 200D 2640 FE0F",
+ "char": "🏊🏻‍♀️",
+ "name": "woman swimming: light skin tone"
+ },
+ {
+ "no": 1042,
+ "code": "1F3CA 1F3FC 200D 2640 FE0F",
+ "char": "🏊🏼‍♀️",
+ "name": "woman swimming: medium-light skin tone"
+ },
+ {
+ "no": 1043,
+ "code": "1F3CA 1F3FD 200D 2640 FE0F",
+ "char": "🏊🏽‍♀️",
+ "name": "woman swimming: medium skin tone"
+ },
+ {
+ "no": 1044,
+ "code": "1F3CA 1F3FE 200D 2640 FE0F",
+ "char": "🏊🏾‍♀️",
+ "name": "woman swimming: medium-dark skin tone"
+ },
+ {
+ "no": 1045,
+ "code": "1F3CA 1F3FF 200D 2640 FE0F",
+ "char": "🏊🏿‍♀️",
+ "name": "woman swimming: dark skin tone"
+ },
+ {
+ "no": 1046,
+ "code": "26F9",
+ "char": "⛹",
+ "name": "person bouncing ball"
+ },
+ {
+ "no": 1047,
+ "code": "26F9 1F3FB",
+ "char": "⛹🏻",
+ "name": "person bouncing ball: light skin tone"
+ },
+ {
+ "no": 1048,
+ "code": "26F9 1F3FC",
+ "char": "⛹🏼",
+ "name": "person bouncing ball: medium-light skin tone"
+ },
+ {
+ "no": 1049,
+ "code": "26F9 1F3FD",
+ "char": "⛹🏽",
+ "name": "person bouncing ball: medium skin tone"
+ },
+ {
+ "no": 1050,
+ "code": "26F9 1F3FE",
+ "char": "⛹🏾",
+ "name": "person bouncing ball: medium-dark skin tone"
+ },
+ {
+ "no": 1051,
+ "code": "26F9 1F3FF",
+ "char": "⛹🏿",
+ "name": "person bouncing ball: dark skin tone"
+ },
+ {
+ "no": 1052,
+ "code": "26F9 FE0F 200D 2642 FE0F",
+ "char": "⛹️‍♂️",
+ "name": "man bouncing ball"
+ },
+ {
+ "no": 1053,
+ "code": "26F9 1F3FB 200D 2642 FE0F",
+ "char": "⛹🏻‍♂️",
+ "name": "man bouncing ball: light skin tone"
+ },
+ {
+ "no": 1054,
+ "code": "26F9 1F3FC 200D 2642 FE0F",
+ "char": "⛹🏼‍♂️",
+ "name": "man bouncing ball: medium-light skin tone"
+ },
+ {
+ "no": 1055,
+ "code": "26F9 1F3FD 200D 2642 FE0F",
+ "char": "⛹🏽‍♂️",
+ "name": "man bouncing ball: medium skin tone"
+ },
+ {
+ "no": 1056,
+ "code": "26F9 1F3FE 200D 2642 FE0F",
+ "char": "⛹🏾‍♂️",
+ "name": "man bouncing ball: medium-dark skin tone"
+ },
+ {
+ "no": 1057,
+ "code": "26F9 1F3FF 200D 2642 FE0F",
+ "char": "⛹🏿‍♂️",
+ "name": "man bouncing ball: dark skin tone"
+ },
+ {
+ "no": 1058,
+ "code": "26F9 FE0F 200D 2640 FE0F",
+ "char": "⛹️‍♀️",
+ "name": "woman bouncing ball"
+ },
+ {
+ "no": 1059,
+ "code": "26F9 1F3FB 200D 2640 FE0F",
+ "char": "⛹🏻‍♀️",
+ "name": "woman bouncing ball: light skin tone"
+ },
+ {
+ "no": 1060,
+ "code": "26F9 1F3FC 200D 2640 FE0F",
+ "char": "⛹🏼‍♀️",
+ "name": "woman bouncing ball: medium-light skin tone"
+ },
+ {
+ "no": 1061,
+ "code": "26F9 1F3FD 200D 2640 FE0F",
+ "char": "⛹🏽‍♀️",
+ "name": "woman bouncing ball: medium skin tone"
+ },
+ {
+ "no": 1062,
+ "code": "26F9 1F3FE 200D 2640 FE0F",
+ "char": "⛹🏾‍♀️",
+ "name": "woman bouncing ball: medium-dark skin tone"
+ },
+ {
+ "no": 1063,
+ "code": "26F9 1F3FF 200D 2640 FE0F",
+ "char": "⛹🏿‍♀️",
+ "name": "woman bouncing ball: dark skin tone"
+ },
+ {
+ "no": 1064,
+ "code": "1F3CB",
+ "char": "🏋",
+ "name": "person lifting weights"
+ },
+ {
+ "no": 1065,
+ "code": "1F3CB 1F3FB",
+ "char": "🏋🏻",
+ "name": "person lifting weights: light skin tone"
+ },
+ {
+ "no": 1066,
+ "code": "1F3CB 1F3FC",
+ "char": "🏋🏼",
+ "name": "person lifting weights: medium-light skin tone"
+ },
+ {
+ "no": 1067,
+ "code": "1F3CB 1F3FD",
+ "char": "🏋🏽",
+ "name": "person lifting weights: medium skin tone"
+ },
+ {
+ "no": 1068,
+ "code": "1F3CB 1F3FE",
+ "char": "🏋🏾",
+ "name": "person lifting weights: medium-dark skin tone"
+ },
+ {
+ "no": 1069,
+ "code": "1F3CB 1F3FF",
+ "char": "🏋🏿",
+ "name": "person lifting weights: dark skin tone"
+ },
+ {
+ "no": 1070,
+ "code": "1F3CB FE0F 200D 2642 FE0F",
+ "char": "🏋️‍♂️",
+ "name": "man lifting weights"
+ },
+ {
+ "no": 1071,
+ "code": "1F3CB 1F3FB 200D 2642 FE0F",
+ "char": "🏋🏻‍♂️",
+ "name": "man lifting weights: light skin tone"
+ },
+ {
+ "no": 1072,
+ "code": "1F3CB 1F3FC 200D 2642 FE0F",
+ "char": "🏋🏼‍♂️",
+ "name": "man lifting weights: medium-light skin tone"
+ },
+ {
+ "no": 1073,
+ "code": "1F3CB 1F3FD 200D 2642 FE0F",
+ "char": "🏋🏽‍♂️",
+ "name": "man lifting weights: medium skin tone"
+ },
+ {
+ "no": 1074,
+ "code": "1F3CB 1F3FE 200D 2642 FE0F",
+ "char": "🏋🏾‍♂️",
+ "name": "man lifting weights: medium-dark skin tone"
+ },
+ {
+ "no": 1075,
+ "code": "1F3CB 1F3FF 200D 2642 FE0F",
+ "char": "🏋🏿‍♂️",
+ "name": "man lifting weights: dark skin tone"
+ },
+ {
+ "no": 1076,
+ "code": "1F3CB FE0F 200D 2640 FE0F",
+ "char": "🏋️‍♀️",
+ "name": "woman lifting weights"
+ },
+ {
+ "no": 1077,
+ "code": "1F3CB 1F3FB 200D 2640 FE0F",
+ "char": "🏋🏻‍♀️",
+ "name": "woman lifting weights: light skin tone"
+ },
+ {
+ "no": 1078,
+ "code": "1F3CB 1F3FC 200D 2640 FE0F",
+ "char": "🏋🏼‍♀️",
+ "name": "woman lifting weights: medium-light skin tone"
+ },
+ {
+ "no": 1079,
+ "code": "1F3CB 1F3FD 200D 2640 FE0F",
+ "char": "🏋🏽‍♀️",
+ "name": "woman lifting weights: medium skin tone"
+ },
+ {
+ "no": 1080,
+ "code": "1F3CB 1F3FE 200D 2640 FE0F",
+ "char": "🏋🏾‍♀️",
+ "name": "woman lifting weights: medium-dark skin tone"
+ },
+ {
+ "no": 1081,
+ "code": "1F3CB 1F3FF 200D 2640 FE0F",
+ "char": "🏋🏿‍♀️",
+ "name": "woman lifting weights: dark skin tone"
+ },
+ {
+ "no": 1082,
+ "code": "1F6B4",
+ "char": "🚴",
+ "name": "person biking"
+ },
+ {
+ "no": 1083,
+ "code": "1F6B4 1F3FB",
+ "char": "🚴🏻",
+ "name": "person biking: light skin tone"
+ },
+ {
+ "no": 1084,
+ "code": "1F6B4 1F3FC",
+ "char": "🚴🏼",
+ "name": "person biking: medium-light skin tone"
+ },
+ {
+ "no": 1085,
+ "code": "1F6B4 1F3FD",
+ "char": "🚴🏽",
+ "name": "person biking: medium skin tone"
+ },
+ {
+ "no": 1086,
+ "code": "1F6B4 1F3FE",
+ "char": "🚴🏾",
+ "name": "person biking: medium-dark skin tone"
+ },
+ {
+ "no": 1087,
+ "code": "1F6B4 1F3FF",
+ "char": "🚴🏿",
+ "name": "person biking: dark skin tone"
+ },
+ {
+ "no": 1088,
+ "code": "1F6B4 200D 2642 FE0F",
+ "char": "🚴‍♂️",
+ "name": "man biking"
+ },
+ {
+ "no": 1089,
+ "code": "1F6B4 1F3FB 200D 2642 FE0F",
+ "char": "🚴🏻‍♂️",
+ "name": "man biking: light skin tone"
+ },
+ {
+ "no": 1090,
+ "code": "1F6B4 1F3FC 200D 2642 FE0F",
+ "char": "🚴🏼‍♂️",
+ "name": "man biking: medium-light skin tone"
+ },
+ {
+ "no": 1091,
+ "code": "1F6B4 1F3FD 200D 2642 FE0F",
+ "char": "🚴🏽‍♂️",
+ "name": "man biking: medium skin tone"
+ },
+ {
+ "no": 1092,
+ "code": "1F6B4 1F3FE 200D 2642 FE0F",
+ "char": "🚴🏾‍♂️",
+ "name": "man biking: medium-dark skin tone"
+ },
+ {
+ "no": 1093,
+ "code": "1F6B4 1F3FF 200D 2642 FE0F",
+ "char": "🚴🏿‍♂️",
+ "name": "man biking: dark skin tone"
+ },
+ {
+ "no": 1094,
+ "code": "1F6B4 200D 2640 FE0F",
+ "char": "🚴‍♀️",
+ "name": "woman biking"
+ },
+ {
+ "no": 1095,
+ "code": "1F6B4 1F3FB 200D 2640 FE0F",
+ "char": "🚴🏻‍♀️",
+ "name": "woman biking: light skin tone"
+ },
+ {
+ "no": 1096,
+ "code": "1F6B4 1F3FC 200D 2640 FE0F",
+ "char": "🚴🏼‍♀️",
+ "name": "woman biking: medium-light skin tone"
+ },
+ {
+ "no": 1097,
+ "code": "1F6B4 1F3FD 200D 2640 FE0F",
+ "char": "🚴🏽‍♀️",
+ "name": "woman biking: medium skin tone"
+ },
+ {
+ "no": 1098,
+ "code": "1F6B4 1F3FE 200D 2640 FE0F",
+ "char": "🚴🏾‍♀️",
+ "name": "woman biking: medium-dark skin tone"
+ },
+ {
+ "no": 1099,
+ "code": "1F6B4 1F3FF 200D 2640 FE0F",
+ "char": "🚴🏿‍♀️",
+ "name": "woman biking: dark skin tone"
+ },
+ {
+ "no": 1100,
+ "code": "1F6B5",
+ "char": "🚵",
+ "name": "person mountain biking"
+ },
+ {
+ "no": 1101,
+ "code": "1F6B5 1F3FB",
+ "char": "🚵🏻",
+ "name": "person mountain biking: light skin tone"
+ },
+ {
+ "no": 1102,
+ "code": "1F6B5 1F3FC",
+ "char": "🚵🏼",
+ "name": "person mountain biking: medium-light skin tone"
+ },
+ {
+ "no": 1103,
+ "code": "1F6B5 1F3FD",
+ "char": "🚵🏽",
+ "name": "person mountain biking: medium skin tone"
+ },
+ {
+ "no": 1104,
+ "code": "1F6B5 1F3FE",
+ "char": "🚵🏾",
+ "name": "person mountain biking: medium-dark skin tone"
+ },
+ {
+ "no": 1105,
+ "code": "1F6B5 1F3FF",
+ "char": "🚵🏿",
+ "name": "person mountain biking: dark skin tone"
+ },
+ {
+ "no": 1106,
+ "code": "1F6B5 200D 2642 FE0F",
+ "char": "🚵‍♂️",
+ "name": "man mountain biking"
+ },
+ {
+ "no": 1107,
+ "code": "1F6B5 1F3FB 200D 2642 FE0F",
+ "char": "🚵🏻‍♂️",
+ "name": "man mountain biking: light skin tone"
+ },
+ {
+ "no": 1108,
+ "code": "1F6B5 1F3FC 200D 2642 FE0F",
+ "char": "🚵🏼‍♂️",
+ "name": "man mountain biking: medium-light skin tone"
+ },
+ {
+ "no": 1109,
+ "code": "1F6B5 1F3FD 200D 2642 FE0F",
+ "char": "🚵🏽‍♂️",
+ "name": "man mountain biking: medium skin tone"
+ },
+ {
+ "no": 1110,
+ "code": "1F6B5 1F3FE 200D 2642 FE0F",
+ "char": "🚵🏾‍♂️",
+ "name": "man mountain biking: medium-dark skin tone"
+ },
+ {
+ "no": 1111,
+ "code": "1F6B5 1F3FF 200D 2642 FE0F",
+ "char": "🚵🏿‍♂️",
+ "name": "man mountain biking: dark skin tone"
+ },
+ {
+ "no": 1112,
+ "code": "1F6B5 200D 2640 FE0F",
+ "char": "🚵‍♀️",
+ "name": "woman mountain biking"
+ },
+ {
+ "no": 1113,
+ "code": "1F6B5 1F3FB 200D 2640 FE0F",
+ "char": "🚵🏻‍♀️",
+ "name": "woman mountain biking: light skin tone"
+ },
+ {
+ "no": 1114,
+ "code": "1F6B5 1F3FC 200D 2640 FE0F",
+ "char": "🚵🏼‍♀️",
+ "name": "woman mountain biking: medium-light skin tone"
+ },
+ {
+ "no": 1115,
+ "code": "1F6B5 1F3FD 200D 2640 FE0F",
+ "char": "🚵🏽‍♀️",
+ "name": "woman mountain biking: medium skin tone"
+ },
+ {
+ "no": 1116,
+ "code": "1F6B5 1F3FE 200D 2640 FE0F",
+ "char": "🚵🏾‍♀️",
+ "name": "woman mountain biking: medium-dark skin tone"
+ },
+ {
+ "no": 1117,
+ "code": "1F6B5 1F3FF 200D 2640 FE0F",
+ "char": "🚵🏿‍♀️",
+ "name": "woman mountain biking: dark skin tone"
+ },
+ {
+ "no": 1118,
+ "code": "1F3CE",
+ "char": "🏎",
+ "name": "racing car"
+ },
+ {
+ "no": 1119,
+ "code": "1F3CD",
+ "char": "🏍",
+ "name": "motorcycle"
+ },
+ {
+ "no": 1120,
+ "code": "1F938",
+ "char": "🤸",
+ "name": "person cartwheeling"
+ },
+ {
+ "no": 1121,
+ "code": "1F938 1F3FB",
+ "char": "🤸🏻",
+ "name": "person cartwheeling: light skin tone"
+ },
+ {
+ "no": 1122,
+ "code": "1F938 1F3FC",
+ "char": "🤸🏼",
+ "name": "person cartwheeling: medium-light skin tone"
+ },
+ {
+ "no": 1123,
+ "code": "1F938 1F3FD",
+ "char": "🤸🏽",
+ "name": "person cartwheeling: medium skin tone"
+ },
+ {
+ "no": 1124,
+ "code": "1F938 1F3FE",
+ "char": "🤸🏾",
+ "name": "person cartwheeling: medium-dark skin tone"
+ },
+ {
+ "no": 1125,
+ "code": "1F938 1F3FF",
+ "char": "🤸🏿",
+ "name": "person cartwheeling: dark skin tone"
+ },
+ {
+ "no": 1126,
+ "code": "1F938 200D 2642 FE0F",
+ "char": "🤸‍♂️",
+ "name": "man cartwheeling"
+ },
+ {
+ "no": 1127,
+ "code": "1F938 1F3FB 200D 2642 FE0F",
+ "char": "🤸🏻‍♂️",
+ "name": "man cartwheeling: light skin tone"
+ },
+ {
+ "no": 1128,
+ "code": "1F938 1F3FC 200D 2642 FE0F",
+ "char": "🤸🏼‍♂️",
+ "name": "man cartwheeling: medium-light skin tone"
+ },
+ {
+ "no": 1129,
+ "code": "1F938 1F3FD 200D 2642 FE0F",
+ "char": "🤸🏽‍♂️",
+ "name": "man cartwheeling: medium skin tone"
+ },
+ {
+ "no": 1130,
+ "code": "1F938 1F3FE 200D 2642 FE0F",
+ "char": "🤸🏾‍♂️",
+ "name": "man cartwheeling: medium-dark skin tone"
+ },
+ {
+ "no": 1131,
+ "code": "1F938 1F3FF 200D 2642 FE0F",
+ "char": "🤸🏿‍♂️",
+ "name": "man cartwheeling: dark skin tone"
+ },
+ {
+ "no": 1132,
+ "code": "1F938 200D 2640 FE0F",
+ "char": "🤸‍♀️",
+ "name": "woman cartwheeling"
+ },
+ {
+ "no": 1133,
+ "code": "1F938 1F3FB 200D 2640 FE0F",
+ "char": "🤸🏻‍♀️",
+ "name": "woman cartwheeling: light skin tone"
+ },
+ {
+ "no": 1134,
+ "code": "1F938 1F3FC 200D 2640 FE0F",
+ "char": "🤸🏼‍♀️",
+ "name": "woman cartwheeling: medium-light skin tone"
+ },
+ {
+ "no": 1135,
+ "code": "1F938 1F3FD 200D 2640 FE0F",
+ "char": "🤸🏽‍♀️",
+ "name": "woman cartwheeling: medium skin tone"
+ },
+ {
+ "no": 1136,
+ "code": "1F938 1F3FE 200D 2640 FE0F",
+ "char": "🤸🏾‍♀️",
+ "name": "woman cartwheeling: medium-dark skin tone"
+ },
+ {
+ "no": 1137,
+ "code": "1F938 1F3FF 200D 2640 FE0F",
+ "char": "🤸🏿‍♀️",
+ "name": "woman cartwheeling: dark skin tone"
+ },
+ {
+ "no": 1138,
+ "code": "1F93C",
+ "char": "🤼",
+ "name": "people wrestling"
+ },
+ {
+ "no": 1139,
+ "code": "1F93C 200D 2642 FE0F",
+ "char": "🤼‍♂️",
+ "name": "men wrestling"
+ },
+ {
+ "no": 1140,
+ "code": "1F93C 200D 2640 FE0F",
+ "char": "🤼‍♀️",
+ "name": "women wrestling"
+ },
+ {
+ "no": 1141,
+ "code": "1F93D",
+ "char": "🤽",
+ "name": "person playing water polo"
+ },
+ {
+ "no": 1142,
+ "code": "1F93D 1F3FB",
+ "char": "🤽🏻",
+ "name": "person playing water polo: light skin tone"
+ },
+ {
+ "no": 1143,
+ "code": "1F93D 1F3FC",
+ "char": "🤽🏼",
+ "name": "person playing water polo: medium-light skin tone"
+ },
+ {
+ "no": 1144,
+ "code": "1F93D 1F3FD",
+ "char": "🤽🏽",
+ "name": "person playing water polo: medium skin tone"
+ },
+ {
+ "no": 1145,
+ "code": "1F93D 1F3FE",
+ "char": "🤽🏾",
+ "name": "person playing water polo: medium-dark skin tone"
+ },
+ {
+ "no": 1146,
+ "code": "1F93D 1F3FF",
+ "char": "🤽🏿",
+ "name": "person playing water polo: dark skin tone"
+ },
+ {
+ "no": 1147,
+ "code": "1F93D 200D 2642 FE0F",
+ "char": "🤽‍♂️",
+ "name": "man playing water polo"
+ },
+ {
+ "no": 1148,
+ "code": "1F93D 1F3FB 200D 2642 FE0F",
+ "char": "🤽🏻‍♂️",
+ "name": "man playing water polo: light skin tone"
+ },
+ {
+ "no": 1149,
+ "code": "1F93D 1F3FC 200D 2642 FE0F",
+ "char": "🤽🏼‍♂️",
+ "name": "man playing water polo: medium-light skin tone"
+ },
+ {
+ "no": 1150,
+ "code": "1F93D 1F3FD 200D 2642 FE0F",
+ "char": "🤽🏽‍♂️",
+ "name": "man playing water polo: medium skin tone"
+ },
+ {
+ "no": 1151,
+ "code": "1F93D 1F3FE 200D 2642 FE0F",
+ "char": "🤽🏾‍♂️",
+ "name": "man playing water polo: medium-dark skin tone"
+ },
+ {
+ "no": 1152,
+ "code": "1F93D 1F3FF 200D 2642 FE0F",
+ "char": "🤽🏿‍♂️",
+ "name": "man playing water polo: dark skin tone"
+ },
+ {
+ "no": 1153,
+ "code": "1F93D 200D 2640 FE0F",
+ "char": "🤽‍♀️",
+ "name": "woman playing water polo"
+ },
+ {
+ "no": 1154,
+ "code": "1F93D 1F3FB 200D 2640 FE0F",
+ "char": "🤽🏻‍♀️",
+ "name": "woman playing water polo: light skin tone"
+ },
+ {
+ "no": 1155,
+ "code": "1F93D 1F3FC 200D 2640 FE0F",
+ "char": "🤽🏼‍♀️",
+ "name": "woman playing water polo: medium-light skin tone"
+ },
+ {
+ "no": 1156,
+ "code": "1F93D 1F3FD 200D 2640 FE0F",
+ "char": "🤽🏽‍♀️",
+ "name": "woman playing water polo: medium skin tone"
+ },
+ {
+ "no": 1157,
+ "code": "1F93D 1F3FE 200D 2640 FE0F",
+ "char": "🤽🏾‍♀️",
+ "name": "woman playing water polo: medium-dark skin tone"
+ },
+ {
+ "no": 1158,
+ "code": "1F93D 1F3FF 200D 2640 FE0F",
+ "char": "🤽🏿‍♀️",
+ "name": "woman playing water polo: dark skin tone"
+ },
+ {
+ "no": 1159,
+ "code": "1F93E",
+ "char": "🤾",
+ "name": "person playing handball"
+ },
+ {
+ "no": 1160,
+ "code": "1F93E 1F3FB",
+ "char": "🤾🏻",
+ "name": "person playing handball: light skin tone"
+ },
+ {
+ "no": 1161,
+ "code": "1F93E 1F3FC",
+ "char": "🤾🏼",
+ "name": "person playing handball: medium-light skin tone"
+ },
+ {
+ "no": 1162,
+ "code": "1F93E 1F3FD",
+ "char": "🤾🏽",
+ "name": "person playing handball: medium skin tone"
+ },
+ {
+ "no": 1163,
+ "code": "1F93E 1F3FE",
+ "char": "🤾🏾",
+ "name": "person playing handball: medium-dark skin tone"
+ },
+ {
+ "no": 1164,
+ "code": "1F93E 1F3FF",
+ "char": "🤾🏿",
+ "name": "person playing handball: dark skin tone"
+ },
+ {
+ "no": 1165,
+ "code": "1F93E 200D 2642 FE0F",
+ "char": "🤾‍♂️",
+ "name": "man playing handball"
+ },
+ {
+ "no": 1166,
+ "code": "1F93E 1F3FB 200D 2642 FE0F",
+ "char": "🤾🏻‍♂️",
+ "name": "man playing handball: light skin tone"
+ },
+ {
+ "no": 1167,
+ "code": "1F93E 1F3FC 200D 2642 FE0F",
+ "char": "🤾🏼‍♂️",
+ "name": "man playing handball: medium-light skin tone"
+ },
+ {
+ "no": 1168,
+ "code": "1F93E 1F3FD 200D 2642 FE0F",
+ "char": "🤾🏽‍♂️",
+ "name": "man playing handball: medium skin tone"
+ },
+ {
+ "no": 1169,
+ "code": "1F93E 1F3FE 200D 2642 FE0F",
+ "char": "🤾🏾‍♂️",
+ "name": "man playing handball: medium-dark skin tone"
+ },
+ {
+ "no": 1170,
+ "code": "1F93E 1F3FF 200D 2642 FE0F",
+ "char": "🤾🏿‍♂️",
+ "name": "man playing handball: dark skin tone"
+ },
+ {
+ "no": 1171,
+ "code": "1F93E 200D 2640 FE0F",
+ "char": "🤾‍♀️",
+ "name": "woman playing handball"
+ },
+ {
+ "no": 1172,
+ "code": "1F93E 1F3FB 200D 2640 FE0F",
+ "char": "🤾🏻‍♀️",
+ "name": "woman playing handball: light skin tone"
+ },
+ {
+ "no": 1173,
+ "code": "1F93E 1F3FC 200D 2640 FE0F",
+ "char": "🤾🏼‍♀️",
+ "name": "woman playing handball: medium-light skin tone"
+ },
+ {
+ "no": 1174,
+ "code": "1F93E 1F3FD 200D 2640 FE0F",
+ "char": "🤾🏽‍♀️",
+ "name": "woman playing handball: medium skin tone"
+ },
+ {
+ "no": 1175,
+ "code": "1F93E 1F3FE 200D 2640 FE0F",
+ "char": "🤾🏾‍♀️",
+ "name": "woman playing handball: medium-dark skin tone"
+ },
+ {
+ "no": 1176,
+ "code": "1F93E 1F3FF 200D 2640 FE0F",
+ "char": "🤾🏿‍♀️",
+ "name": "woman playing handball: dark skin tone"
+ },
+ {
+ "no": 1177,
+ "code": "1F939",
+ "char": "🤹",
+ "name": "person juggling"
+ },
+ {
+ "no": 1178,
+ "code": "1F939 1F3FB",
+ "char": "🤹🏻",
+ "name": "person juggling: light skin tone"
+ },
+ {
+ "no": 1179,
+ "code": "1F939 1F3FC",
+ "char": "🤹🏼",
+ "name": "person juggling: medium-light skin tone"
+ },
+ {
+ "no": 1180,
+ "code": "1F939 1F3FD",
+ "char": "🤹🏽",
+ "name": "person juggling: medium skin tone"
+ },
+ {
+ "no": 1181,
+ "code": "1F939 1F3FE",
+ "char": "🤹🏾",
+ "name": "person juggling: medium-dark skin tone"
+ },
+ {
+ "no": 1182,
+ "code": "1F939 1F3FF",
+ "char": "🤹🏿",
+ "name": "person juggling: dark skin tone"
+ },
+ {
+ "no": 1183,
+ "code": "1F939 200D 2642 FE0F",
+ "char": "🤹‍♂️",
+ "name": "man juggling"
+ },
+ {
+ "no": 1184,
+ "code": "1F939 1F3FB 200D 2642 FE0F",
+ "char": "🤹🏻‍♂️",
+ "name": "man juggling: light skin tone"
+ },
+ {
+ "no": 1185,
+ "code": "1F939 1F3FC 200D 2642 FE0F",
+ "char": "🤹🏼‍♂️",
+ "name": "man juggling: medium-light skin tone"
+ },
+ {
+ "no": 1186,
+ "code": "1F939 1F3FD 200D 2642 FE0F",
+ "char": "🤹🏽‍♂️",
+ "name": "man juggling: medium skin tone"
+ },
+ {
+ "no": 1187,
+ "code": "1F939 1F3FE 200D 2642 FE0F",
+ "char": "🤹🏾‍♂️",
+ "name": "man juggling: medium-dark skin tone"
+ },
+ {
+ "no": 1188,
+ "code": "1F939 1F3FF 200D 2642 FE0F",
+ "char": "🤹🏿‍♂️",
+ "name": "man juggling: dark skin tone"
+ },
+ {
+ "no": 1189,
+ "code": "1F939 200D 2640 FE0F",
+ "char": "🤹‍♀️",
+ "name": "woman juggling"
+ },
+ {
+ "no": 1190,
+ "code": "1F939 1F3FB 200D 2640 FE0F",
+ "char": "🤹🏻‍♀️",
+ "name": "woman juggling: light skin tone"
+ },
+ {
+ "no": 1191,
+ "code": "1F939 1F3FC 200D 2640 FE0F",
+ "char": "🤹🏼‍♀️",
+ "name": "woman juggling: medium-light skin tone"
+ },
+ {
+ "no": 1192,
+ "code": "1F939 1F3FD 200D 2640 FE0F",
+ "char": "🤹🏽‍♀️",
+ "name": "woman juggling: medium skin tone"
+ },
+ {
+ "no": 1193,
+ "code": "1F939 1F3FE 200D 2640 FE0F",
+ "char": "🤹🏾‍♀️",
+ "name": "woman juggling: medium-dark skin tone"
+ },
+ {
+ "no": 1194,
+ "code": "1F939 1F3FF 200D 2640 FE0F",
+ "char": "🤹🏿‍♀️",
+ "name": "woman juggling: dark skin tone"
+ },
+ {
+ "no": 1195,
+ "code": "1F46B",
+ "char": "👫",
+ "name": "man and woman holding hands"
+ },
+ {
+ "no": 1196,
+ "code": "1F46C",
+ "char": "👬",
+ "name": "two men holding hands"
+ },
+ {
+ "no": 1197,
+ "code": "1F46D",
+ "char": "👭",
+ "name": "two women holding hands"
+ },
+ {
+ "no": 1198,
+ "code": "1F48F",
+ "char": "💏",
+ "name": "kiss"
+ },
+ {
+ "no": 1199,
+ "code": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F468",
+ "char": "👩‍❤️‍💋‍👨",
+ "name": "kiss: woman, man"
+ },
+ {
+ "no": 1200,
+ "code": "1F468 200D 2764 FE0F 200D 1F48B 200D 1F468",
+ "char": "👨‍❤️‍💋‍👨",
+ "name": "kiss: man, man"
+ },
+ {
+ "no": 1201,
+ "code": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F469",
+ "char": "👩‍❤️‍💋‍👩",
+ "name": "kiss: woman, woman"
+ },
+ {
+ "no": 1202,
+ "code": "1F491",
+ "char": "💑",
+ "name": "couple with heart"
+ },
+ {
+ "no": 1203,
+ "code": "1F469 200D 2764 FE0F 200D 1F468",
+ "char": "👩‍❤️‍👨",
+ "name": "couple with heart: woman, man"
+ },
+ {
+ "no": 1204,
+ "code": "1F468 200D 2764 FE0F 200D 1F468",
+ "char": "👨‍❤️‍👨",
+ "name": "couple with heart: man, man"
+ },
+ {
+ "no": 1205,
+ "code": "1F469 200D 2764 FE0F 200D 1F469",
+ "char": "👩‍❤️‍👩",
+ "name": "couple with heart: woman, woman"
+ },
+ {
+ "no": 1206,
+ "code": "1F46A",
+ "char": "👪",
+ "name": "family"
+ },
+ {
+ "no": 1207,
+ "code": "1F468 200D 1F469 200D 1F466",
+ "char": "👨‍👩‍👦",
+ "name": "family: man, woman, boy"
+ },
+ {
+ "no": 1208,
+ "code": "1F468 200D 1F469 200D 1F467",
+ "char": "👨‍👩‍👧",
+ "name": "family: man, woman, girl"
+ },
+ {
+ "no": 1209,
+ "code": "1F468 200D 1F469 200D 1F467 200D 1F466",
+ "char": "👨‍👩‍👧‍👦",
+ "name": "family: man, woman, girl, boy"
+ },
+ {
+ "no": 1210,
+ "code": "1F468 200D 1F469 200D 1F466 200D 1F466",
+ "char": "👨‍👩‍👦‍👦",
+ "name": "family: man, woman, boy, boy"
+ },
+ {
+ "no": 1211,
+ "code": "1F468 200D 1F469 200D 1F467 200D 1F467",
+ "char": "👨‍👩‍👧‍👧",
+ "name": "family: man, woman, girl, girl"
+ },
+ {
+ "no": 1212,
+ "code": "1F468 200D 1F468 200D 1F466",
+ "char": "👨‍👨‍👦",
+ "name": "family: man, man, boy"
+ },
+ {
+ "no": 1213,
+ "code": "1F468 200D 1F468 200D 1F467",
+ "char": "👨‍👨‍👧",
+ "name": "family: man, man, girl"
+ },
+ {
+ "no": 1214,
+ "code": "1F468 200D 1F468 200D 1F467 200D 1F466",
+ "char": "👨‍👨‍👧‍👦",
+ "name": "family: man, man, girl, boy"
+ },
+ {
+ "no": 1215,
+ "code": "1F468 200D 1F468 200D 1F466 200D 1F466",
+ "char": "👨‍👨‍👦‍👦",
+ "name": "family: man, man, boy, boy"
+ },
+ {
+ "no": 1216,
+ "code": "1F468 200D 1F468 200D 1F467 200D 1F467",
+ "char": "👨‍👨‍👧‍👧",
+ "name": "family: man, man, girl, girl"
+ },
+ {
+ "no": 1217,
+ "code": "1F469 200D 1F469 200D 1F466",
+ "char": "👩‍👩‍👦",
+ "name": "family: woman, woman, boy"
+ },
+ {
+ "no": 1218,
+ "code": "1F469 200D 1F469 200D 1F467",
+ "char": "👩‍👩‍👧",
+ "name": "family: woman, woman, girl"
+ },
+ {
+ "no": 1219,
+ "code": "1F469 200D 1F469 200D 1F467 200D 1F466",
+ "char": "👩‍👩‍👧‍👦",
+ "name": "family: woman, woman, girl, boy"
+ },
+ {
+ "no": 1220,
+ "code": "1F469 200D 1F469 200D 1F466 200D 1F466",
+ "char": "👩‍👩‍👦‍👦",
+ "name": "family: woman, woman, boy, boy"
+ },
+ {
+ "no": 1221,
+ "code": "1F469 200D 1F469 200D 1F467 200D 1F467",
+ "char": "👩‍👩‍👧‍👧",
+ "name": "family: woman, woman, girl, girl"
+ },
+ {
+ "no": 1222,
+ "code": "1F468 200D 1F466",
+ "char": "👨‍👦",
+ "name": "family: man, boy"
+ },
+ {
+ "no": 1223,
+ "code": "1F468 200D 1F466 200D 1F466",
+ "char": "👨‍👦‍👦",
+ "name": "family: man, boy, boy"
+ },
+ {
+ "no": 1224,
+ "code": "1F468 200D 1F467",
+ "char": "👨‍👧",
+ "name": "family: man, girl"
+ },
+ {
+ "no": 1225,
+ "code": "1F468 200D 1F467 200D 1F466",
+ "char": "👨‍👧‍👦",
+ "name": "family: man, girl, boy"
+ },
+ {
+ "no": 1226,
+ "code": "1F468 200D 1F467 200D 1F467",
+ "char": "👨‍👧‍👧",
+ "name": "family: man, girl, girl"
+ },
+ {
+ "no": 1227,
+ "code": "1F469 200D 1F466",
+ "char": "👩‍👦",
+ "name": "family: woman, boy"
+ },
+ {
+ "no": 1228,
+ "code": "1F469 200D 1F466 200D 1F466",
+ "char": "👩‍👦‍👦",
+ "name": "family: woman, boy, boy"
+ },
+ {
+ "no": 1229,
+ "code": "1F469 200D 1F467",
+ "char": "👩‍👧",
+ "name": "family: woman, girl"
+ },
+ {
+ "no": 1230,
+ "code": "1F469 200D 1F467 200D 1F466",
+ "char": "👩‍👧‍👦",
+ "name": "family: woman, girl, boy"
+ },
+ {
+ "no": 1231,
+ "code": "1F469 200D 1F467 200D 1F467",
+ "char": "👩‍👧‍👧",
+ "name": "family: woman, girl, girl"
+ },
+ {
+ "no": 1232,
+ "code": "1F933",
+ "char": "🤳",
+ "name": "selfie"
+ },
+ {
+ "no": 1233,
+ "code": "1F933 1F3FB",
+ "char": "🤳🏻",
+ "name": "selfie: light skin tone"
+ },
+ {
+ "no": 1234,
+ "code": "1F933 1F3FC",
+ "char": "🤳🏼",
+ "name": "selfie: medium-light skin tone"
+ },
+ {
+ "no": 1235,
+ "code": "1F933 1F3FD",
+ "char": "🤳🏽",
+ "name": "selfie: medium skin tone"
+ },
+ {
+ "no": 1236,
+ "code": "1F933 1F3FE",
+ "char": "🤳🏾",
+ "name": "selfie: medium-dark skin tone"
+ },
+ {
+ "no": 1237,
+ "code": "1F933 1F3FF",
+ "char": "🤳🏿",
+ "name": "selfie: dark skin tone"
+ },
+ {
+ "no": 1238,
+ "code": "1F4AA",
+ "char": "💪",
+ "name": "flexed biceps"
+ },
+ {
+ "no": 1239,
+ "code": "1F4AA 1F3FB",
+ "char": "💪🏻",
+ "name": "flexed biceps: light skin tone"
+ },
+ {
+ "no": 1240,
+ "code": "1F4AA 1F3FC",
+ "char": "💪🏼",
+ "name": "flexed biceps: medium-light skin tone"
+ },
+ {
+ "no": 1241,
+ "code": "1F4AA 1F3FD",
+ "char": "💪🏽",
+ "name": "flexed biceps: medium skin tone"
+ },
+ {
+ "no": 1242,
+ "code": "1F4AA 1F3FE",
+ "char": "💪🏾",
+ "name": "flexed biceps: medium-dark skin tone"
+ },
+ {
+ "no": 1243,
+ "code": "1F4AA 1F3FF",
+ "char": "💪🏿",
+ "name": "flexed biceps: dark skin tone"
+ },
+ {
+ "no": 1244,
+ "code": "1F448",
+ "char": "👈",
+ "name": "backhand index pointing left"
+ },
+ {
+ "no": 1245,
+ "code": "1F448 1F3FB",
+ "char": "👈🏻",
+ "name": "backhand index pointing left: light skin tone"
+ },
+ {
+ "no": 1246,
+ "code": "1F448 1F3FC",
+ "char": "👈🏼",
+ "name": "backhand index pointing left: medium-light skin tone"
+ },
+ {
+ "no": 1247,
+ "code": "1F448 1F3FD",
+ "char": "👈🏽",
+ "name": "backhand index pointing left: medium skin tone"
+ },
+ {
+ "no": 1248,
+ "code": "1F448 1F3FE",
+ "char": "👈🏾",
+ "name": "backhand index pointing left: medium-dark skin tone"
+ },
+ {
+ "no": 1249,
+ "code": "1F448 1F3FF",
+ "char": "👈🏿",
+ "name": "backhand index pointing left: dark skin tone"
+ },
+ {
+ "no": 1250,
+ "code": "1F449",
+ "char": "👉",
+ "name": "backhand index pointing right"
+ },
+ {
+ "no": 1251,
+ "code": "1F449 1F3FB",
+ "char": "👉🏻",
+ "name": "backhand index pointing right: light skin tone"
+ },
+ {
+ "no": 1252,
+ "code": "1F449 1F3FC",
+ "char": "👉🏼",
+ "name": "backhand index pointing right: medium-light skin tone"
+ },
+ {
+ "no": 1253,
+ "code": "1F449 1F3FD",
+ "char": "👉🏽",
+ "name": "backhand index pointing right: medium skin tone"
+ },
+ {
+ "no": 1254,
+ "code": "1F449 1F3FE",
+ "char": "👉🏾",
+ "name": "backhand index pointing right: medium-dark skin tone"
+ },
+ {
+ "no": 1255,
+ "code": "1F449 1F3FF",
+ "char": "👉🏿",
+ "name": "backhand index pointing right: dark skin tone"
+ },
+ {
+ "no": 1256,
+ "code": "261D",
+ "char": "☝",
+ "name": "index pointing up"
+ },
+ {
+ "no": 1257,
+ "code": "261D 1F3FB",
+ "char": "☝🏻",
+ "name": "index pointing up: light skin tone"
+ },
+ {
+ "no": 1258,
+ "code": "261D 1F3FC",
+ "char": "☝🏼",
+ "name": "index pointing up: medium-light skin tone"
+ },
+ {
+ "no": 1259,
+ "code": "261D 1F3FD",
+ "char": "☝🏽",
+ "name": "index pointing up: medium skin tone"
+ },
+ {
+ "no": 1260,
+ "code": "261D 1F3FE",
+ "char": "☝🏾",
+ "name": "index pointing up: medium-dark skin tone"
+ },
+ {
+ "no": 1261,
+ "code": "261D 1F3FF",
+ "char": "☝🏿",
+ "name": "index pointing up: dark skin tone"
+ },
+ {
+ "no": 1262,
+ "code": "1F446",
+ "char": "👆",
+ "name": "backhand index pointing up"
+ },
+ {
+ "no": 1263,
+ "code": "1F446 1F3FB",
+ "char": "👆🏻",
+ "name": "backhand index pointing up: light skin tone"
+ },
+ {
+ "no": 1264,
+ "code": "1F446 1F3FC",
+ "char": "👆🏼",
+ "name": "backhand index pointing up: medium-light skin tone"
+ },
+ {
+ "no": 1265,
+ "code": "1F446 1F3FD",
+ "char": "👆🏽",
+ "name": "backhand index pointing up: medium skin tone"
+ },
+ {
+ "no": 1266,
+ "code": "1F446 1F3FE",
+ "char": "👆🏾",
+ "name": "backhand index pointing up: medium-dark skin tone"
+ },
+ {
+ "no": 1267,
+ "code": "1F446 1F3FF",
+ "char": "👆🏿",
+ "name": "backhand index pointing up: dark skin tone"
+ },
+ {
+ "no": 1268,
+ "code": "1F595",
+ "char": "🖕",
+ "name": "middle finger"
+ },
+ {
+ "no": 1269,
+ "code": "1F595 1F3FB",
+ "char": "🖕🏻",
+ "name": "middle finger: light skin tone"
+ },
+ {
+ "no": 1270,
+ "code": "1F595 1F3FC",
+ "char": "🖕🏼",
+ "name": "middle finger: medium-light skin tone"
+ },
+ {
+ "no": 1271,
+ "code": "1F595 1F3FD",
+ "char": "🖕🏽",
+ "name": "middle finger: medium skin tone"
+ },
+ {
+ "no": 1272,
+ "code": "1F595 1F3FE",
+ "char": "🖕🏾",
+ "name": "middle finger: medium-dark skin tone"
+ },
+ {
+ "no": 1273,
+ "code": "1F595 1F3FF",
+ "char": "🖕🏿",
+ "name": "middle finger: dark skin tone"
+ },
+ {
+ "no": 1274,
+ "code": "1F447",
+ "char": "👇",
+ "name": "backhand index pointing down"
+ },
+ {
+ "no": 1275,
+ "code": "1F447 1F3FB",
+ "char": "👇🏻",
+ "name": "backhand index pointing down: light skin tone"
+ },
+ {
+ "no": 1276,
+ "code": "1F447 1F3FC",
+ "char": "👇🏼",
+ "name": "backhand index pointing down: medium-light skin tone"
+ },
+ {
+ "no": 1277,
+ "code": "1F447 1F3FD",
+ "char": "👇🏽",
+ "name": "backhand index pointing down: medium skin tone"
+ },
+ {
+ "no": 1278,
+ "code": "1F447 1F3FE",
+ "char": "👇🏾",
+ "name": "backhand index pointing down: medium-dark skin tone"
+ },
+ {
+ "no": 1279,
+ "code": "1F447 1F3FF",
+ "char": "👇🏿",
+ "name": "backhand index pointing down: dark skin tone"
+ },
+ {
+ "no": 1280,
+ "code": "270C",
+ "char": "✌",
+ "name": "victory hand"
+ },
+ {
+ "no": 1281,
+ "code": "270C 1F3FB",
+ "char": "✌🏻",
+ "name": "victory hand: light skin tone"
+ },
+ {
+ "no": 1282,
+ "code": "270C 1F3FC",
+ "char": "✌🏼",
+ "name": "victory hand: medium-light skin tone"
+ },
+ {
+ "no": 1283,
+ "code": "270C 1F3FD",
+ "char": "✌🏽",
+ "name": "victory hand: medium skin tone"
+ },
+ {
+ "no": 1284,
+ "code": "270C 1F3FE",
+ "char": "✌🏾",
+ "name": "victory hand: medium-dark skin tone"
+ },
+ {
+ "no": 1285,
+ "code": "270C 1F3FF",
+ "char": "✌🏿",
+ "name": "victory hand: dark skin tone"
+ },
+ {
+ "no": 1286,
+ "code": "1F91E",
+ "char": "🤞",
+ "name": "crossed fingers"
+ },
+ {
+ "no": 1287,
+ "code": "1F91E 1F3FB",
+ "char": "🤞🏻",
+ "name": "crossed fingers: light skin tone"
+ },
+ {
+ "no": 1288,
+ "code": "1F91E 1F3FC",
+ "char": "🤞🏼",
+ "name": "crossed fingers: medium-light skin tone"
+ },
+ {
+ "no": 1289,
+ "code": "1F91E 1F3FD",
+ "char": "🤞🏽",
+ "name": "crossed fingers: medium skin tone"
+ },
+ {
+ "no": 1290,
+ "code": "1F91E 1F3FE",
+ "char": "🤞🏾",
+ "name": "crossed fingers: medium-dark skin tone"
+ },
+ {
+ "no": 1291,
+ "code": "1F91E 1F3FF",
+ "char": "🤞🏿",
+ "name": "crossed fingers: dark skin tone"
+ },
+ {
+ "no": 1292,
+ "code": "1F596",
+ "char": "🖖",
+ "name": "vulcan salute"
+ },
+ {
+ "no": 1293,
+ "code": "1F596 1F3FB",
+ "char": "🖖🏻",
+ "name": "vulcan salute: light skin tone"
+ },
+ {
+ "no": 1294,
+ "code": "1F596 1F3FC",
+ "char": "🖖🏼",
+ "name": "vulcan salute: medium-light skin tone"
+ },
+ {
+ "no": 1295,
+ "code": "1F596 1F3FD",
+ "char": "🖖🏽",
+ "name": "vulcan salute: medium skin tone"
+ },
+ {
+ "no": 1296,
+ "code": "1F596 1F3FE",
+ "char": "🖖🏾",
+ "name": "vulcan salute: medium-dark skin tone"
+ },
+ {
+ "no": 1297,
+ "code": "1F596 1F3FF",
+ "char": "🖖🏿",
+ "name": "vulcan salute: dark skin tone"
+ },
+ {
+ "no": 1298,
+ "code": "1F918",
+ "char": "🤘",
+ "name": "sign of the horns"
+ },
+ {
+ "no": 1299,
+ "code": "1F918 1F3FB",
+ "char": "🤘🏻",
+ "name": "sign of the horns: light skin tone"
+ },
+ {
+ "no": 1300,
+ "code": "1F918 1F3FC",
+ "char": "🤘🏼",
+ "name": "sign of the horns: medium-light skin tone"
+ },
+ {
+ "no": 1301,
+ "code": "1F918 1F3FD",
+ "char": "🤘🏽",
+ "name": "sign of the horns: medium skin tone"
+ },
+ {
+ "no": 1302,
+ "code": "1F918 1F3FE",
+ "char": "🤘🏾",
+ "name": "sign of the horns: medium-dark skin tone"
+ },
+ {
+ "no": 1303,
+ "code": "1F918 1F3FF",
+ "char": "🤘🏿",
+ "name": "sign of the horns: dark skin tone"
+ },
+ {
+ "no": 1304,
+ "code": "1F919",
+ "char": "🤙",
+ "name": "call me hand"
+ },
+ {
+ "no": 1305,
+ "code": "1F919 1F3FB",
+ "char": "🤙🏻",
+ "name": "call me hand: light skin tone"
+ },
+ {
+ "no": 1306,
+ "code": "1F919 1F3FC",
+ "char": "🤙🏼",
+ "name": "call me hand: medium-light skin tone"
+ },
+ {
+ "no": 1307,
+ "code": "1F919 1F3FD",
+ "char": "🤙🏽",
+ "name": "call me hand: medium skin tone"
+ },
+ {
+ "no": 1308,
+ "code": "1F919 1F3FE",
+ "char": "🤙🏾",
+ "name": "call me hand: medium-dark skin tone"
+ },
+ {
+ "no": 1309,
+ "code": "1F919 1F3FF",
+ "char": "🤙🏿",
+ "name": "call me hand: dark skin tone"
+ },
+ {
+ "no": 1310,
+ "code": "1F590",
+ "char": "🖐",
+ "name": "hand with fingers splayed"
+ },
+ {
+ "no": 1311,
+ "code": "1F590 1F3FB",
+ "char": "🖐🏻",
+ "name": "hand with fingers splayed: light skin tone"
+ },
+ {
+ "no": 1312,
+ "code": "1F590 1F3FC",
+ "char": "🖐🏼",
+ "name": "hand with fingers splayed: medium-light skin tone"
+ },
+ {
+ "no": 1313,
+ "code": "1F590 1F3FD",
+ "char": "🖐🏽",
+ "name": "hand with fingers splayed: medium skin tone"
+ },
+ {
+ "no": 1314,
+ "code": "1F590 1F3FE",
+ "char": "🖐🏾",
+ "name": "hand with fingers splayed: medium-dark skin tone"
+ },
+ {
+ "no": 1315,
+ "code": "1F590 1F3FF",
+ "char": "🖐🏿",
+ "name": "hand with fingers splayed: dark skin tone"
+ },
+ {
+ "no": 1316,
+ "code": "270B",
+ "char": "✋",
+ "name": "raised hand"
+ },
+ {
+ "no": 1317,
+ "code": "270B 1F3FB",
+ "char": "✋🏻",
+ "name": "raised hand: light skin tone"
+ },
+ {
+ "no": 1318,
+ "code": "270B 1F3FC",
+ "char": "✋🏼",
+ "name": "raised hand: medium-light skin tone"
+ },
+ {
+ "no": 1319,
+ "code": "270B 1F3FD",
+ "char": "✋🏽",
+ "name": "raised hand: medium skin tone"
+ },
+ {
+ "no": 1320,
+ "code": "270B 1F3FE",
+ "char": "✋🏾",
+ "name": "raised hand: medium-dark skin tone"
+ },
+ {
+ "no": 1321,
+ "code": "270B 1F3FF",
+ "char": "✋🏿",
+ "name": "raised hand: dark skin tone"
+ },
+ {
+ "no": 1322,
+ "code": "1F44C",
+ "char": "👌",
+ "name": "OK hand"
+ },
+ {
+ "no": 1323,
+ "code": "1F44C 1F3FB",
+ "char": "👌🏻",
+ "name": "OK hand: light skin tone"
+ },
+ {
+ "no": 1324,
+ "code": "1F44C 1F3FC",
+ "char": "👌🏼",
+ "name": "OK hand: medium-light skin tone"
+ },
+ {
+ "no": 1325,
+ "code": "1F44C 1F3FD",
+ "char": "👌🏽",
+ "name": "OK hand: medium skin tone"
+ },
+ {
+ "no": 1326,
+ "code": "1F44C 1F3FE",
+ "char": "👌🏾",
+ "name": "OK hand: medium-dark skin tone"
+ },
+ {
+ "no": 1327,
+ "code": "1F44C 1F3FF",
+ "char": "👌🏿",
+ "name": "OK hand: dark skin tone"
+ },
+ {
+ "no": 1328,
+ "code": "1F44D",
+ "char": "👍",
+ "name": "thumbs up"
+ },
+ {
+ "no": 1329,
+ "code": "1F44D 1F3FB",
+ "char": "👍🏻",
+ "name": "thumbs up: light skin tone"
+ },
+ {
+ "no": 1330,
+ "code": "1F44D 1F3FC",
+ "char": "👍🏼",
+ "name": "thumbs up: medium-light skin tone"
+ },
+ {
+ "no": 1331,
+ "code": "1F44D 1F3FD",
+ "char": "👍🏽",
+ "name": "thumbs up: medium skin tone"
+ },
+ {
+ "no": 1332,
+ "code": "1F44D 1F3FE",
+ "char": "👍🏾",
+ "name": "thumbs up: medium-dark skin tone"
+ },
+ {
+ "no": 1333,
+ "code": "1F44D 1F3FF",
+ "char": "👍🏿",
+ "name": "thumbs up: dark skin tone"
+ },
+ {
+ "no": 1334,
+ "code": "1F44E",
+ "char": "👎",
+ "name": "thumbs down"
+ },
+ {
+ "no": 1335,
+ "code": "1F44E 1F3FB",
+ "char": "👎🏻",
+ "name": "thumbs down: light skin tone"
+ },
+ {
+ "no": 1336,
+ "code": "1F44E 1F3FC",
+ "char": "👎🏼",
+ "name": "thumbs down: medium-light skin tone"
+ },
+ {
+ "no": 1337,
+ "code": "1F44E 1F3FD",
+ "char": "👎🏽",
+ "name": "thumbs down: medium skin tone"
+ },
+ {
+ "no": 1338,
+ "code": "1F44E 1F3FE",
+ "char": "👎🏾",
+ "name": "thumbs down: medium-dark skin tone"
+ },
+ {
+ "no": 1339,
+ "code": "1F44E 1F3FF",
+ "char": "👎🏿",
+ "name": "thumbs down: dark skin tone"
+ },
+ {
+ "no": 1340,
+ "code": "270A",
+ "char": "✊",
+ "name": "raised fist"
+ },
+ {
+ "no": 1341,
+ "code": "270A 1F3FB",
+ "char": "✊🏻",
+ "name": "raised fist: light skin tone"
+ },
+ {
+ "no": 1342,
+ "code": "270A 1F3FC",
+ "char": "✊🏼",
+ "name": "raised fist: medium-light skin tone"
+ },
+ {
+ "no": 1343,
+ "code": "270A 1F3FD",
+ "char": "✊🏽",
+ "name": "raised fist: medium skin tone"
+ },
+ {
+ "no": 1344,
+ "code": "270A 1F3FE",
+ "char": "✊🏾",
+ "name": "raised fist: medium-dark skin tone"
+ },
+ {
+ "no": 1345,
+ "code": "270A 1F3FF",
+ "char": "✊🏿",
+ "name": "raised fist: dark skin tone"
+ },
+ {
+ "no": 1346,
+ "code": "1F44A",
+ "char": "👊",
+ "name": "oncoming fist"
+ },
+ {
+ "no": 1347,
+ "code": "1F44A 1F3FB",
+ "char": "👊🏻",
+ "name": "oncoming fist: light skin tone"
+ },
+ {
+ "no": 1348,
+ "code": "1F44A 1F3FC",
+ "char": "👊🏼",
+ "name": "oncoming fist: medium-light skin tone"
+ },
+ {
+ "no": 1349,
+ "code": "1F44A 1F3FD",
+ "char": "👊🏽",
+ "name": "oncoming fist: medium skin tone"
+ },
+ {
+ "no": 1350,
+ "code": "1F44A 1F3FE",
+ "char": "👊🏾",
+ "name": "oncoming fist: medium-dark skin tone"
+ },
+ {
+ "no": 1351,
+ "code": "1F44A 1F3FF",
+ "char": "👊🏿",
+ "name": "oncoming fist: dark skin tone"
+ },
+ {
+ "no": 1352,
+ "code": "1F91B",
+ "char": "🤛",
+ "name": "left-facing fist"
+ },
+ {
+ "no": 1353,
+ "code": "1F91B 1F3FB",
+ "char": "🤛🏻",
+ "name": "left-facing fist: light skin tone"
+ },
+ {
+ "no": 1354,
+ "code": "1F91B 1F3FC",
+ "char": "🤛🏼",
+ "name": "left-facing fist: medium-light skin tone"
+ },
+ {
+ "no": 1355,
+ "code": "1F91B 1F3FD",
+ "char": "🤛🏽",
+ "name": "left-facing fist: medium skin tone"
+ },
+ {
+ "no": 1356,
+ "code": "1F91B 1F3FE",
+ "char": "🤛🏾",
+ "name": "left-facing fist: medium-dark skin tone"
+ },
+ {
+ "no": 1357,
+ "code": "1F91B 1F3FF",
+ "char": "🤛🏿",
+ "name": "left-facing fist: dark skin tone"
+ },
+ {
+ "no": 1358,
+ "code": "1F91C",
+ "char": "🤜",
+ "name": "right-facing fist"
+ },
+ {
+ "no": 1359,
+ "code": "1F91C 1F3FB",
+ "char": "🤜🏻",
+ "name": "right-facing fist: light skin tone"
+ },
+ {
+ "no": 1360,
+ "code": "1F91C 1F3FC",
+ "char": "🤜🏼",
+ "name": "right-facing fist: medium-light skin tone"
+ },
+ {
+ "no": 1361,
+ "code": "1F91C 1F3FD",
+ "char": "🤜🏽",
+ "name": "right-facing fist: medium skin tone"
+ },
+ {
+ "no": 1362,
+ "code": "1F91C 1F3FE",
+ "char": "🤜🏾",
+ "name": "right-facing fist: medium-dark skin tone"
+ },
+ {
+ "no": 1363,
+ "code": "1F91C 1F3FF",
+ "char": "🤜🏿",
+ "name": "right-facing fist: dark skin tone"
+ },
+ {
+ "no": 1364,
+ "code": "1F91A",
+ "char": "🤚",
+ "name": "raised back of hand"
+ },
+ {
+ "no": 1365,
+ "code": "1F91A 1F3FB",
+ "char": "🤚🏻",
+ "name": "raised back of hand: light skin tone"
+ },
+ {
+ "no": 1366,
+ "code": "1F91A 1F3FC",
+ "char": "🤚🏼",
+ "name": "raised back of hand: medium-light skin tone"
+ },
+ {
+ "no": 1367,
+ "code": "1F91A 1F3FD",
+ "char": "🤚🏽",
+ "name": "raised back of hand: medium skin tone"
+ },
+ {
+ "no": 1368,
+ "code": "1F91A 1F3FE",
+ "char": "🤚🏾",
+ "name": "raised back of hand: medium-dark skin tone"
+ },
+ {
+ "no": 1369,
+ "code": "1F91A 1F3FF",
+ "char": "🤚🏿",
+ "name": "raised back of hand: dark skin tone"
+ },
+ {
+ "no": 1370,
+ "code": "1F44B",
+ "char": "👋",
+ "name": "waving hand"
+ },
+ {
+ "no": 1371,
+ "code": "1F44B 1F3FB",
+ "char": "👋🏻",
+ "name": "waving hand: light skin tone"
+ },
+ {
+ "no": 1372,
+ "code": "1F44B 1F3FC",
+ "char": "👋🏼",
+ "name": "waving hand: medium-light skin tone"
+ },
+ {
+ "no": 1373,
+ "code": "1F44B 1F3FD",
+ "char": "👋🏽",
+ "name": "waving hand: medium skin tone"
+ },
+ {
+ "no": 1374,
+ "code": "1F44B 1F3FE",
+ "char": "👋🏾",
+ "name": "waving hand: medium-dark skin tone"
+ },
+ {
+ "no": 1375,
+ "code": "1F44B 1F3FF",
+ "char": "👋🏿",
+ "name": "waving hand: dark skin tone"
+ },
+ {
+ "no": 1376,
+ "code": "1F91F",
+ "char": "🤟",
+ "name": "⊛ love-you gesture"
+ },
+ {
+ "no": 1377,
+ "code": "1F91F 1F3FB",
+ "char": "🤟🏻",
+ "name": "⊛ love-you gesture: light skin tone"
+ },
+ {
+ "no": 1378,
+ "code": "1F91F 1F3FC",
+ "char": "🤟🏼",
+ "name": "⊛ love-you gesture: medium-light skin tone"
+ },
+ {
+ "no": 1379,
+ "code": "1F91F 1F3FD",
+ "char": "🤟🏽",
+ "name": "⊛ love-you gesture: medium skin tone"
+ },
+ {
+ "no": 1380,
+ "code": "1F91F 1F3FE",
+ "char": "🤟🏾",
+ "name": "⊛ love-you gesture: medium-dark skin tone"
+ },
+ {
+ "no": 1381,
+ "code": "1F91F 1F3FF",
+ "char": "🤟🏿",
+ "name": "⊛ love-you gesture: dark skin tone"
+ },
+ {
+ "no": 1382,
+ "code": "270D",
+ "char": "✍",
+ "name": "writing hand"
+ },
+ {
+ "no": 1383,
+ "code": "270D 1F3FB",
+ "char": "✍🏻",
+ "name": "writing hand: light skin tone"
+ },
+ {
+ "no": 1384,
+ "code": "270D 1F3FC",
+ "char": "✍🏼",
+ "name": "writing hand: medium-light skin tone"
+ },
+ {
+ "no": 1385,
+ "code": "270D 1F3FD",
+ "char": "✍🏽",
+ "name": "writing hand: medium skin tone"
+ },
+ {
+ "no": 1386,
+ "code": "270D 1F3FE",
+ "char": "✍🏾",
+ "name": "writing hand: medium-dark skin tone"
+ },
+ {
+ "no": 1387,
+ "code": "270D 1F3FF",
+ "char": "✍🏿",
+ "name": "writing hand: dark skin tone"
+ },
+ {
+ "no": 1388,
+ "code": "1F44F",
+ "char": "👏",
+ "name": "clapping hands"
+ },
+ {
+ "no": 1389,
+ "code": "1F44F 1F3FB",
+ "char": "👏🏻",
+ "name": "clapping hands: light skin tone"
+ },
+ {
+ "no": 1390,
+ "code": "1F44F 1F3FC",
+ "char": "👏🏼",
+ "name": "clapping hands: medium-light skin tone"
+ },
+ {
+ "no": 1391,
+ "code": "1F44F 1F3FD",
+ "char": "👏🏽",
+ "name": "clapping hands: medium skin tone"
+ },
+ {
+ "no": 1392,
+ "code": "1F44F 1F3FE",
+ "char": "👏🏾",
+ "name": "clapping hands: medium-dark skin tone"
+ },
+ {
+ "no": 1393,
+ "code": "1F44F 1F3FF",
+ "char": "👏🏿",
+ "name": "clapping hands: dark skin tone"
+ },
+ {
+ "no": 1394,
+ "code": "1F450",
+ "char": "👐",
+ "name": "open hands"
+ },
+ {
+ "no": 1395,
+ "code": "1F450 1F3FB",
+ "char": "👐🏻",
+ "name": "open hands: light skin tone"
+ },
+ {
+ "no": 1396,
+ "code": "1F450 1F3FC",
+ "char": "👐🏼",
+ "name": "open hands: medium-light skin tone"
+ },
+ {
+ "no": 1397,
+ "code": "1F450 1F3FD",
+ "char": "👐🏽",
+ "name": "open hands: medium skin tone"
+ },
+ {
+ "no": 1398,
+ "code": "1F450 1F3FE",
+ "char": "👐🏾",
+ "name": "open hands: medium-dark skin tone"
+ },
+ {
+ "no": 1399,
+ "code": "1F450 1F3FF",
+ "char": "👐🏿",
+ "name": "open hands: dark skin tone"
+ },
+ {
+ "no": 1400,
+ "code": "1F64C",
+ "char": "🙌",
+ "name": "raising hands"
+ },
+ {
+ "no": 1401,
+ "code": "1F64C 1F3FB",
+ "char": "🙌🏻",
+ "name": "raising hands: light skin tone"
+ },
+ {
+ "no": 1402,
+ "code": "1F64C 1F3FC",
+ "char": "🙌🏼",
+ "name": "raising hands: medium-light skin tone"
+ },
+ {
+ "no": 1403,
+ "code": "1F64C 1F3FD",
+ "char": "🙌🏽",
+ "name": "raising hands: medium skin tone"
+ },
+ {
+ "no": 1404,
+ "code": "1F64C 1F3FE",
+ "char": "🙌🏾",
+ "name": "raising hands: medium-dark skin tone"
+ },
+ {
+ "no": 1405,
+ "code": "1F64C 1F3FF",
+ "char": "🙌🏿",
+ "name": "raising hands: dark skin tone"
+ },
+ {
+ "no": 1406,
+ "code": "1F932",
+ "char": "🤲",
+ "name": "⊛ palms up together"
+ },
+ {
+ "no": 1407,
+ "code": "1F932 1F3FB",
+ "char": "🤲🏻",
+ "name": "⊛ palms up together: light skin tone"
+ },
+ {
+ "no": 1408,
+ "code": "1F932 1F3FC",
+ "char": "🤲🏼",
+ "name": "⊛ palms up together: medium-light skin tone"
+ },
+ {
+ "no": 1409,
+ "code": "1F932 1F3FD",
+ "char": "🤲🏽",
+ "name": "⊛ palms up together: medium skin tone"
+ },
+ {
+ "no": 1410,
+ "code": "1F932 1F3FE",
+ "char": "🤲🏾",
+ "name": "⊛ palms up together: medium-dark skin tone"
+ },
+ {
+ "no": 1411,
+ "code": "1F932 1F3FF",
+ "char": "🤲🏿",
+ "name": "⊛ palms up together: dark skin tone"
+ },
+ {
+ "no": 1412,
+ "code": "1F64F",
+ "char": "🙏",
+ "name": "folded hands"
+ },
+ {
+ "no": 1413,
+ "code": "1F64F 1F3FB",
+ "char": "🙏🏻",
+ "name": "folded hands: light skin tone"
+ },
+ {
+ "no": 1414,
+ "code": "1F64F 1F3FC",
+ "char": "🙏🏼",
+ "name": "folded hands: medium-light skin tone"
+ },
+ {
+ "no": 1415,
+ "code": "1F64F 1F3FD",
+ "char": "🙏🏽",
+ "name": "folded hands: medium skin tone"
+ },
+ {
+ "no": 1416,
+ "code": "1F64F 1F3FE",
+ "char": "🙏🏾",
+ "name": "folded hands: medium-dark skin tone"
+ },
+ {
+ "no": 1417,
+ "code": "1F64F 1F3FF",
+ "char": "🙏🏿",
+ "name": "folded hands: dark skin tone"
+ },
+ {
+ "no": 1418,
+ "code": "1F91D",
+ "char": "🤝",
+ "name": "handshake"
+ },
+ {
+ "no": 1419,
+ "code": "1F485",
+ "char": "💅",
+ "name": "nail polish"
+ },
+ {
+ "no": 1420,
+ "code": "1F485 1F3FB",
+ "char": "💅🏻",
+ "name": "nail polish: light skin tone"
+ },
+ {
+ "no": 1421,
+ "code": "1F485 1F3FC",
+ "char": "💅🏼",
+ "name": "nail polish: medium-light skin tone"
+ },
+ {
+ "no": 1422,
+ "code": "1F485 1F3FD",
+ "char": "💅🏽",
+ "name": "nail polish: medium skin tone"
+ },
+ {
+ "no": 1423,
+ "code": "1F485 1F3FE",
+ "char": "💅🏾",
+ "name": "nail polish: medium-dark skin tone"
+ },
+ {
+ "no": 1424,
+ "code": "1F485 1F3FF",
+ "char": "💅🏿",
+ "name": "nail polish: dark skin tone"
+ },
+ {
+ "no": 1425,
+ "code": "1F442",
+ "char": "👂",
+ "name": "ear"
+ },
+ {
+ "no": 1426,
+ "code": "1F442 1F3FB",
+ "char": "👂🏻",
+ "name": "ear: light skin tone"
+ },
+ {
+ "no": 1427,
+ "code": "1F442 1F3FC",
+ "char": "👂🏼",
+ "name": "ear: medium-light skin tone"
+ },
+ {
+ "no": 1428,
+ "code": "1F442 1F3FD",
+ "char": "👂🏽",
+ "name": "ear: medium skin tone"
+ },
+ {
+ "no": 1429,
+ "code": "1F442 1F3FE",
+ "char": "👂🏾",
+ "name": "ear: medium-dark skin tone"
+ },
+ {
+ "no": 1430,
+ "code": "1F442 1F3FF",
+ "char": "👂🏿",
+ "name": "ear: dark skin tone"
+ },
+ {
+ "no": 1431,
+ "code": "1F443",
+ "char": "👃",
+ "name": "nose"
+ },
+ {
+ "no": 1432,
+ "code": "1F443 1F3FB",
+ "char": "👃🏻",
+ "name": "nose: light skin tone"
+ },
+ {
+ "no": 1433,
+ "code": "1F443 1F3FC",
+ "char": "👃🏼",
+ "name": "nose: medium-light skin tone"
+ },
+ {
+ "no": 1434,
+ "code": "1F443 1F3FD",
+ "char": "👃🏽",
+ "name": "nose: medium skin tone"
+ },
+ {
+ "no": 1435,
+ "code": "1F443 1F3FE",
+ "char": "👃🏾",
+ "name": "nose: medium-dark skin tone"
+ },
+ {
+ "no": 1436,
+ "code": "1F443 1F3FF",
+ "char": "👃🏿",
+ "name": "nose: dark skin tone"
+ },
+ {
+ "no": 1437,
+ "code": "1F463",
+ "char": "👣",
+ "name": "footprints"
+ },
+ {
+ "no": 1438,
+ "code": "1F440",
+ "char": "👀",
+ "name": "eyes"
+ },
+ {
+ "no": 1439,
+ "code": "1F441",
+ "char": "👁",
+ "name": "eye"
+ },
+ {
+ "no": 1440,
+ "code": "1F441 FE0F 200D 1F5E8 FE0F",
+ "char": "👁️‍🗨️",
+ "name": "eye in speech bubble"
+ },
+ {
+ "no": 1441,
+ "code": "1F9E0",
+ "char": "🧠",
+ "name": "⊛ brain"
+ },
+ {
+ "no": 1442,
+ "code": "1F445",
+ "char": "👅",
+ "name": "tongue"
+ },
+ {
+ "no": 1443,
+ "code": "1F444",
+ "char": "👄",
+ "name": "mouth"
+ },
+ {
+ "no": 1444,
+ "code": "1F48B",
+ "char": "💋",
+ "name": "kiss mark"
+ },
+ {
+ "no": 1445,
+ "code": "1F498",
+ "char": "💘",
+ "name": "heart with arrow"
+ },
+ {
+ "no": 1446,
+ "code": "2764",
+ "char": "❤",
+ "name": "red heart"
+ },
+ {
+ "no": 1447,
+ "code": "1F493",
+ "char": "💓",
+ "name": "beating heart"
+ },
+ {
+ "no": 1448,
+ "code": "1F494",
+ "char": "💔",
+ "name": "broken heart"
+ },
+ {
+ "no": 1449,
+ "code": "1F495",
+ "char": "💕",
+ "name": "two hearts"
+ },
+ {
+ "no": 1450,
+ "code": "1F496",
+ "char": "💖",
+ "name": "sparkling heart"
+ },
+ {
+ "no": 1451,
+ "code": "1F497",
+ "char": "💗",
+ "name": "growing heart"
+ },
+ {
+ "no": 1452,
+ "code": "1F499",
+ "char": "💙",
+ "name": "blue heart"
+ },
+ {
+ "no": 1453,
+ "code": "1F49A",
+ "char": "💚",
+ "name": "green heart"
+ },
+ {
+ "no": 1454,
+ "code": "1F49B",
+ "char": "💛",
+ "name": "yellow heart"
+ },
+ {
+ "no": 1455,
+ "code": "1F9E1",
+ "char": "🧡",
+ "name": "⊛ orange heart"
+ },
+ {
+ "no": 1456,
+ "code": "1F49C",
+ "char": "💜",
+ "name": "purple heart"
+ },
+ {
+ "no": 1457,
+ "code": "1F5A4",
+ "char": "🖤",
+ "name": "black heart"
+ },
+ {
+ "no": 1458,
+ "code": "1F49D",
+ "char": "💝",
+ "name": "heart with ribbon"
+ },
+ {
+ "no": 1459,
+ "code": "1F49E",
+ "char": "💞",
+ "name": "revolving hearts"
+ },
+ {
+ "no": 1460,
+ "code": "1F49F",
+ "char": "💟",
+ "name": "heart decoration"
+ },
+ {
+ "no": 1461,
+ "code": "2763",
+ "char": "❣",
+ "name": "heavy heart exclamation"
+ },
+ {
+ "no": 1462,
+ "code": "1F48C",
+ "char": "💌",
+ "name": "love letter"
+ },
+ {
+ "no": 1463,
+ "code": "1F4A4",
+ "char": "💤",
+ "name": "zzz"
+ },
+ {
+ "no": 1464,
+ "code": "1F4A2",
+ "char": "💢",
+ "name": "anger symbol"
+ },
+ {
+ "no": 1465,
+ "code": "1F4A3",
+ "char": "💣",
+ "name": "bomb"
+ },
+ {
+ "no": 1466,
+ "code": "1F4A5",
+ "char": "💥",
+ "name": "collision"
+ },
+ {
+ "no": 1467,
+ "code": "1F4A6",
+ "char": "💦",
+ "name": "sweat droplets"
+ },
+ {
+ "no": 1468,
+ "code": "1F4A8",
+ "char": "💨",
+ "name": "dashing away"
+ },
+ {
+ "no": 1469,
+ "code": "1F4AB",
+ "char": "💫",
+ "name": "dizzy"
+ },
+ {
+ "no": 1470,
+ "code": "1F4AC",
+ "char": "💬",
+ "name": "speech balloon"
+ },
+ {
+ "no": 1471,
+ "code": "1F5E8",
+ "char": "🗨",
+ "name": "left speech bubble"
+ },
+ {
+ "no": 1472,
+ "code": "1F5EF",
+ "char": "🗯",
+ "name": "right anger bubble"
+ },
+ {
+ "no": 1473,
+ "code": "1F4AD",
+ "char": "💭",
+ "name": "thought balloon"
+ },
+ {
+ "no": 1474,
+ "code": "1F573",
+ "char": "🕳",
+ "name": "hole"
+ },
+ {
+ "no": 1475,
+ "code": "1F453",
+ "char": "👓",
+ "name": "glasses"
+ },
+ {
+ "no": 1476,
+ "code": "1F576",
+ "char": "🕶",
+ "name": "sunglasses"
+ },
+ {
+ "no": 1477,
+ "code": "1F454",
+ "char": "👔",
+ "name": "necktie"
+ },
+ {
+ "no": 1478,
+ "code": "1F455",
+ "char": "👕",
+ "name": "t-shirt"
+ },
+ {
+ "no": 1479,
+ "code": "1F456",
+ "char": "👖",
+ "name": "jeans"
+ },
+ {
+ "no": 1480,
+ "code": "1F9E3",
+ "char": "🧣",
+ "name": "⊛ scarf"
+ },
+ {
+ "no": 1481,
+ "code": "1F9E4",
+ "char": "🧤",
+ "name": "⊛ gloves"
+ },
+ {
+ "no": 1482,
+ "code": "1F9E5",
+ "char": "🧥",
+ "name": "⊛ coat"
+ },
+ {
+ "no": 1483,
+ "code": "1F9E6",
+ "char": "🧦",
+ "name": "⊛ socks"
+ },
+ {
+ "no": 1484,
+ "code": "1F457",
+ "char": "👗",
+ "name": "dress"
+ },
+ {
+ "no": 1485,
+ "code": "1F458",
+ "char": "👘",
+ "name": "kimono"
+ },
+ {
+ "no": 1486,
+ "code": "1F459",
+ "char": "👙",
+ "name": "bikini"
+ },
+ {
+ "no": 1487,
+ "code": "1F45A",
+ "char": "👚",
+ "name": "woman’s clothes"
+ },
+ {
+ "no": 1488,
+ "code": "1F45B",
+ "char": "👛",
+ "name": "purse"
+ },
+ {
+ "no": 1489,
+ "code": "1F45C",
+ "char": "👜",
+ "name": "handbag"
+ },
+ {
+ "no": 1490,
+ "code": "1F45D",
+ "char": "👝",
+ "name": "clutch bag"
+ },
+ {
+ "no": 1491,
+ "code": "1F6CD",
+ "char": "🛍",
+ "name": "shopping bags"
+ },
+ {
+ "no": 1492,
+ "code": "1F392",
+ "char": "🎒",
+ "name": "school backpack"
+ },
+ {
+ "no": 1493,
+ "code": "1F45E",
+ "char": "👞",
+ "name": "man’s shoe"
+ },
+ {
+ "no": 1494,
+ "code": "1F45F",
+ "char": "👟",
+ "name": "running shoe"
+ },
+ {
+ "no": 1495,
+ "code": "1F460",
+ "char": "👠",
+ "name": "high-heeled shoe"
+ },
+ {
+ "no": 1496,
+ "code": "1F461",
+ "char": "👡",
+ "name": "woman’s sandal"
+ },
+ {
+ "no": 1497,
+ "code": "1F462",
+ "char": "👢",
+ "name": "woman’s boot"
+ },
+ {
+ "no": 1498,
+ "code": "1F451",
+ "char": "👑",
+ "name": "crown"
+ },
+ {
+ "no": 1499,
+ "code": "1F452",
+ "char": "👒",
+ "name": "woman’s hat"
+ },
+ {
+ "no": 1500,
+ "code": "1F3A9",
+ "char": "🎩",
+ "name": "top hat"
+ },
+ {
+ "no": 1501,
+ "code": "1F393",
+ "char": "🎓",
+ "name": "graduation cap"
+ },
+ {
+ "no": 1502,
+ "code": "1F9E2",
+ "char": "🧢",
+ "name": "⊛ billed cap"
+ },
+ {
+ "no": 1503,
+ "code": "26D1",
+ "char": "⛑",
+ "name": "rescue worker’s helmet"
+ },
+ {
+ "no": 1504,
+ "code": "1F4FF",
+ "char": "📿",
+ "name": "prayer beads"
+ },
+ {
+ "no": 1505,
+ "code": "1F484",
+ "char": "💄",
+ "name": "lipstick"
+ },
+ {
+ "no": 1506,
+ "code": "1F48D",
+ "char": "💍",
+ "name": "ring"
+ },
+ {
+ "no": 1507,
+ "code": "1F48E",
+ "char": "💎",
+ "name": "gem stone"
+ },
+ {
+ "no": 1508,
+ "code": "1F435",
+ "char": "🐵",
+ "name": "monkey face"
+ },
+ {
+ "no": 1509,
+ "code": "1F412",
+ "char": "🐒",
+ "name": "monkey"
+ },
+ {
+ "no": 1510,
+ "code": "1F98D",
+ "char": "🦍",
+ "name": "gorilla"
+ },
+ {
+ "no": 1511,
+ "code": "1F436",
+ "char": "🐶",
+ "name": "dog face"
+ },
+ {
+ "no": 1512,
+ "code": "1F415",
+ "char": "🐕",
+ "name": "dog"
+ },
+ {
+ "no": 1513,
+ "code": "1F429",
+ "char": "🐩",
+ "name": "poodle"
+ },
+ {
+ "no": 1514,
+ "code": "1F43A",
+ "char": "🐺",
+ "name": "wolf face"
+ },
+ {
+ "no": 1515,
+ "code": "1F98A",
+ "char": "🦊",
+ "name": "fox face"
+ },
+ {
+ "no": 1516,
+ "code": "1F431",
+ "char": "🐱",
+ "name": "cat face"
+ },
+ {
+ "no": 1517,
+ "code": "1F408",
+ "char": "🐈",
+ "name": "cat"
+ },
+ {
+ "no": 1518,
+ "code": "1F981",
+ "char": "🦁",
+ "name": "lion face"
+ },
+ {
+ "no": 1519,
+ "code": "1F42F",
+ "char": "🐯",
+ "name": "tiger face"
+ },
+ {
+ "no": 1520,
+ "code": "1F405",
+ "char": "🐅",
+ "name": "tiger"
+ },
+ {
+ "no": 1521,
+ "code": "1F406",
+ "char": "🐆",
+ "name": "leopard"
+ },
+ {
+ "no": 1522,
+ "code": "1F434",
+ "char": "🐴",
+ "name": "horse face"
+ },
+ {
+ "no": 1523,
+ "code": "1F40E",
+ "char": "🐎",
+ "name": "horse"
+ },
+ {
+ "no": 1524,
+ "code": "1F984",
+ "char": "🦄",
+ "name": "unicorn face"
+ },
+ {
+ "no": 1525,
+ "code": "1F993",
+ "char": "🦓",
+ "name": "⊛ zebra"
+ },
+ {
+ "no": 1526,
+ "code": "1F98C",
+ "char": "🦌",
+ "name": "deer"
+ },
+ {
+ "no": 1527,
+ "code": "1F42E",
+ "char": "🐮",
+ "name": "cow face"
+ },
+ {
+ "no": 1528,
+ "code": "1F402",
+ "char": "🐂",
+ "name": "ox"
+ },
+ {
+ "no": 1529,
+ "code": "1F403",
+ "char": "🐃",
+ "name": "water buffalo"
+ },
+ {
+ "no": 1530,
+ "code": "1F404",
+ "char": "🐄",
+ "name": "cow"
+ },
+ {
+ "no": 1531,
+ "code": "1F437",
+ "char": "🐷",
+ "name": "pig face"
+ },
+ {
+ "no": 1532,
+ "code": "1F416",
+ "char": "🐖",
+ "name": "pig"
+ },
+ {
+ "no": 1533,
+ "code": "1F417",
+ "char": "🐗",
+ "name": "boar"
+ },
+ {
+ "no": 1534,
+ "code": "1F43D",
+ "char": "🐽",
+ "name": "pig nose"
+ },
+ {
+ "no": 1535,
+ "code": "1F40F",
+ "char": "🐏",
+ "name": "ram"
+ },
+ {
+ "no": 1536,
+ "code": "1F411",
+ "char": "🐑",
+ "name": "ewe"
+ },
+ {
+ "no": 1537,
+ "code": "1F410",
+ "char": "🐐",
+ "name": "goat"
+ },
+ {
+ "no": 1538,
+ "code": "1F42A",
+ "char": "🐪",
+ "name": "camel"
+ },
+ {
+ "no": 1539,
+ "code": "1F42B",
+ "char": "🐫",
+ "name": "two-hump camel"
+ },
+ {
+ "no": 1540,
+ "code": "1F992",
+ "char": "🦒",
+ "name": "⊛ giraffe"
+ },
+ {
+ "no": 1541,
+ "code": "1F418",
+ "char": "🐘",
+ "name": "elephant"
+ },
+ {
+ "no": 1542,
+ "code": "1F98F",
+ "char": "🦏",
+ "name": "rhinoceros"
+ },
+ {
+ "no": 1543,
+ "code": "1F42D",
+ "char": "🐭",
+ "name": "mouse face"
+ },
+ {
+ "no": 1544,
+ "code": "1F401",
+ "char": "🐁",
+ "name": "mouse"
+ },
+ {
+ "no": 1545,
+ "code": "1F400",
+ "char": "🐀",
+ "name": "rat"
+ },
+ {
+ "no": 1546,
+ "code": "1F439",
+ "char": "🐹",
+ "name": "hamster face"
+ },
+ {
+ "no": 1547,
+ "code": "1F430",
+ "char": "🐰",
+ "name": "rabbit face"
+ },
+ {
+ "no": 1548,
+ "code": "1F407",
+ "char": "🐇",
+ "name": "rabbit"
+ },
+ {
+ "no": 1549,
+ "code": "1F43F",
+ "char": "🐿",
+ "name": "chipmunk"
+ },
+ {
+ "no": 1550,
+ "code": "1F994",
+ "char": "🦔",
+ "name": "⊛ hedgehog"
+ },
+ {
+ "no": 1551,
+ "code": "1F987",
+ "char": "🦇",
+ "name": "bat"
+ },
+ {
+ "no": 1552,
+ "code": "1F43B",
+ "char": "🐻",
+ "name": "bear face"
+ },
+ {
+ "no": 1553,
+ "code": "1F428",
+ "char": "🐨",
+ "name": "koala"
+ },
+ {
+ "no": 1554,
+ "code": "1F43C",
+ "char": "🐼",
+ "name": "panda face"
+ },
+ {
+ "no": 1555,
+ "code": "1F43E",
+ "char": "🐾",
+ "name": "paw prints"
+ },
+ {
+ "no": 1556,
+ "code": "1F983",
+ "char": "🦃",
+ "name": "turkey"
+ },
+ {
+ "no": 1557,
+ "code": "1F414",
+ "char": "🐔",
+ "name": "chicken"
+ },
+ {
+ "no": 1558,
+ "code": "1F413",
+ "char": "🐓",
+ "name": "rooster"
+ },
+ {
+ "no": 1559,
+ "code": "1F423",
+ "char": "🐣",
+ "name": "hatching chick"
+ },
+ {
+ "no": 1560,
+ "code": "1F424",
+ "char": "🐤",
+ "name": "baby chick"
+ },
+ {
+ "no": 1561,
+ "code": "1F425",
+ "char": "🐥",
+ "name": "front-facing baby chick"
+ },
+ {
+ "no": 1562,
+ "code": "1F426",
+ "char": "🐦",
+ "name": "bird"
+ },
+ {
+ "no": 1563,
+ "code": "1F427",
+ "char": "🐧",
+ "name": "penguin"
+ },
+ {
+ "no": 1564,
+ "code": "1F54A",
+ "char": "🕊",
+ "name": "dove"
+ },
+ {
+ "no": 1565,
+ "code": "1F985",
+ "char": "🦅",
+ "name": "eagle"
+ },
+ {
+ "no": 1566,
+ "code": "1F986",
+ "char": "🦆",
+ "name": "duck"
+ },
+ {
+ "no": 1567,
+ "code": "1F989",
+ "char": "🦉",
+ "name": "owl"
+ },
+ {
+ "no": 1568,
+ "code": "1F438",
+ "char": "🐸",
+ "name": "frog face"
+ },
+ {
+ "no": 1569,
+ "code": "1F40A",
+ "char": "🐊",
+ "name": "crocodile"
+ },
+ {
+ "no": 1570,
+ "code": "1F422",
+ "char": "🐢",
+ "name": "turtle"
+ },
+ {
+ "no": 1571,
+ "code": "1F98E",
+ "char": "🦎",
+ "name": "lizard"
+ },
+ {
+ "no": 1572,
+ "code": "1F40D",
+ "char": "🐍",
+ "name": "snake"
+ },
+ {
+ "no": 1573,
+ "code": "1F432",
+ "char": "🐲",
+ "name": "dragon face"
+ },
+ {
+ "no": 1574,
+ "code": "1F409",
+ "char": "🐉",
+ "name": "dragon"
+ },
+ {
+ "no": 1575,
+ "code": "1F995",
+ "char": "🦕",
+ "name": "⊛ sauropod"
+ },
+ {
+ "no": 1576,
+ "code": "1F996",
+ "char": "🦖",
+ "name": "⊛ T-Rex"
+ },
+ {
+ "no": 1577,
+ "code": "1F433",
+ "char": "🐳",
+ "name": "spouting whale"
+ },
+ {
+ "no": 1578,
+ "code": "1F40B",
+ "char": "🐋",
+ "name": "whale"
+ },
+ {
+ "no": 1579,
+ "code": "1F42C",
+ "char": "🐬",
+ "name": "dolphin"
+ },
+ {
+ "no": 1580,
+ "code": "1F41F",
+ "char": "🐟",
+ "name": "fish"
+ },
+ {
+ "no": 1581,
+ "code": "1F420",
+ "char": "🐠",
+ "name": "tropical fish"
+ },
+ {
+ "no": 1582,
+ "code": "1F421",
+ "char": "🐡",
+ "name": "blowfish"
+ },
+ {
+ "no": 1583,
+ "code": "1F988",
+ "char": "🦈",
+ "name": "shark"
+ },
+ {
+ "no": 1584,
+ "code": "1F419",
+ "char": "🐙",
+ "name": "octopus"
+ },
+ {
+ "no": 1585,
+ "code": "1F41A",
+ "char": "🐚",
+ "name": "spiral shell"
+ },
+ {
+ "no": 1586,
+ "code": "1F980",
+ "char": "🦀",
+ "name": "crab"
+ },
+ {
+ "no": 1587,
+ "code": "1F990",
+ "char": "🦐",
+ "name": "shrimp"
+ },
+ {
+ "no": 1588,
+ "code": "1F991",
+ "char": "🦑",
+ "name": "squid"
+ },
+ {
+ "no": 1589,
+ "code": "1F40C",
+ "char": "🐌",
+ "name": "snail"
+ },
+ {
+ "no": 1590,
+ "code": "1F98B",
+ "char": "🦋",
+ "name": "butterfly"
+ },
+ {
+ "no": 1591,
+ "code": "1F41B",
+ "char": "🐛",
+ "name": "bug"
+ },
+ {
+ "no": 1592,
+ "code": "1F41C",
+ "char": "🐜",
+ "name": "ant"
+ },
+ {
+ "no": 1593,
+ "code": "1F41D",
+ "char": "🐝",
+ "name": "honeybee"
+ },
+ {
+ "no": 1594,
+ "code": "1F41E",
+ "char": "🐞",
+ "name": "lady beetle"
+ },
+ {
+ "no": 1595,
+ "code": "1F997",
+ "char": "🦗",
+ "name": "⊛ cricket"
+ },
+ {
+ "no": 1596,
+ "code": "1F577",
+ "char": "🕷",
+ "name": "spider"
+ },
+ {
+ "no": 1597,
+ "code": "1F578",
+ "char": "🕸",
+ "name": "spider web"
+ },
+ {
+ "no": 1598,
+ "code": "1F982",
+ "char": "🦂",
+ "name": "scorpion"
+ },
+ {
+ "no": 1599,
+ "code": "1F490",
+ "char": "💐",
+ "name": "bouquet"
+ },
+ {
+ "no": 1600,
+ "code": "1F338",
+ "char": "🌸",
+ "name": "cherry blossom"
+ },
+ {
+ "no": 1601,
+ "code": "1F4AE",
+ "char": "💮",
+ "name": "white flower"
+ },
+ {
+ "no": 1602,
+ "code": "1F3F5",
+ "char": "🏵",
+ "name": "rosette"
+ },
+ {
+ "no": 1603,
+ "code": "1F339",
+ "char": "🌹",
+ "name": "rose"
+ },
+ {
+ "no": 1604,
+ "code": "1F940",
+ "char": "🥀",
+ "name": "wilted flower"
+ },
+ {
+ "no": 1605,
+ "code": "1F33A",
+ "char": "🌺",
+ "name": "hibiscus"
+ },
+ {
+ "no": 1606,
+ "code": "1F33B",
+ "char": "🌻",
+ "name": "sunflower"
+ },
+ {
+ "no": 1607,
+ "code": "1F33C",
+ "char": "🌼",
+ "name": "blossom"
+ },
+ {
+ "no": 1608,
+ "code": "1F337",
+ "char": "🌷",
+ "name": "tulip"
+ },
+ {
+ "no": 1609,
+ "code": "1F331",
+ "char": "🌱",
+ "name": "seedling"
+ },
+ {
+ "no": 1610,
+ "code": "1F332",
+ "char": "🌲",
+ "name": "evergreen tree"
+ },
+ {
+ "no": 1611,
+ "code": "1F333",
+ "char": "🌳",
+ "name": "deciduous tree"
+ },
+ {
+ "no": 1612,
+ "code": "1F334",
+ "char": "🌴",
+ "name": "palm tree"
+ },
+ {
+ "no": 1613,
+ "code": "1F335",
+ "char": "🌵",
+ "name": "cactus"
+ },
+ {
+ "no": 1614,
+ "code": "1F33E",
+ "char": "🌾",
+ "name": "sheaf of rice"
+ },
+ {
+ "no": 1615,
+ "code": "1F33F",
+ "char": "🌿",
+ "name": "herb"
+ },
+ {
+ "no": 1616,
+ "code": "2618",
+ "char": "☘",
+ "name": "shamrock"
+ },
+ {
+ "no": 1617,
+ "code": "1F340",
+ "char": "🍀",
+ "name": "four leaf clover"
+ },
+ {
+ "no": 1618,
+ "code": "1F341",
+ "char": "🍁",
+ "name": "maple leaf"
+ },
+ {
+ "no": 1619,
+ "code": "1F342",
+ "char": "🍂",
+ "name": "fallen leaf"
+ },
+ {
+ "no": 1620,
+ "code": "1F343",
+ "char": "🍃",
+ "name": "leaf fluttering in wind"
+ },
+ {
+ "no": 1621,
+ "code": "1F347",
+ "char": "🍇",
+ "name": "grapes"
+ },
+ {
+ "no": 1622,
+ "code": "1F348",
+ "char": "🍈",
+ "name": "melon"
+ },
+ {
+ "no": 1623,
+ "code": "1F349",
+ "char": "🍉",
+ "name": "watermelon"
+ },
+ {
+ "no": 1624,
+ "code": "1F34A",
+ "char": "🍊",
+ "name": "tangerine"
+ },
+ {
+ "no": 1625,
+ "code": "1F34B",
+ "char": "🍋",
+ "name": "lemon"
+ },
+ {
+ "no": 1626,
+ "code": "1F34C",
+ "char": "🍌",
+ "name": "banana"
+ },
+ {
+ "no": 1627,
+ "code": "1F34D",
+ "char": "🍍",
+ "name": "pineapple"
+ },
+ {
+ "no": 1628,
+ "code": "1F34E",
+ "char": "🍎",
+ "name": "red apple"
+ },
+ {
+ "no": 1629,
+ "code": "1F34F",
+ "char": "🍏",
+ "name": "green apple"
+ },
+ {
+ "no": 1630,
+ "code": "1F350",
+ "char": "🍐",
+ "name": "pear"
+ },
+ {
+ "no": 1631,
+ "code": "1F351",
+ "char": "🍑",
+ "name": "peach"
+ },
+ {
+ "no": 1632,
+ "code": "1F352",
+ "char": "🍒",
+ "name": "cherries"
+ },
+ {
+ "no": 1633,
+ "code": "1F353",
+ "char": "🍓",
+ "name": "strawberry"
+ },
+ {
+ "no": 1634,
+ "code": "1F95D",
+ "char": "🥝",
+ "name": "kiwi fruit"
+ },
+ {
+ "no": 1635,
+ "code": "1F345",
+ "char": "🍅",
+ "name": "tomato"
+ },
+ {
+ "no": 1636,
+ "code": "1F965",
+ "char": "🥥",
+ "name": "⊛ coconut"
+ },
+ {
+ "no": 1637,
+ "code": "1F951",
+ "char": "🥑",
+ "name": "avocado"
+ },
+ {
+ "no": 1638,
+ "code": "1F346",
+ "char": "🍆",
+ "name": "eggplant"
+ },
+ {
+ "no": 1639,
+ "code": "1F954",
+ "char": "🥔",
+ "name": "potato"
+ },
+ {
+ "no": 1640,
+ "code": "1F955",
+ "char": "🥕",
+ "name": "carrot"
+ },
+ {
+ "no": 1641,
+ "code": "1F33D",
+ "char": "🌽",
+ "name": "ear of corn"
+ },
+ {
+ "no": 1642,
+ "code": "1F336",
+ "char": "🌶",
+ "name": "hot pepper"
+ },
+ {
+ "no": 1643,
+ "code": "1F952",
+ "char": "🥒",
+ "name": "cucumber"
+ },
+ {
+ "no": 1644,
+ "code": "1F966",
+ "char": "🥦",
+ "name": "⊛ broccoli"
+ },
+ {
+ "no": 1645,
+ "code": "1F344",
+ "char": "🍄",
+ "name": "mushroom"
+ },
+ {
+ "no": 1646,
+ "code": "1F95C",
+ "char": "🥜",
+ "name": "peanuts"
+ },
+ {
+ "no": 1647,
+ "code": "1F330",
+ "char": "🌰",
+ "name": "chestnut"
+ },
+ {
+ "no": 1648,
+ "code": "1F35E",
+ "char": "🍞",
+ "name": "bread"
+ },
+ {
+ "no": 1649,
+ "code": "1F950",
+ "char": "🥐",
+ "name": "croissant"
+ },
+ {
+ "no": 1650,
+ "code": "1F956",
+ "char": "🥖",
+ "name": "baguette bread"
+ },
+ {
+ "no": 1651,
+ "code": "1F968",
+ "char": "🥨",
+ "name": "⊛ pretzel"
+ },
+ {
+ "no": 1652,
+ "code": "1F95E",
+ "char": "🥞",
+ "name": "pancakes"
+ },
+ {
+ "no": 1653,
+ "code": "1F9C0",
+ "char": "🧀",
+ "name": "cheese wedge"
+ },
+ {
+ "no": 1654,
+ "code": "1F356",
+ "char": "🍖",
+ "name": "meat on bone"
+ },
+ {
+ "no": 1655,
+ "code": "1F357",
+ "char": "🍗",
+ "name": "poultry leg"
+ },
+ {
+ "no": 1656,
+ "code": "1F969",
+ "char": "🥩",
+ "name": "⊛ cut of meat"
+ },
+ {
+ "no": 1657,
+ "code": "1F953",
+ "char": "🥓",
+ "name": "bacon"
+ },
+ {
+ "no": 1658,
+ "code": "1F354",
+ "char": "🍔",
+ "name": "hamburger"
+ },
+ {
+ "no": 1659,
+ "code": "1F35F",
+ "char": "🍟",
+ "name": "french fries"
+ },
+ {
+ "no": 1660,
+ "code": "1F355",
+ "char": "🍕",
+ "name": "pizza"
+ },
+ {
+ "no": 1661,
+ "code": "1F32D",
+ "char": "🌭",
+ "name": "hot dog"
+ },
+ {
+ "no": 1662,
+ "code": "1F96A",
+ "char": "🥪",
+ "name": "⊛ sandwich"
+ },
+ {
+ "no": 1663,
+ "code": "1F32E",
+ "char": "🌮",
+ "name": "taco"
+ },
+ {
+ "no": 1664,
+ "code": "1F32F",
+ "char": "🌯",
+ "name": "burrito"
+ },
+ {
+ "no": 1665,
+ "code": "1F959",
+ "char": "🥙",
+ "name": "stuffed flatbread"
+ },
+ {
+ "no": 1666,
+ "code": "1F95A",
+ "char": "🥚",
+ "name": "egg"
+ },
+ {
+ "no": 1667,
+ "code": "1F373",
+ "char": "🍳",
+ "name": "cooking"
+ },
+ {
+ "no": 1668,
+ "code": "1F958",
+ "char": "🥘",
+ "name": "shallow pan of food"
+ },
+ {
+ "no": 1669,
+ "code": "1F372",
+ "char": "🍲",
+ "name": "pot of food"
+ },
+ {
+ "no": 1670,
+ "code": "1F963",
+ "char": "🥣",
+ "name": "⊛ bowl with spoon"
+ },
+ {
+ "no": 1671,
+ "code": "1F957",
+ "char": "🥗",
+ "name": "green salad"
+ },
+ {
+ "no": 1672,
+ "code": "1F37F",
+ "char": "🍿",
+ "name": "popcorn"
+ },
+ {
+ "no": 1673,
+ "code": "1F96B",
+ "char": "🥫",
+ "name": "⊛ canned food"
+ },
+ {
+ "no": 1674,
+ "code": "1F371",
+ "char": "🍱",
+ "name": "bento box"
+ },
+ {
+ "no": 1675,
+ "code": "1F358",
+ "char": "🍘",
+ "name": "rice cracker"
+ },
+ {
+ "no": 1676,
+ "code": "1F359",
+ "char": "🍙",
+ "name": "rice ball"
+ },
+ {
+ "no": 1677,
+ "code": "1F35A",
+ "char": "🍚",
+ "name": "cooked rice"
+ },
+ {
+ "no": 1678,
+ "code": "1F35B",
+ "char": "🍛",
+ "name": "curry rice"
+ },
+ {
+ "no": 1679,
+ "code": "1F35C",
+ "char": "🍜",
+ "name": "steaming bowl"
+ },
+ {
+ "no": 1680,
+ "code": "1F35D",
+ "char": "🍝",
+ "name": "spaghetti"
+ },
+ {
+ "no": 1681,
+ "code": "1F360",
+ "char": "🍠",
+ "name": "roasted sweet potato"
+ },
+ {
+ "no": 1682,
+ "code": "1F362",
+ "char": "🍢",
+ "name": "oden"
+ },
+ {
+ "no": 1683,
+ "code": "1F363",
+ "char": "🍣",
+ "name": "sushi"
+ },
+ {
+ "no": 1684,
+ "code": "1F364",
+ "char": "🍤",
+ "name": "fried shrimp"
+ },
+ {
+ "no": 1685,
+ "code": "1F365",
+ "char": "🍥",
+ "name": "fish cake with swirl"
+ },
+ {
+ "no": 1686,
+ "code": "1F361",
+ "char": "🍡",
+ "name": "dango"
+ },
+ {
+ "no": 1687,
+ "code": "1F95F",
+ "char": "🥟",
+ "name": "⊛ dumpling"
+ },
+ {
+ "no": 1688,
+ "code": "1F960",
+ "char": "🥠",
+ "name": "⊛ fortune cookie"
+ },
+ {
+ "no": 1689,
+ "code": "1F961",
+ "char": "🥡",
+ "name": "⊛ takeout box"
+ },
+ {
+ "no": 1690,
+ "code": "1F366",
+ "char": "🍦",
+ "name": "soft ice cream"
+ },
+ {
+ "no": 1691,
+ "code": "1F367",
+ "char": "🍧",
+ "name": "shaved ice"
+ },
+ {
+ "no": 1692,
+ "code": "1F368",
+ "char": "🍨",
+ "name": "ice cream"
+ },
+ {
+ "no": 1693,
+ "code": "1F369",
+ "char": "🍩",
+ "name": "doughnut"
+ },
+ {
+ "no": 1694,
+ "code": "1F36A",
+ "char": "🍪",
+ "name": "cookie"
+ },
+ {
+ "no": 1695,
+ "code": "1F382",
+ "char": "🎂",
+ "name": "birthday cake"
+ },
+ {
+ "no": 1696,
+ "code": "1F370",
+ "char": "🍰",
+ "name": "shortcake"
+ },
+ {
+ "no": 1697,
+ "code": "1F967",
+ "char": "🥧",
+ "name": "⊛ pie"
+ },
+ {
+ "no": 1698,
+ "code": "1F36B",
+ "char": "🍫",
+ "name": "chocolate bar"
+ },
+ {
+ "no": 1699,
+ "code": "1F36C",
+ "char": "🍬",
+ "name": "candy"
+ },
+ {
+ "no": 1700,
+ "code": "1F36D",
+ "char": "🍭",
+ "name": "lollipop"
+ },
+ {
+ "no": 1701,
+ "code": "1F36E",
+ "char": "🍮",
+ "name": "custard"
+ },
+ {
+ "no": 1702,
+ "code": "1F36F",
+ "char": "🍯",
+ "name": "honey pot"
+ },
+ {
+ "no": 1703,
+ "code": "1F37C",
+ "char": "🍼",
+ "name": "baby bottle"
+ },
+ {
+ "no": 1704,
+ "code": "1F95B",
+ "char": "🥛",
+ "name": "glass of milk"
+ },
+ {
+ "no": 1705,
+ "code": "2615",
+ "char": "☕",
+ "name": "hot beverage"
+ },
+ {
+ "no": 1706,
+ "code": "1F375",
+ "char": "🍵",
+ "name": "teacup without handle"
+ },
+ {
+ "no": 1707,
+ "code": "1F376",
+ "char": "🍶",
+ "name": "sake"
+ },
+ {
+ "no": 1708,
+ "code": "1F37E",
+ "char": "🍾",
+ "name": "bottle with popping cork"
+ },
+ {
+ "no": 1709,
+ "code": "1F377",
+ "char": "🍷",
+ "name": "wine glass"
+ },
+ {
+ "no": 1710,
+ "code": "1F378",
+ "char": "🍸",
+ "name": "cocktail glass"
+ },
+ {
+ "no": 1711,
+ "code": "1F379",
+ "char": "🍹",
+ "name": "tropical drink"
+ },
+ {
+ "no": 1712,
+ "code": "1F37A",
+ "char": "🍺",
+ "name": "beer mug"
+ },
+ {
+ "no": 1713,
+ "code": "1F37B",
+ "char": "🍻",
+ "name": "clinking beer mugs"
+ },
+ {
+ "no": 1714,
+ "code": "1F942",
+ "char": "🥂",
+ "name": "clinking glasses"
+ },
+ {
+ "no": 1715,
+ "code": "1F943",
+ "char": "🥃",
+ "name": "tumbler glass"
+ },
+ {
+ "no": 1716,
+ "code": "1F964",
+ "char": "🥤",
+ "name": "⊛ cup with straw"
+ },
+ {
+ "no": 1717,
+ "code": "1F962",
+ "char": "🥢",
+ "name": "⊛ chopsticks"
+ },
+ {
+ "no": 1718,
+ "code": "1F37D",
+ "char": "🍽",
+ "name": "fork and knife with plate"
+ },
+ {
+ "no": 1719,
+ "code": "1F374",
+ "char": "🍴",
+ "name": "fork and knife"
+ },
+ {
+ "no": 1720,
+ "code": "1F944",
+ "char": "🥄",
+ "name": "spoon"
+ },
+ {
+ "no": 1721,
+ "code": "1F52A",
+ "char": "🔪",
+ "name": "kitchen knife"
+ },
+ {
+ "no": 1722,
+ "code": "1F3FA",
+ "char": "🏺",
+ "name": "amphora"
+ },
+ {
+ "no": 1723,
+ "code": "1F30D",
+ "char": "🌍",
+ "name": "globe showing Europe-Africa"
+ },
+ {
+ "no": 1724,
+ "code": "1F30E",
+ "char": "🌎",
+ "name": "globe showing Americas"
+ },
+ {
+ "no": 1725,
+ "code": "1F30F",
+ "char": "🌏",
+ "name": "globe showing Asia-Australia"
+ },
+ {
+ "no": 1726,
+ "code": "1F310",
+ "char": "🌐",
+ "name": "globe with meridians"
+ },
+ {
+ "no": 1727,
+ "code": "1F5FA",
+ "char": "🗺",
+ "name": "world map"
+ },
+ {
+ "no": 1728,
+ "code": "1F5FE",
+ "char": "🗾",
+ "name": "map of Japan"
+ },
+ {
+ "no": 1729,
+ "code": "1F3D4",
+ "char": "🏔",
+ "name": "snow-capped mountain"
+ },
+ {
+ "no": 1730,
+ "code": "26F0",
+ "char": "⛰",
+ "name": "mountain"
+ },
+ {
+ "no": 1731,
+ "code": "1F30B",
+ "char": "🌋",
+ "name": "volcano"
+ },
+ {
+ "no": 1732,
+ "code": "1F5FB",
+ "char": "🗻",
+ "name": "mount fuji"
+ },
+ {
+ "no": 1733,
+ "code": "1F3D5",
+ "char": "🏕",
+ "name": "camping"
+ },
+ {
+ "no": 1734,
+ "code": "1F3D6",
+ "char": "🏖",
+ "name": "beach with umbrella"
+ },
+ {
+ "no": 1735,
+ "code": "1F3DC",
+ "char": "🏜",
+ "name": "desert"
+ },
+ {
+ "no": 1736,
+ "code": "1F3DD",
+ "char": "🏝",
+ "name": "desert island"
+ },
+ {
+ "no": 1737,
+ "code": "1F3DE",
+ "char": "🏞",
+ "name": "national park"
+ },
+ {
+ "no": 1738,
+ "code": "1F3DF",
+ "char": "🏟",
+ "name": "stadium"
+ },
+ {
+ "no": 1739,
+ "code": "1F3DB",
+ "char": "🏛",
+ "name": "classical building"
+ },
+ {
+ "no": 1740,
+ "code": "1F3D7",
+ "char": "🏗",
+ "name": "building construction"
+ },
+ {
+ "no": 1741,
+ "code": "1F3D8",
+ "char": "🏘",
+ "name": "houses"
+ },
+ {
+ "no": 1742,
+ "code": "1F3D9",
+ "char": "🏙",
+ "name": "cityscape"
+ },
+ {
+ "no": 1743,
+ "code": "1F3DA",
+ "char": "🏚",
+ "name": "derelict house"
+ },
+ {
+ "no": 1744,
+ "code": "1F3E0",
+ "char": "🏠",
+ "name": "house"
+ },
+ {
+ "no": 1745,
+ "code": "1F3E1",
+ "char": "🏡",
+ "name": "house with garden"
+ },
+ {
+ "no": 1746,
+ "code": "1F3E2",
+ "char": "🏢",
+ "name": "office building"
+ },
+ {
+ "no": 1747,
+ "code": "1F3E3",
+ "char": "🏣",
+ "name": "Japanese post office"
+ },
+ {
+ "no": 1748,
+ "code": "1F3E4",
+ "char": "🏤",
+ "name": "post office"
+ },
+ {
+ "no": 1749,
+ "code": "1F3E5",
+ "char": "🏥",
+ "name": "hospital"
+ },
+ {
+ "no": 1750,
+ "code": "1F3E6",
+ "char": "🏦",
+ "name": "bank"
+ },
+ {
+ "no": 1751,
+ "code": "1F3E8",
+ "char": "🏨",
+ "name": "hotel"
+ },
+ {
+ "no": 1752,
+ "code": "1F3E9",
+ "char": "🏩",
+ "name": "love hotel"
+ },
+ {
+ "no": 1753,
+ "code": "1F3EA",
+ "char": "🏪",
+ "name": "convenience store"
+ },
+ {
+ "no": 1754,
+ "code": "1F3EB",
+ "char": "🏫",
+ "name": "school"
+ },
+ {
+ "no": 1755,
+ "code": "1F3EC",
+ "char": "🏬",
+ "name": "department store"
+ },
+ {
+ "no": 1756,
+ "code": "1F3ED",
+ "char": "🏭",
+ "name": "factory"
+ },
+ {
+ "no": 1757,
+ "code": "1F3EF",
+ "char": "🏯",
+ "name": "Japanese castle"
+ },
+ {
+ "no": 1758,
+ "code": "1F3F0",
+ "char": "🏰",
+ "name": "castle"
+ },
+ {
+ "no": 1759,
+ "code": "1F492",
+ "char": "💒",
+ "name": "wedding"
+ },
+ {
+ "no": 1760,
+ "code": "1F5FC",
+ "char": "🗼",
+ "name": "Tokyo tower"
+ },
+ {
+ "no": 1761,
+ "code": "1F5FD",
+ "char": "🗽",
+ "name": "Statue of Liberty"
+ },
+ {
+ "no": 1762,
+ "code": "26EA",
+ "char": "⛪",
+ "name": "church"
+ },
+ {
+ "no": 1763,
+ "code": "1F54C",
+ "char": "🕌",
+ "name": "mosque"
+ },
+ {
+ "no": 1764,
+ "code": "1F54D",
+ "char": "🕍",
+ "name": "synagogue"
+ },
+ {
+ "no": 1765,
+ "code": "26E9",
+ "char": "⛩",
+ "name": "shinto shrine"
+ },
+ {
+ "no": 1766,
+ "code": "1F54B",
+ "char": "🕋",
+ "name": "kaaba"
+ },
+ {
+ "no": 1767,
+ "code": "26F2",
+ "char": "⛲",
+ "name": "fountain"
+ },
+ {
+ "no": 1768,
+ "code": "26FA",
+ "char": "⛺",
+ "name": "tent"
+ },
+ {
+ "no": 1769,
+ "code": "1F301",
+ "char": "🌁",
+ "name": "foggy"
+ },
+ {
+ "no": 1770,
+ "code": "1F303",
+ "char": "🌃",
+ "name": "night with stars"
+ },
+ {
+ "no": 1771,
+ "code": "1F304",
+ "char": "🌄",
+ "name": "sunrise over mountains"
+ },
+ {
+ "no": 1772,
+ "code": "1F305",
+ "char": "🌅",
+ "name": "sunrise"
+ },
+ {
+ "no": 1773,
+ "code": "1F306",
+ "char": "🌆",
+ "name": "cityscape at dusk"
+ },
+ {
+ "no": 1774,
+ "code": "1F307",
+ "char": "🌇",
+ "name": "sunset"
+ },
+ {
+ "no": 1775,
+ "code": "1F309",
+ "char": "🌉",
+ "name": "bridge at night"
+ },
+ {
+ "no": 1776,
+ "code": "2668",
+ "char": "♨",
+ "name": "hot springs"
+ },
+ {
+ "no": 1777,
+ "code": "1F30C",
+ "char": "🌌",
+ "name": "milky way"
+ },
+ {
+ "no": 1778,
+ "code": "1F3A0",
+ "char": "🎠",
+ "name": "carousel horse"
+ },
+ {
+ "no": 1779,
+ "code": "1F3A1",
+ "char": "🎡",
+ "name": "ferris wheel"
+ },
+ {
+ "no": 1780,
+ "code": "1F3A2",
+ "char": "🎢",
+ "name": "roller coaster"
+ },
+ {
+ "no": 1781,
+ "code": "1F488",
+ "char": "💈",
+ "name": "barber pole"
+ },
+ {
+ "no": 1782,
+ "code": "1F3AA",
+ "char": "🎪",
+ "name": "circus tent"
+ },
+ {
+ "no": 1783,
+ "code": "1F3AD",
+ "char": "🎭",
+ "name": "performing arts"
+ },
+ {
+ "no": 1784,
+ "code": "1F5BC",
+ "char": "🖼",
+ "name": "framed picture"
+ },
+ {
+ "no": 1785,
+ "code": "1F3A8",
+ "char": "🎨",
+ "name": "artist palette"
+ },
+ {
+ "no": 1786,
+ "code": "1F3B0",
+ "char": "🎰",
+ "name": "slot machine"
+ },
+ {
+ "no": 1787,
+ "code": "1F682",
+ "char": "🚂",
+ "name": "locomotive"
+ },
+ {
+ "no": 1788,
+ "code": "1F683",
+ "char": "🚃",
+ "name": "railway car"
+ },
+ {
+ "no": 1789,
+ "code": "1F684",
+ "char": "🚄",
+ "name": "high-speed train"
+ },
+ {
+ "no": 1790,
+ "code": "1F685",
+ "char": "🚅",
+ "name": "bullet train"
+ },
+ {
+ "no": 1791,
+ "code": "1F686",
+ "char": "🚆",
+ "name": "train"
+ },
+ {
+ "no": 1792,
+ "code": "1F687",
+ "char": "🚇",
+ "name": "metro"
+ },
+ {
+ "no": 1793,
+ "code": "1F688",
+ "char": "🚈",
+ "name": "light rail"
+ },
+ {
+ "no": 1794,
+ "code": "1F689",
+ "char": "🚉",
+ "name": "station"
+ },
+ {
+ "no": 1795,
+ "code": "1F68A",
+ "char": "🚊",
+ "name": "tram"
+ },
+ {
+ "no": 1796,
+ "code": "1F69D",
+ "char": "🚝",
+ "name": "monorail"
+ },
+ {
+ "no": 1797,
+ "code": "1F69E",
+ "char": "🚞",
+ "name": "mountain railway"
+ },
+ {
+ "no": 1798,
+ "code": "1F68B",
+ "char": "🚋",
+ "name": "tram car"
+ },
+ {
+ "no": 1799,
+ "code": "1F68C",
+ "char": "🚌",
+ "name": "bus"
+ },
+ {
+ "no": 1800,
+ "code": "1F68D",
+ "char": "🚍",
+ "name": "oncoming bus"
+ },
+ {
+ "no": 1801,
+ "code": "1F68E",
+ "char": "🚎",
+ "name": "trolleybus"
+ },
+ {
+ "no": 1802,
+ "code": "1F690",
+ "char": "🚐",
+ "name": "minibus"
+ },
+ {
+ "no": 1803,
+ "code": "1F691",
+ "char": "🚑",
+ "name": "ambulance"
+ },
+ {
+ "no": 1804,
+ "code": "1F692",
+ "char": "🚒",
+ "name": "fire engine"
+ },
+ {
+ "no": 1805,
+ "code": "1F693",
+ "char": "🚓",
+ "name": "police car"
+ },
+ {
+ "no": 1806,
+ "code": "1F694",
+ "char": "🚔",
+ "name": "oncoming police car"
+ },
+ {
+ "no": 1807,
+ "code": "1F695",
+ "char": "🚕",
+ "name": "taxi"
+ },
+ {
+ "no": 1808,
+ "code": "1F696",
+ "char": "🚖",
+ "name": "oncoming taxi"
+ },
+ {
+ "no": 1809,
+ "code": "1F697",
+ "char": "🚗",
+ "name": "automobile"
+ },
+ {
+ "no": 1810,
+ "code": "1F698",
+ "char": "🚘",
+ "name": "oncoming automobile"
+ },
+ {
+ "no": 1811,
+ "code": "1F699",
+ "char": "🚙",
+ "name": "sport utility vehicle"
+ },
+ {
+ "no": 1812,
+ "code": "1F69A",
+ "char": "🚚",
+ "name": "delivery truck"
+ },
+ {
+ "no": 1813,
+ "code": "1F69B",
+ "char": "🚛",
+ "name": "articulated lorry"
+ },
+ {
+ "no": 1814,
+ "code": "1F69C",
+ "char": "🚜",
+ "name": "tractor"
+ },
+ {
+ "no": 1815,
+ "code": "1F6B2",
+ "char": "🚲",
+ "name": "bicycle"
+ },
+ {
+ "no": 1816,
+ "code": "1F6F4",
+ "char": "🛴",
+ "name": "kick scooter"
+ },
+ {
+ "no": 1817,
+ "code": "1F6F5",
+ "char": "🛵",
+ "name": "motor scooter"
+ },
+ {
+ "no": 1818,
+ "code": "1F68F",
+ "char": "🚏",
+ "name": "bus stop"
+ },
+ {
+ "no": 1819,
+ "code": "1F6E3",
+ "char": "🛣",
+ "name": "motorway"
+ },
+ {
+ "no": 1820,
+ "code": "1F6E4",
+ "char": "🛤",
+ "name": "railway track"
+ },
+ {
+ "no": 1821,
+ "code": "26FD",
+ "char": "⛽",
+ "name": "fuel pump"
+ },
+ {
+ "no": 1822,
+ "code": "1F6A8",
+ "char": "🚨",
+ "name": "police car light"
+ },
+ {
+ "no": 1823,
+ "code": "1F6A5",
+ "char": "🚥",
+ "name": "horizontal traffic light"
+ },
+ {
+ "no": 1824,
+ "code": "1F6A6",
+ "char": "🚦",
+ "name": "vertical traffic light"
+ },
+ {
+ "no": 1825,
+ "code": "1F6A7",
+ "char": "🚧",
+ "name": "construction"
+ },
+ {
+ "no": 1826,
+ "code": "1F6D1",
+ "char": "🛑",
+ "name": "stop sign"
+ },
+ {
+ "no": 1827,
+ "code": "2693",
+ "char": "⚓",
+ "name": "anchor"
+ },
+ {
+ "no": 1828,
+ "code": "26F5",
+ "char": "⛵",
+ "name": "sailboat"
+ },
+ {
+ "no": 1829,
+ "code": "1F6F6",
+ "char": "🛶",
+ "name": "canoe"
+ },
+ {
+ "no": 1830,
+ "code": "1F6A4",
+ "char": "🚤",
+ "name": "speedboat"
+ },
+ {
+ "no": 1831,
+ "code": "1F6F3",
+ "char": "🛳",
+ "name": "passenger ship"
+ },
+ {
+ "no": 1832,
+ "code": "26F4",
+ "char": "⛴",
+ "name": "ferry"
+ },
+ {
+ "no": 1833,
+ "code": "1F6E5",
+ "char": "🛥",
+ "name": "motor boat"
+ },
+ {
+ "no": 1834,
+ "code": "1F6A2",
+ "char": "🚢",
+ "name": "ship"
+ },
+ {
+ "no": 1835,
+ "code": "2708",
+ "char": "✈",
+ "name": "airplane"
+ },
+ {
+ "no": 1836,
+ "code": "1F6E9",
+ "char": "🛩",
+ "name": "small airplane"
+ },
+ {
+ "no": 1837,
+ "code": "1F6EB",
+ "char": "🛫",
+ "name": "airplane departure"
+ },
+ {
+ "no": 1838,
+ "code": "1F6EC",
+ "char": "🛬",
+ "name": "airplane arrival"
+ },
+ {
+ "no": 1839,
+ "code": "1F4BA",
+ "char": "💺",
+ "name": "seat"
+ },
+ {
+ "no": 1840,
+ "code": "1F681",
+ "char": "🚁",
+ "name": "helicopter"
+ },
+ {
+ "no": 1841,
+ "code": "1F69F",
+ "char": "🚟",
+ "name": "suspension railway"
+ },
+ {
+ "no": 1842,
+ "code": "1F6A0",
+ "char": "🚠",
+ "name": "mountain cableway"
+ },
+ {
+ "no": 1843,
+ "code": "1F6A1",
+ "char": "🚡",
+ "name": "aerial tramway"
+ },
+ {
+ "no": 1844,
+ "code": "1F6F0",
+ "char": "🛰",
+ "name": "satellite"
+ },
+ {
+ "no": 1845,
+ "code": "1F680",
+ "char": "🚀",
+ "name": "rocket"
+ },
+ {
+ "no": 1846,
+ "code": "1F6F8",
+ "char": "🛸",
+ "name": "⊛ flying saucer"
+ },
+ {
+ "no": 1847,
+ "code": "1F6CE",
+ "char": "🛎",
+ "name": "bellhop bell"
+ },
+ {
+ "no": 1848,
+ "code": "1F6AA",
+ "char": "🚪",
+ "name": "door"
+ },
+ {
+ "no": 1849,
+ "code": "1F6CF",
+ "char": "🛏",
+ "name": "bed"
+ },
+ {
+ "no": 1850,
+ "code": "1F6CB",
+ "char": "🛋",
+ "name": "couch and lamp"
+ },
+ {
+ "no": 1851,
+ "code": "1F6BD",
+ "char": "🚽",
+ "name": "toilet"
+ },
+ {
+ "no": 1852,
+ "code": "1F6BF",
+ "char": "🚿",
+ "name": "shower"
+ },
+ {
+ "no": 1853,
+ "code": "1F6C1",
+ "char": "🛁",
+ "name": "bathtub"
+ },
+ {
+ "no": 1854,
+ "code": "231B",
+ "char": "⌛",
+ "name": "hourglass done"
+ },
+ {
+ "no": 1855,
+ "code": "23F3",
+ "char": "⏳",
+ "name": "hourglass not done"
+ },
+ {
+ "no": 1856,
+ "code": "231A",
+ "char": "⌚",
+ "name": "watch"
+ },
+ {
+ "no": 1857,
+ "code": "23F0",
+ "char": "⏰",
+ "name": "alarm clock"
+ },
+ {
+ "no": 1858,
+ "code": "23F1",
+ "char": "⏱",
+ "name": "stopwatch"
+ },
+ {
+ "no": 1859,
+ "code": "23F2",
+ "char": "⏲",
+ "name": "timer clock"
+ },
+ {
+ "no": 1860,
+ "code": "1F570",
+ "char": "🕰",
+ "name": "mantelpiece clock"
+ },
+ {
+ "no": 1861,
+ "code": "1F55B",
+ "char": "🕛",
+ "name": "twelve o’clock"
+ },
+ {
+ "no": 1862,
+ "code": "1F567",
+ "char": "🕧",
+ "name": "twelve-thirty"
+ },
+ {
+ "no": 1863,
+ "code": "1F550",
+ "char": "🕐",
+ "name": "one o’clock"
+ },
+ {
+ "no": 1864,
+ "code": "1F55C",
+ "char": "🕜",
+ "name": "one-thirty"
+ },
+ {
+ "no": 1865,
+ "code": "1F551",
+ "char": "🕑",
+ "name": "two o’clock"
+ },
+ {
+ "no": 1866,
+ "code": "1F55D",
+ "char": "🕝",
+ "name": "two-thirty"
+ },
+ {
+ "no": 1867,
+ "code": "1F552",
+ "char": "🕒",
+ "name": "three o’clock"
+ },
+ {
+ "no": 1868,
+ "code": "1F55E",
+ "char": "🕞",
+ "name": "three-thirty"
+ },
+ {
+ "no": 1869,
+ "code": "1F553",
+ "char": "🕓",
+ "name": "four o’clock"
+ },
+ {
+ "no": 1870,
+ "code": "1F55F",
+ "char": "🕟",
+ "name": "four-thirty"
+ },
+ {
+ "no": 1871,
+ "code": "1F554",
+ "char": "🕔",
+ "name": "five o’clock"
+ },
+ {
+ "no": 1872,
+ "code": "1F560",
+ "char": "🕠",
+ "name": "five-thirty"
+ },
+ {
+ "no": 1873,
+ "code": "1F555",
+ "char": "🕕",
+ "name": "six o’clock"
+ },
+ {
+ "no": 1874,
+ "code": "1F561",
+ "char": "🕡",
+ "name": "six-thirty"
+ },
+ {
+ "no": 1875,
+ "code": "1F556",
+ "char": "🕖",
+ "name": "seven o’clock"
+ },
+ {
+ "no": 1876,
+ "code": "1F562",
+ "char": "🕢",
+ "name": "seven-thirty"
+ },
+ {
+ "no": 1877,
+ "code": "1F557",
+ "char": "🕗",
+ "name": "eight o’clock"
+ },
+ {
+ "no": 1878,
+ "code": "1F563",
+ "char": "🕣",
+ "name": "eight-thirty"
+ },
+ {
+ "no": 1879,
+ "code": "1F558",
+ "char": "🕘",
+ "name": "nine o’clock"
+ },
+ {
+ "no": 1880,
+ "code": "1F564",
+ "char": "🕤",
+ "name": "nine-thirty"
+ },
+ {
+ "no": 1881,
+ "code": "1F559",
+ "char": "🕙",
+ "name": "ten o’clock"
+ },
+ {
+ "no": 1882,
+ "code": "1F565",
+ "char": "🕥",
+ "name": "ten-thirty"
+ },
+ {
+ "no": 1883,
+ "code": "1F55A",
+ "char": "🕚",
+ "name": "eleven o’clock"
+ },
+ {
+ "no": 1884,
+ "code": "1F566",
+ "char": "🕦",
+ "name": "eleven-thirty"
+ },
+ {
+ "no": 1885,
+ "code": "1F311",
+ "char": "🌑",
+ "name": "new moon"
+ },
+ {
+ "no": 1886,
+ "code": "1F312",
+ "char": "🌒",
+ "name": "waxing crescent moon"
+ },
+ {
+ "no": 1887,
+ "code": "1F313",
+ "char": "🌓",
+ "name": "first quarter moon"
+ },
+ {
+ "no": 1888,
+ "code": "1F314",
+ "char": "🌔",
+ "name": "waxing gibbous moon"
+ },
+ {
+ "no": 1889,
+ "code": "1F315",
+ "char": "🌕",
+ "name": "full moon"
+ },
+ {
+ "no": 1890,
+ "code": "1F316",
+ "char": "🌖",
+ "name": "waning gibbous moon"
+ },
+ {
+ "no": 1891,
+ "code": "1F317",
+ "char": "🌗",
+ "name": "last quarter moon"
+ },
+ {
+ "no": 1892,
+ "code": "1F318",
+ "char": "🌘",
+ "name": "waning crescent moon"
+ },
+ {
+ "no": 1893,
+ "code": "1F319",
+ "char": "🌙",
+ "name": "crescent moon"
+ },
+ {
+ "no": 1894,
+ "code": "1F31A",
+ "char": "🌚",
+ "name": "new moon face"
+ },
+ {
+ "no": 1895,
+ "code": "1F31B",
+ "char": "🌛",
+ "name": "first quarter moon face"
+ },
+ {
+ "no": 1896,
+ "code": "1F31C",
+ "char": "🌜",
+ "name": "last quarter moon face"
+ },
+ {
+ "no": 1897,
+ "code": "1F321",
+ "char": "🌡",
+ "name": "thermometer"
+ },
+ {
+ "no": 1898,
+ "code": "2600",
+ "char": "☀",
+ "name": "sun"
+ },
+ {
+ "no": 1899,
+ "code": "1F31D",
+ "char": "🌝",
+ "name": "full moon face"
+ },
+ {
+ "no": 1900,
+ "code": "1F31E",
+ "char": "🌞",
+ "name": "sun with face"
+ },
+ {
+ "no": 1901,
+ "code": "2B50",
+ "char": "⭐",
+ "name": "white medium star"
+ },
+ {
+ "no": 1902,
+ "code": "1F31F",
+ "char": "🌟",
+ "name": "glowing star"
+ },
+ {
+ "no": 1903,
+ "code": "1F320",
+ "char": "🌠",
+ "name": "shooting star"
+ },
+ {
+ "no": 1904,
+ "code": "2601",
+ "char": "☁",
+ "name": "cloud"
+ },
+ {
+ "no": 1905,
+ "code": "26C5",
+ "char": "⛅",
+ "name": "sun behind cloud"
+ },
+ {
+ "no": 1906,
+ "code": "26C8",
+ "char": "⛈",
+ "name": "cloud with lightning and rain"
+ },
+ {
+ "no": 1907,
+ "code": "1F324",
+ "char": "🌤",
+ "name": "sun behind small cloud"
+ },
+ {
+ "no": 1908,
+ "code": "1F325",
+ "char": "🌥",
+ "name": "sun behind large cloud"
+ },
+ {
+ "no": 1909,
+ "code": "1F326",
+ "char": "🌦",
+ "name": "sun behind rain cloud"
+ },
+ {
+ "no": 1910,
+ "code": "1F327",
+ "char": "🌧",
+ "name": "cloud with rain"
+ },
+ {
+ "no": 1911,
+ "code": "1F328",
+ "char": "🌨",
+ "name": "cloud with snow"
+ },
+ {
+ "no": 1912,
+ "code": "1F329",
+ "char": "🌩",
+ "name": "cloud with lightning"
+ },
+ {
+ "no": 1913,
+ "code": "1F32A",
+ "char": "🌪",
+ "name": "tornado"
+ },
+ {
+ "no": 1914,
+ "code": "1F32B",
+ "char": "🌫",
+ "name": "fog"
+ },
+ {
+ "no": 1915,
+ "code": "1F32C",
+ "char": "🌬",
+ "name": "wind face"
+ },
+ {
+ "no": 1916,
+ "code": "1F300",
+ "char": "🌀",
+ "name": "cyclone"
+ },
+ {
+ "no": 1917,
+ "code": "1F308",
+ "char": "🌈",
+ "name": "rainbow"
+ },
+ {
+ "no": 1918,
+ "code": "1F302",
+ "char": "🌂",
+ "name": "closed umbrella"
+ },
+ {
+ "no": 1919,
+ "code": "2602",
+ "char": "☂",
+ "name": "umbrella"
+ },
+ {
+ "no": 1920,
+ "code": "2614",
+ "char": "☔",
+ "name": "umbrella with rain drops"
+ },
+ {
+ "no": 1921,
+ "code": "26F1",
+ "char": "⛱",
+ "name": "umbrella on ground"
+ },
+ {
+ "no": 1922,
+ "code": "26A1",
+ "char": "⚡",
+ "name": "high voltage"
+ },
+ {
+ "no": 1923,
+ "code": "2744",
+ "char": "❄",
+ "name": "snowflake"
+ },
+ {
+ "no": 1924,
+ "code": "2603",
+ "char": "☃",
+ "name": "snowman"
+ },
+ {
+ "no": 1925,
+ "code": "26C4",
+ "char": "⛄",
+ "name": "snowman without snow"
+ },
+ {
+ "no": 1926,
+ "code": "2604",
+ "char": "☄",
+ "name": "comet"
+ },
+ {
+ "no": 1927,
+ "code": "1F525",
+ "char": "🔥",
+ "name": "fire"
+ },
+ {
+ "no": 1928,
+ "code": "1F4A7",
+ "char": "💧",
+ "name": "droplet"
+ },
+ {
+ "no": 1929,
+ "code": "1F30A",
+ "char": "🌊",
+ "name": "water wave"
+ },
+ {
+ "no": 1930,
+ "code": "1F383",
+ "char": "🎃",
+ "name": "jack-o-lantern"
+ },
+ {
+ "no": 1931,
+ "code": "1F384",
+ "char": "🎄",
+ "name": "Christmas tree"
+ },
+ {
+ "no": 1932,
+ "code": "1F386",
+ "char": "🎆",
+ "name": "fireworks"
+ },
+ {
+ "no": 1933,
+ "code": "1F387",
+ "char": "🎇",
+ "name": "sparkler"
+ },
+ {
+ "no": 1934,
+ "code": "2728",
+ "char": "✨",
+ "name": "sparkles"
+ },
+ {
+ "no": 1935,
+ "code": "1F388",
+ "char": "🎈",
+ "name": "balloon"
+ },
+ {
+ "no": 1936,
+ "code": "1F389",
+ "char": "🎉",
+ "name": "party popper"
+ },
+ {
+ "no": 1937,
+ "code": "1F38A",
+ "char": "🎊",
+ "name": "confetti ball"
+ },
+ {
+ "no": 1938,
+ "code": "1F38B",
+ "char": "🎋",
+ "name": "tanabata tree"
+ },
+ {
+ "no": 1939,
+ "code": "1F38D",
+ "char": "🎍",
+ "name": "pine decoration"
+ },
+ {
+ "no": 1940,
+ "code": "1F38E",
+ "char": "🎎",
+ "name": "Japanese dolls"
+ },
+ {
+ "no": 1941,
+ "code": "1F38F",
+ "char": "🎏",
+ "name": "carp streamer"
+ },
+ {
+ "no": 1942,
+ "code": "1F390",
+ "char": "🎐",
+ "name": "wind chime"
+ },
+ {
+ "no": 1943,
+ "code": "1F391",
+ "char": "🎑",
+ "name": "moon viewing ceremony"
+ },
+ {
+ "no": 1944,
+ "code": "1F380",
+ "char": "🎀",
+ "name": "ribbon"
+ },
+ {
+ "no": 1945,
+ "code": "1F381",
+ "char": "🎁",
+ "name": "wrapped gift"
+ },
+ {
+ "no": 1946,
+ "code": "1F397",
+ "char": "🎗",
+ "name": "reminder ribbon"
+ },
+ {
+ "no": 1947,
+ "code": "1F39F",
+ "char": "🎟",
+ "name": "admission tickets"
+ },
+ {
+ "no": 1948,
+ "code": "1F3AB",
+ "char": "🎫",
+ "name": "ticket"
+ },
+ {
+ "no": 1949,
+ "code": "1F396",
+ "char": "🎖",
+ "name": "military medal"
+ },
+ {
+ "no": 1950,
+ "code": "1F3C6",
+ "char": "🏆",
+ "name": "trophy"
+ },
+ {
+ "no": 1951,
+ "code": "1F3C5",
+ "char": "🏅",
+ "name": "sports medal"
+ },
+ {
+ "no": 1952,
+ "code": "1F947",
+ "char": "🥇",
+ "name": "1st place medal"
+ },
+ {
+ "no": 1953,
+ "code": "1F948",
+ "char": "🥈",
+ "name": "2nd place medal"
+ },
+ {
+ "no": 1954,
+ "code": "1F949",
+ "char": "🥉",
+ "name": "3rd place medal"
+ },
+ {
+ "no": 1955,
+ "code": "26BD",
+ "char": "⚽",
+ "name": "soccer ball"
+ },
+ {
+ "no": 1956,
+ "code": "26BE",
+ "char": "⚾",
+ "name": "baseball"
+ },
+ {
+ "no": 1957,
+ "code": "1F3C0",
+ "char": "🏀",
+ "name": "basketball"
+ },
+ {
+ "no": 1958,
+ "code": "1F3D0",
+ "char": "🏐",
+ "name": "volleyball"
+ },
+ {
+ "no": 1959,
+ "code": "1F3C8",
+ "char": "🏈",
+ "name": "american football"
+ },
+ {
+ "no": 1960,
+ "code": "1F3C9",
+ "char": "🏉",
+ "name": "rugby football"
+ },
+ {
+ "no": 1961,
+ "code": "1F3BE",
+ "char": "🎾",
+ "name": "tennis"
+ },
+ {
+ "no": 1962,
+ "code": "1F3B1",
+ "char": "🎱",
+ "name": "pool 8 ball"
+ },
+ {
+ "no": 1963,
+ "code": "1F3B3",
+ "char": "🎳",
+ "name": "bowling"
+ },
+ {
+ "no": 1964,
+ "code": "1F3CF",
+ "char": "🏏",
+ "name": "cricket game"
+ },
+ {
+ "no": 1965,
+ "code": "1F3D1",
+ "char": "🏑",
+ "name": "field hockey"
+ },
+ {
+ "no": 1966,
+ "code": "1F3D2",
+ "char": "🏒",
+ "name": "ice hockey"
+ },
+ {
+ "no": 1967,
+ "code": "1F3D3",
+ "char": "🏓",
+ "name": "ping pong"
+ },
+ {
+ "no": 1968,
+ "code": "1F3F8",
+ "char": "🏸",
+ "name": "badminton"
+ },
+ {
+ "no": 1969,
+ "code": "1F94A",
+ "char": "🥊",
+ "name": "boxing glove"
+ },
+ {
+ "no": 1970,
+ "code": "1F94B",
+ "char": "🥋",
+ "name": "martial arts uniform"
+ },
+ {
+ "no": 1971,
+ "code": "1F945",
+ "char": "🥅",
+ "name": "goal net"
+ },
+ {
+ "no": 1972,
+ "code": "1F3AF",
+ "char": "🎯",
+ "name": "direct hit"
+ },
+ {
+ "no": 1973,
+ "code": "26F3",
+ "char": "⛳",
+ "name": "flag in hole"
+ },
+ {
+ "no": 1974,
+ "code": "26F8",
+ "char": "⛸",
+ "name": "ice skate"
+ },
+ {
+ "no": 1975,
+ "code": "1F3A3",
+ "char": "🎣",
+ "name": "fishing pole"
+ },
+ {
+ "no": 1976,
+ "code": "1F3BD",
+ "char": "🎽",
+ "name": "running shirt"
+ },
+ {
+ "no": 1977,
+ "code": "1F3BF",
+ "char": "🎿",
+ "name": "skis"
+ },
+ {
+ "no": 1978,
+ "code": "1F6F7",
+ "char": "🛷",
+ "name": "⊛ sled"
+ },
+ {
+ "no": 1979,
+ "code": "1F94C",
+ "char": "🥌",
+ "name": "⊛ curling stone"
+ },
+ {
+ "no": 1980,
+ "code": "1F3AE",
+ "char": "🎮",
+ "name": "video game"
+ },
+ {
+ "no": 1981,
+ "code": "1F579",
+ "char": "🕹",
+ "name": "joystick"
+ },
+ {
+ "no": 1982,
+ "code": "1F3B2",
+ "char": "🎲",
+ "name": "game die"
+ },
+ {
+ "no": 1983,
+ "code": "2660",
+ "char": "♠",
+ "name": "spade suit"
+ },
+ {
+ "no": 1984,
+ "code": "2665",
+ "char": "♥",
+ "name": "heart suit"
+ },
+ {
+ "no": 1985,
+ "code": "2666",
+ "char": "♦",
+ "name": "diamond suit"
+ },
+ {
+ "no": 1986,
+ "code": "2663",
+ "char": "♣",
+ "name": "club suit"
+ },
+ {
+ "no": 1987,
+ "code": "1F0CF",
+ "char": "🃏",
+ "name": "joker"
+ },
+ {
+ "no": 1988,
+ "code": "1F004",
+ "char": "🀄",
+ "name": "mahjong red dragon"
+ },
+ {
+ "no": 1989,
+ "code": "1F3B4",
+ "char": "🎴",
+ "name": "flower playing cards"
+ },
+ {
+ "no": 1990,
+ "code": "1F507",
+ "char": "🔇",
+ "name": "muted speaker"
+ },
+ {
+ "no": 1991,
+ "code": "1F508",
+ "char": "🔈",
+ "name": "speaker low volume"
+ },
+ {
+ "no": 1992,
+ "code": "1F509",
+ "char": "🔉",
+ "name": "speaker medium volume"
+ },
+ {
+ "no": 1993,
+ "code": "1F50A",
+ "char": "🔊",
+ "name": "speaker high volume"
+ },
+ {
+ "no": 1994,
+ "code": "1F4E2",
+ "char": "📢",
+ "name": "loudspeaker"
+ },
+ {
+ "no": 1995,
+ "code": "1F4E3",
+ "char": "📣",
+ "name": "megaphone"
+ },
+ {
+ "no": 1996,
+ "code": "1F4EF",
+ "char": "📯",
+ "name": "postal horn"
+ },
+ {
+ "no": 1997,
+ "code": "1F514",
+ "char": "🔔",
+ "name": "bell"
+ },
+ {
+ "no": 1998,
+ "code": "1F515",
+ "char": "🔕",
+ "name": "bell with slash"
+ },
+ {
+ "no": 1999,
+ "code": "1F3BC",
+ "char": "🎼",
+ "name": "musical score"
+ },
+ {
+ "no": 2000,
+ "code": "1F3B5",
+ "char": "🎵",
+ "name": "musical note"
+ },
+ {
+ "no": 2001,
+ "code": "1F3B6",
+ "char": "🎶",
+ "name": "musical notes"
+ },
+ {
+ "no": 2002,
+ "code": "1F399",
+ "char": "🎙",
+ "name": "studio microphone"
+ },
+ {
+ "no": 2003,
+ "code": "1F39A",
+ "char": "🎚",
+ "name": "level slider"
+ },
+ {
+ "no": 2004,
+ "code": "1F39B",
+ "char": "🎛",
+ "name": "control knobs"
+ },
+ {
+ "no": 2005,
+ "code": "1F3A4",
+ "char": "🎤",
+ "name": "microphone"
+ },
+ {
+ "no": 2006,
+ "code": "1F3A7",
+ "char": "🎧",
+ "name": "headphone"
+ },
+ {
+ "no": 2007,
+ "code": "1F4FB",
+ "char": "📻",
+ "name": "radio"
+ },
+ {
+ "no": 2008,
+ "code": "1F3B7",
+ "char": "🎷",
+ "name": "saxophone"
+ },
+ {
+ "no": 2009,
+ "code": "1F3B8",
+ "char": "🎸",
+ "name": "guitar"
+ },
+ {
+ "no": 2010,
+ "code": "1F3B9",
+ "char": "🎹",
+ "name": "musical keyboard"
+ },
+ {
+ "no": 2011,
+ "code": "1F3BA",
+ "char": "🎺",
+ "name": "trumpet"
+ },
+ {
+ "no": 2012,
+ "code": "1F3BB",
+ "char": "🎻",
+ "name": "violin"
+ },
+ {
+ "no": 2013,
+ "code": "1F941",
+ "char": "🥁",
+ "name": "drum"
+ },
+ {
+ "no": 2014,
+ "code": "1F4F1",
+ "char": "📱",
+ "name": "mobile phone"
+ },
+ {
+ "no": 2015,
+ "code": "1F4F2",
+ "char": "📲",
+ "name": "mobile phone with arrow"
+ },
+ {
+ "no": 2016,
+ "code": "260E",
+ "char": "☎",
+ "name": "telephone"
+ },
+ {
+ "no": 2017,
+ "code": "1F4DE",
+ "char": "📞",
+ "name": "telephone receiver"
+ },
+ {
+ "no": 2018,
+ "code": "1F4DF",
+ "char": "📟",
+ "name": "pager"
+ },
+ {
+ "no": 2019,
+ "code": "1F4E0",
+ "char": "📠",
+ "name": "fax machine"
+ },
+ {
+ "no": 2020,
+ "code": "1F50B",
+ "char": "🔋",
+ "name": "battery"
+ },
+ {
+ "no": 2021,
+ "code": "1F50C",
+ "char": "🔌",
+ "name": "electric plug"
+ },
+ {
+ "no": 2022,
+ "code": "1F4BB",
+ "char": "💻",
+ "name": "laptop computer"
+ },
+ {
+ "no": 2023,
+ "code": "1F5A5",
+ "char": "🖥",
+ "name": "desktop computer"
+ },
+ {
+ "no": 2024,
+ "code": "1F5A8",
+ "char": "🖨",
+ "name": "printer"
+ },
+ {
+ "no": 2025,
+ "code": "2328",
+ "char": "⌨",
+ "name": "keyboard"
+ },
+ {
+ "no": 2026,
+ "code": "1F5B1",
+ "char": "🖱",
+ "name": "computer mouse"
+ },
+ {
+ "no": 2027,
+ "code": "1F5B2",
+ "char": "🖲",
+ "name": "trackball"
+ },
+ {
+ "no": 2028,
+ "code": "1F4BD",
+ "char": "💽",
+ "name": "computer disk"
+ },
+ {
+ "no": 2029,
+ "code": "1F4BE",
+ "char": "💾",
+ "name": "floppy disk"
+ },
+ {
+ "no": 2030,
+ "code": "1F4BF",
+ "char": "💿",
+ "name": "optical disk"
+ },
+ {
+ "no": 2031,
+ "code": "1F4C0",
+ "char": "📀",
+ "name": "dvd"
+ },
+ {
+ "no": 2032,
+ "code": "1F3A5",
+ "char": "🎥",
+ "name": "movie camera"
+ },
+ {
+ "no": 2033,
+ "code": "1F39E",
+ "char": "🎞",
+ "name": "film frames"
+ },
+ {
+ "no": 2034,
+ "code": "1F4FD",
+ "char": "📽",
+ "name": "film projector"
+ },
+ {
+ "no": 2035,
+ "code": "1F3AC",
+ "char": "🎬",
+ "name": "clapper board"
+ },
+ {
+ "no": 2036,
+ "code": "1F4FA",
+ "char": "📺",
+ "name": "television"
+ },
+ {
+ "no": 2037,
+ "code": "1F4F7",
+ "char": "📷",
+ "name": "camera"
+ },
+ {
+ "no": 2038,
+ "code": "1F4F8",
+ "char": "📸",
+ "name": "camera with flash"
+ },
+ {
+ "no": 2039,
+ "code": "1F4F9",
+ "char": "📹",
+ "name": "video camera"
+ },
+ {
+ "no": 2040,
+ "code": "1F4FC",
+ "char": "📼",
+ "name": "videocassette"
+ },
+ {
+ "no": 2041,
+ "code": "1F50D",
+ "char": "🔍",
+ "name": "magnifying glass tilted left"
+ },
+ {
+ "no": 2042,
+ "code": "1F50E",
+ "char": "🔎",
+ "name": "magnifying glass tilted right"
+ },
+ {
+ "no": 2043,
+ "code": "1F52C",
+ "char": "🔬",
+ "name": "microscope"
+ },
+ {
+ "no": 2044,
+ "code": "1F52D",
+ "char": "🔭",
+ "name": "telescope"
+ },
+ {
+ "no": 2045,
+ "code": "1F4E1",
+ "char": "📡",
+ "name": "satellite antenna"
+ },
+ {
+ "no": 2046,
+ "code": "1F56F",
+ "char": "🕯",
+ "name": "candle"
+ },
+ {
+ "no": 2047,
+ "code": "1F4A1",
+ "char": "💡",
+ "name": "light bulb"
+ },
+ {
+ "no": 2048,
+ "code": "1F526",
+ "char": "🔦",
+ "name": "flashlight"
+ },
+ {
+ "no": 2049,
+ "code": "1F3EE",
+ "char": "🏮",
+ "name": "red paper lantern"
+ },
+ {
+ "no": 2050,
+ "code": "1F4D4",
+ "char": "📔",
+ "name": "notebook with decorative cover"
+ },
+ {
+ "no": 2051,
+ "code": "1F4D5",
+ "char": "📕",
+ "name": "closed book"
+ },
+ {
+ "no": 2052,
+ "code": "1F4D6",
+ "char": "📖",
+ "name": "open book"
+ },
+ {
+ "no": 2053,
+ "code": "1F4D7",
+ "char": "📗",
+ "name": "green book"
+ },
+ {
+ "no": 2054,
+ "code": "1F4D8",
+ "char": "📘",
+ "name": "blue book"
+ },
+ {
+ "no": 2055,
+ "code": "1F4D9",
+ "char": "📙",
+ "name": "orange book"
+ },
+ {
+ "no": 2056,
+ "code": "1F4DA",
+ "char": "📚",
+ "name": "books"
+ },
+ {
+ "no": 2057,
+ "code": "1F4D3",
+ "char": "📓",
+ "name": "notebook"
+ },
+ {
+ "no": 2058,
+ "code": "1F4D2",
+ "char": "📒",
+ "name": "ledger"
+ },
+ {
+ "no": 2059,
+ "code": "1F4C3",
+ "char": "📃",
+ "name": "page with curl"
+ },
+ {
+ "no": 2060,
+ "code": "1F4DC",
+ "char": "📜",
+ "name": "scroll"
+ },
+ {
+ "no": 2061,
+ "code": "1F4C4",
+ "char": "📄",
+ "name": "page facing up"
+ },
+ {
+ "no": 2062,
+ "code": "1F4F0",
+ "char": "📰",
+ "name": "newspaper"
+ },
+ {
+ "no": 2063,
+ "code": "1F5DE",
+ "char": "🗞",
+ "name": "rolled-up newspaper"
+ },
+ {
+ "no": 2064,
+ "code": "1F4D1",
+ "char": "📑",
+ "name": "bookmark tabs"
+ },
+ {
+ "no": 2065,
+ "code": "1F516",
+ "char": "🔖",
+ "name": "bookmark"
+ },
+ {
+ "no": 2066,
+ "code": "1F3F7",
+ "char": "🏷",
+ "name": "label"
+ },
+ {
+ "no": 2067,
+ "code": "1F4B0",
+ "char": "💰",
+ "name": "money bag"
+ },
+ {
+ "no": 2068,
+ "code": "1F4B4",
+ "char": "💴",
+ "name": "yen banknote"
+ },
+ {
+ "no": 2069,
+ "code": "1F4B5",
+ "char": "💵",
+ "name": "dollar banknote"
+ },
+ {
+ "no": 2070,
+ "code": "1F4B6",
+ "char": "💶",
+ "name": "euro banknote"
+ },
+ {
+ "no": 2071,
+ "code": "1F4B7",
+ "char": "💷",
+ "name": "pound banknote"
+ },
+ {
+ "no": 2072,
+ "code": "1F4B8",
+ "char": "💸",
+ "name": "money with wings"
+ },
+ {
+ "no": 2073,
+ "code": "1F4B3",
+ "char": "💳",
+ "name": "credit card"
+ },
+ {
+ "no": 2074,
+ "code": "1F4B9",
+ "char": "💹",
+ "name": "chart increasing with yen"
+ },
+ {
+ "no": 2075,
+ "code": "1F4B1",
+ "char": "💱",
+ "name": "currency exchange"
+ },
+ {
+ "no": 2076,
+ "code": "1F4B2",
+ "char": "💲",
+ "name": "heavy dollar sign"
+ },
+ {
+ "no": 2077,
+ "code": "2709",
+ "char": "✉",
+ "name": "envelope"
+ },
+ {
+ "no": 2078,
+ "code": "1F4E7",
+ "char": "📧",
+ "name": "e-mail"
+ },
+ {
+ "no": 2079,
+ "code": "1F4E8",
+ "char": "📨",
+ "name": "incoming envelope"
+ },
+ {
+ "no": 2080,
+ "code": "1F4E9",
+ "char": "📩",
+ "name": "envelope with arrow"
+ },
+ {
+ "no": 2081,
+ "code": "1F4E4",
+ "char": "📤",
+ "name": "outbox tray"
+ },
+ {
+ "no": 2082,
+ "code": "1F4E5",
+ "char": "📥",
+ "name": "inbox tray"
+ },
+ {
+ "no": 2083,
+ "code": "1F4E6",
+ "char": "📦",
+ "name": "package"
+ },
+ {
+ "no": 2084,
+ "code": "1F4EB",
+ "char": "📫",
+ "name": "closed mailbox with raised flag"
+ },
+ {
+ "no": 2085,
+ "code": "1F4EA",
+ "char": "📪",
+ "name": "closed mailbox with lowered flag"
+ },
+ {
+ "no": 2086,
+ "code": "1F4EC",
+ "char": "📬",
+ "name": "open mailbox with raised flag"
+ },
+ {
+ "no": 2087,
+ "code": "1F4ED",
+ "char": "📭",
+ "name": "open mailbox with lowered flag"
+ },
+ {
+ "no": 2088,
+ "code": "1F4EE",
+ "char": "📮",
+ "name": "postbox"
+ },
+ {
+ "no": 2089,
+ "code": "1F5F3",
+ "char": "🗳",
+ "name": "ballot box with ballot"
+ },
+ {
+ "no": 2090,
+ "code": "270F",
+ "char": "✏",
+ "name": "pencil"
+ },
+ {
+ "no": 2091,
+ "code": "2712",
+ "char": "✒",
+ "name": "black nib"
+ },
+ {
+ "no": 2092,
+ "code": "1F58B",
+ "char": "🖋",
+ "name": "fountain pen"
+ },
+ {
+ "no": 2093,
+ "code": "1F58A",
+ "char": "🖊",
+ "name": "pen"
+ },
+ {
+ "no": 2094,
+ "code": "1F58C",
+ "char": "🖌",
+ "name": "paintbrush"
+ },
+ {
+ "no": 2095,
+ "code": "1F58D",
+ "char": "🖍",
+ "name": "crayon"
+ },
+ {
+ "no": 2096,
+ "code": "1F4DD",
+ "char": "📝",
+ "name": "memo"
+ },
+ {
+ "no": 2097,
+ "code": "1F4BC",
+ "char": "💼",
+ "name": "briefcase"
+ },
+ {
+ "no": 2098,
+ "code": "1F4C1",
+ "char": "📁",
+ "name": "file folder"
+ },
+ {
+ "no": 2099,
+ "code": "1F4C2",
+ "char": "📂",
+ "name": "open file folder"
+ },
+ {
+ "no": 2100,
+ "code": "1F5C2",
+ "char": "🗂",
+ "name": "card index dividers"
+ },
+ {
+ "no": 2101,
+ "code": "1F4C5",
+ "char": "📅",
+ "name": "calendar"
+ },
+ {
+ "no": 2102,
+ "code": "1F4C6",
+ "char": "📆",
+ "name": "tear-off calendar"
+ },
+ {
+ "no": 2103,
+ "code": "1F5D2",
+ "char": "🗒",
+ "name": "spiral notepad"
+ },
+ {
+ "no": 2104,
+ "code": "1F5D3",
+ "char": "🗓",
+ "name": "spiral calendar"
+ },
+ {
+ "no": 2105,
+ "code": "1F4C7",
+ "char": "📇",
+ "name": "card index"
+ },
+ {
+ "no": 2106,
+ "code": "1F4C8",
+ "char": "📈",
+ "name": "chart increasing"
+ },
+ {
+ "no": 2107,
+ "code": "1F4C9",
+ "char": "📉",
+ "name": "chart decreasing"
+ },
+ {
+ "no": 2108,
+ "code": "1F4CA",
+ "char": "📊",
+ "name": "bar chart"
+ },
+ {
+ "no": 2109,
+ "code": "1F4CB",
+ "char": "📋",
+ "name": "clipboard"
+ },
+ {
+ "no": 2110,
+ "code": "1F4CC",
+ "char": "📌",
+ "name": "pushpin"
+ },
+ {
+ "no": 2111,
+ "code": "1F4CD",
+ "char": "📍",
+ "name": "round pushpin"
+ },
+ {
+ "no": 2112,
+ "code": "1F4CE",
+ "char": "📎",
+ "name": "paperclip"
+ },
+ {
+ "no": 2113,
+ "code": "1F587",
+ "char": "🖇",
+ "name": "linked paperclips"
+ },
+ {
+ "no": 2114,
+ "code": "1F4CF",
+ "char": "📏",
+ "name": "straight ruler"
+ },
+ {
+ "no": 2115,
+ "code": "1F4D0",
+ "char": "📐",
+ "name": "triangular ruler"
+ },
+ {
+ "no": 2116,
+ "code": "2702",
+ "char": "✂",
+ "name": "scissors"
+ },
+ {
+ "no": 2117,
+ "code": "1F5C3",
+ "char": "🗃",
+ "name": "card file box"
+ },
+ {
+ "no": 2118,
+ "code": "1F5C4",
+ "char": "🗄",
+ "name": "file cabinet"
+ },
+ {
+ "no": 2119,
+ "code": "1F5D1",
+ "char": "🗑",
+ "name": "wastebasket"
+ },
+ {
+ "no": 2120,
+ "code": "1F512",
+ "char": "🔒",
+ "name": "locked"
+ },
+ {
+ "no": 2121,
+ "code": "1F513",
+ "char": "🔓",
+ "name": "unlocked"
+ },
+ {
+ "no": 2122,
+ "code": "1F50F",
+ "char": "🔏",
+ "name": "locked with pen"
+ },
+ {
+ "no": 2123,
+ "code": "1F510",
+ "char": "🔐",
+ "name": "locked with key"
+ },
+ {
+ "no": 2124,
+ "code": "1F511",
+ "char": "🔑",
+ "name": "key"
+ },
+ {
+ "no": 2125,
+ "code": "1F5DD",
+ "char": "🗝",
+ "name": "old key"
+ },
+ {
+ "no": 2126,
+ "code": "1F528",
+ "char": "🔨",
+ "name": "hammer"
+ },
+ {
+ "no": 2127,
+ "code": "26CF",
+ "char": "⛏",
+ "name": "pick"
+ },
+ {
+ "no": 2128,
+ "code": "2692",
+ "char": "⚒",
+ "name": "hammer and pick"
+ },
+ {
+ "no": 2129,
+ "code": "1F6E0",
+ "char": "🛠",
+ "name": "hammer and wrench"
+ },
+ {
+ "no": 2130,
+ "code": "1F5E1",
+ "char": "🗡",
+ "name": "dagger"
+ },
+ {
+ "no": 2131,
+ "code": "2694",
+ "char": "⚔",
+ "name": "crossed swords"
+ },
+ {
+ "no": 2132,
+ "code": "1F52B",
+ "char": "🔫",
+ "name": "pistol"
+ },
+ {
+ "no": 2133,
+ "code": "1F3F9",
+ "char": "🏹",
+ "name": "bow and arrow"
+ },
+ {
+ "no": 2134,
+ "code": "1F6E1",
+ "char": "🛡",
+ "name": "shield"
+ },
+ {
+ "no": 2135,
+ "code": "1F527",
+ "char": "🔧",
+ "name": "wrench"
+ },
+ {
+ "no": 2136,
+ "code": "1F529",
+ "char": "🔩",
+ "name": "nut and bolt"
+ },
+ {
+ "no": 2137,
+ "code": "2699",
+ "char": "⚙",
+ "name": "gear"
+ },
+ {
+ "no": 2138,
+ "code": "1F5DC",
+ "char": "🗜",
+ "name": "clamp"
+ },
+ {
+ "no": 2139,
+ "code": "2697",
+ "char": "⚗",
+ "name": "alembic"
+ },
+ {
+ "no": 2140,
+ "code": "2696",
+ "char": "⚖",
+ "name": "balance scale"
+ },
+ {
+ "no": 2141,
+ "code": "1F517",
+ "char": "🔗",
+ "name": "link"
+ },
+ {
+ "no": 2142,
+ "code": "26D3",
+ "char": "⛓",
+ "name": "chains"
+ },
+ {
+ "no": 2143,
+ "code": "1F489",
+ "char": "💉",
+ "name": "syringe"
+ },
+ {
+ "no": 2144,
+ "code": "1F48A",
+ "char": "💊",
+ "name": "pill"
+ },
+ {
+ "no": 2145,
+ "code": "1F6AC",
+ "char": "🚬",
+ "name": "cigarette"
+ },
+ {
+ "no": 2146,
+ "code": "26B0",
+ "char": "⚰",
+ "name": "coffin"
+ },
+ {
+ "no": 2147,
+ "code": "26B1",
+ "char": "⚱",
+ "name": "funeral urn"
+ },
+ {
+ "no": 2148,
+ "code": "1F5FF",
+ "char": "🗿",
+ "name": "moai"
+ },
+ {
+ "no": 2149,
+ "code": "1F6E2",
+ "char": "🛢",
+ "name": "oil drum"
+ },
+ {
+ "no": 2150,
+ "code": "1F52E",
+ "char": "🔮",
+ "name": "crystal ball"
+ },
+ {
+ "no": 2151,
+ "code": "1F6D2",
+ "char": "🛒",
+ "name": "shopping cart"
+ },
+ {
+ "no": 2152,
+ "code": "1F3E7",
+ "char": "🏧",
+ "name": "ATM sign"
+ },
+ {
+ "no": 2153,
+ "code": "1F6AE",
+ "char": "🚮",
+ "name": "litter in bin sign"
+ },
+ {
+ "no": 2154,
+ "code": "1F6B0",
+ "char": "🚰",
+ "name": "potable water"
+ },
+ {
+ "no": 2155,
+ "code": "267F",
+ "char": "♿",
+ "name": "wheelchair symbol"
+ },
+ {
+ "no": 2156,
+ "code": "1F6B9",
+ "char": "🚹",
+ "name": "men’s room"
+ },
+ {
+ "no": 2157,
+ "code": "1F6BA",
+ "char": "🚺",
+ "name": "women’s room"
+ },
+ {
+ "no": 2158,
+ "code": "1F6BB",
+ "char": "🚻",
+ "name": "restroom"
+ },
+ {
+ "no": 2159,
+ "code": "1F6BC",
+ "char": "🚼",
+ "name": "baby symbol"
+ },
+ {
+ "no": 2160,
+ "code": "1F6BE",
+ "char": "🚾",
+ "name": "water closet"
+ },
+ {
+ "no": 2161,
+ "code": "1F6C2",
+ "char": "🛂",
+ "name": "passport control"
+ },
+ {
+ "no": 2162,
+ "code": "1F6C3",
+ "char": "🛃",
+ "name": "customs"
+ },
+ {
+ "no": 2163,
+ "code": "1F6C4",
+ "char": "🛄",
+ "name": "baggage claim"
+ },
+ {
+ "no": 2164,
+ "code": "1F6C5",
+ "char": "🛅",
+ "name": "left luggage"
+ },
+ {
+ "no": 2165,
+ "code": "26A0",
+ "char": "⚠",
+ "name": "warning"
+ },
+ {
+ "no": 2166,
+ "code": "1F6B8",
+ "char": "🚸",
+ "name": "children crossing"
+ },
+ {
+ "no": 2167,
+ "code": "26D4",
+ "char": "⛔",
+ "name": "no entry"
+ },
+ {
+ "no": 2168,
+ "code": "1F6AB",
+ "char": "🚫",
+ "name": "prohibited"
+ },
+ {
+ "no": 2169,
+ "code": "1F6B3",
+ "char": "🚳",
+ "name": "no bicycles"
+ },
+ {
+ "no": 2170,
+ "code": "1F6AD",
+ "char": "🚭",
+ "name": "no smoking"
+ },
+ {
+ "no": 2171,
+ "code": "1F6AF",
+ "char": "🚯",
+ "name": "no littering"
+ },
+ {
+ "no": 2172,
+ "code": "1F6B1",
+ "char": "🚱",
+ "name": "non-potable water"
+ },
+ {
+ "no": 2173,
+ "code": "1F6B7",
+ "char": "🚷",
+ "name": "no pedestrians"
+ },
+ {
+ "no": 2174,
+ "code": "1F4F5",
+ "char": "📵",
+ "name": "no mobile phones"
+ },
+ {
+ "no": 2175,
+ "code": "1F51E",
+ "char": "🔞",
+ "name": "no one under eighteen"
+ },
+ {
+ "no": 2176,
+ "code": "2622",
+ "char": "☢",
+ "name": "radioactive"
+ },
+ {
+ "no": 2177,
+ "code": "2623",
+ "char": "☣",
+ "name": "biohazard"
+ },
+ {
+ "no": 2178,
+ "code": "2B06",
+ "char": "⬆",
+ "name": "up arrow"
+ },
+ {
+ "no": 2179,
+ "code": "2197",
+ "char": "↗",
+ "name": "up-right arrow"
+ },
+ {
+ "no": 2180,
+ "code": "27A1",
+ "char": "➡",
+ "name": "right arrow"
+ },
+ {
+ "no": 2181,
+ "code": "2198",
+ "char": "↘",
+ "name": "down-right arrow"
+ },
+ {
+ "no": 2182,
+ "code": "2B07",
+ "char": "⬇",
+ "name": "down arrow"
+ },
+ {
+ "no": 2183,
+ "code": "2199",
+ "char": "↙",
+ "name": "down-left arrow"
+ },
+ {
+ "no": 2184,
+ "code": "2B05",
+ "char": "⬅",
+ "name": "left arrow"
+ },
+ {
+ "no": 2185,
+ "code": "2196",
+ "char": "↖",
+ "name": "up-left arrow"
+ },
+ {
+ "no": 2186,
+ "code": "2195",
+ "char": "↕",
+ "name": "up-down arrow"
+ },
+ {
+ "no": 2187,
+ "code": "2194",
+ "char": "↔",
+ "name": "left-right arrow"
+ },
+ {
+ "no": 2188,
+ "code": "21A9",
+ "char": "↩",
+ "name": "right arrow curving left"
+ },
+ {
+ "no": 2189,
+ "code": "21AA",
+ "char": "↪",
+ "name": "left arrow curving right"
+ },
+ {
+ "no": 2190,
+ "code": "2934",
+ "char": "⤴",
+ "name": "right arrow curving up"
+ },
+ {
+ "no": 2191,
+ "code": "2935",
+ "char": "⤵",
+ "name": "right arrow curving down"
+ },
+ {
+ "no": 2192,
+ "code": "1F503",
+ "char": "🔃",
+ "name": "clockwise vertical arrows"
+ },
+ {
+ "no": 2193,
+ "code": "1F504",
+ "char": "🔄",
+ "name": "counterclockwise arrows button"
+ },
+ {
+ "no": 2194,
+ "code": "1F519",
+ "char": "🔙",
+ "name": "BACK arrow"
+ },
+ {
+ "no": 2195,
+ "code": "1F51A",
+ "char": "🔚",
+ "name": "END arrow"
+ },
+ {
+ "no": 2196,
+ "code": "1F51B",
+ "char": "🔛",
+ "name": "ON! arrow"
+ },
+ {
+ "no": 2197,
+ "code": "1F51C",
+ "char": "🔜",
+ "name": "SOON arrow"
+ },
+ {
+ "no": 2198,
+ "code": "1F51D",
+ "char": "🔝",
+ "name": "TOP arrow"
+ },
+ {
+ "no": 2199,
+ "code": "1F6D0",
+ "char": "🛐",
+ "name": "place of worship"
+ },
+ {
+ "no": 2200,
+ "code": "269B",
+ "char": "⚛",
+ "name": "atom symbol"
+ },
+ {
+ "no": 2201,
+ "code": "1F549",
+ "char": "🕉",
+ "name": "om"
+ },
+ {
+ "no": 2202,
+ "code": "2721",
+ "char": "✡",
+ "name": "star of David"
+ },
+ {
+ "no": 2203,
+ "code": "2638",
+ "char": "☸",
+ "name": "wheel of dharma"
+ },
+ {
+ "no": 2204,
+ "code": "262F",
+ "char": "☯",
+ "name": "yin yang"
+ },
+ {
+ "no": 2205,
+ "code": "271D",
+ "char": "✝",
+ "name": "latin cross"
+ },
+ {
+ "no": 2206,
+ "code": "2626",
+ "char": "☦",
+ "name": "orthodox cross"
+ },
+ {
+ "no": 2207,
+ "code": "262A",
+ "char": "☪",
+ "name": "star and crescent"
+ },
+ {
+ "no": 2208,
+ "code": "262E",
+ "char": "☮",
+ "name": "peace symbol"
+ },
+ {
+ "no": 2209,
+ "code": "1F54E",
+ "char": "🕎",
+ "name": "menorah"
+ },
+ {
+ "no": 2210,
+ "code": "1F52F",
+ "char": "🔯",
+ "name": "dotted six-pointed star"
+ },
+ {
+ "no": 2211,
+ "code": "2648",
+ "char": "♈",
+ "name": "Aries"
+ },
+ {
+ "no": 2212,
+ "code": "2649",
+ "char": "♉",
+ "name": "Taurus"
+ },
+ {
+ "no": 2213,
+ "code": "264A",
+ "char": "♊",
+ "name": "Gemini"
+ },
+ {
+ "no": 2214,
+ "code": "264B",
+ "char": "♋",
+ "name": "Cancer"
+ },
+ {
+ "no": 2215,
+ "code": "264C",
+ "char": "♌",
+ "name": "Leo"
+ },
+ {
+ "no": 2216,
+ "code": "264D",
+ "char": "♍",
+ "name": "Virgo"
+ },
+ {
+ "no": 2217,
+ "code": "264E",
+ "char": "♎",
+ "name": "Libra"
+ },
+ {
+ "no": 2218,
+ "code": "264F",
+ "char": "♏",
+ "name": "Scorpius"
+ },
+ {
+ "no": 2219,
+ "code": "2650",
+ "char": "♐",
+ "name": "Sagittarius"
+ },
+ {
+ "no": 2220,
+ "code": "2651",
+ "char": "♑",
+ "name": "Capricorn"
+ },
+ {
+ "no": 2221,
+ "code": "2652",
+ "char": "♒",
+ "name": "Aquarius"
+ },
+ {
+ "no": 2222,
+ "code": "2653",
+ "char": "♓",
+ "name": "Pisces"
+ },
+ {
+ "no": 2223,
+ "code": "26CE",
+ "char": "⛎",
+ "name": "Ophiuchus"
+ },
+ {
+ "no": 2224,
+ "code": "1F500",
+ "char": "🔀",
+ "name": "shuffle tracks button"
+ },
+ {
+ "no": 2225,
+ "code": "1F501",
+ "char": "🔁",
+ "name": "repeat button"
+ },
+ {
+ "no": 2226,
+ "code": "1F502",
+ "char": "🔂",
+ "name": "repeat single button"
+ },
+ {
+ "no": 2227,
+ "code": "25B6",
+ "char": "▶",
+ "name": "play button"
+ },
+ {
+ "no": 2228,
+ "code": "23E9",
+ "char": "⏩",
+ "name": "fast-forward button"
+ },
+ {
+ "no": 2229,
+ "code": "23ED",
+ "char": "⏭",
+ "name": "next track button"
+ },
+ {
+ "no": 2230,
+ "code": "23EF",
+ "char": "⏯",
+ "name": "play or pause button"
+ },
+ {
+ "no": 2231,
+ "code": "25C0",
+ "char": "◀",
+ "name": "reverse button"
+ },
+ {
+ "no": 2232,
+ "code": "23EA",
+ "char": "⏪",
+ "name": "fast reverse button"
+ },
+ {
+ "no": 2233,
+ "code": "23EE",
+ "char": "⏮",
+ "name": "last track button"
+ },
+ {
+ "no": 2234,
+ "code": "1F53C",
+ "char": "🔼",
+ "name": "up button"
+ },
+ {
+ "no": 2235,
+ "code": "23EB",
+ "char": "⏫",
+ "name": "fast up button"
+ },
+ {
+ "no": 2236,
+ "code": "1F53D",
+ "char": "🔽",
+ "name": "down button"
+ },
+ {
+ "no": 2237,
+ "code": "23EC",
+ "char": "⏬",
+ "name": "fast down button"
+ },
+ {
+ "no": 2238,
+ "code": "23F8",
+ "char": "⏸",
+ "name": "pause button"
+ },
+ {
+ "no": 2239,
+ "code": "23F9",
+ "char": "⏹",
+ "name": "stop button"
+ },
+ {
+ "no": 2240,
+ "code": "23FA",
+ "char": "⏺",
+ "name": "record button"
+ },
+ {
+ "no": 2241,
+ "code": "23CF",
+ "char": "⏏",
+ "name": "eject button"
+ },
+ {
+ "no": 2242,
+ "code": "1F3A6",
+ "char": "🎦",
+ "name": "cinema"
+ },
+ {
+ "no": 2243,
+ "code": "1F505",
+ "char": "🔅",
+ "name": "dim button"
+ },
+ {
+ "no": 2244,
+ "code": "1F506",
+ "char": "🔆",
+ "name": "bright button"
+ },
+ {
+ "no": 2245,
+ "code": "1F4F6",
+ "char": "📶",
+ "name": "antenna bars"
+ },
+ {
+ "no": 2246,
+ "code": "1F4F3",
+ "char": "📳",
+ "name": "vibration mode"
+ },
+ {
+ "no": 2247,
+ "code": "1F4F4",
+ "char": "📴",
+ "name": "mobile phone off"
+ },
+ {
+ "no": 2248,
+ "code": "2640",
+ "char": "♀",
+ "name": "female sign"
+ },
+ {
+ "no": 2249,
+ "code": "2642",
+ "char": "♂",
+ "name": "male sign"
+ },
+ {
+ "no": 2250,
+ "code": "2695",
+ "char": "⚕",
+ "name": "medical symbol"
+ },
+ {
+ "no": 2251,
+ "code": "267B",
+ "char": "♻",
+ "name": "recycling symbol"
+ },
+ {
+ "no": 2252,
+ "code": "269C",
+ "char": "⚜",
+ "name": "fleur-de-lis"
+ },
+ {
+ "no": 2253,
+ "code": "1F531",
+ "char": "🔱",
+ "name": "trident emblem"
+ },
+ {
+ "no": 2254,
+ "code": "1F4DB",
+ "char": "📛",
+ "name": "name badge"
+ },
+ {
+ "no": 2255,
+ "code": "1F530",
+ "char": "🔰",
+ "name": "Japanese symbol for beginner"
+ },
+ {
+ "no": 2256,
+ "code": "2B55",
+ "char": "⭕",
+ "name": "heavy large circle"
+ },
+ {
+ "no": 2257,
+ "code": "2705",
+ "char": "✅",
+ "name": "white heavy check mark"
+ },
+ {
+ "no": 2258,
+ "code": "2611",
+ "char": "☑",
+ "name": "ballot box with check"
+ },
+ {
+ "no": 2259,
+ "code": "2714",
+ "char": "✔",
+ "name": "heavy check mark"
+ },
+ {
+ "no": 2260,
+ "code": "2716",
+ "char": "✖",
+ "name": "heavy multiplication x"
+ },
+ {
+ "no": 2261,
+ "code": "274C",
+ "char": "❌",
+ "name": "cross mark"
+ },
+ {
+ "no": 2262,
+ "code": "274E",
+ "char": "❎",
+ "name": "cross mark button"
+ },
+ {
+ "no": 2263,
+ "code": "2795",
+ "char": "➕",
+ "name": "heavy plus sign"
+ },
+ {
+ "no": 2264,
+ "code": "2796",
+ "char": "➖",
+ "name": "heavy minus sign"
+ },
+ {
+ "no": 2265,
+ "code": "2797",
+ "char": "➗",
+ "name": "heavy division sign"
+ },
+ {
+ "no": 2266,
+ "code": "27B0",
+ "char": "➰",
+ "name": "curly loop"
+ },
+ {
+ "no": 2267,
+ "code": "27BF",
+ "char": "➿",
+ "name": "double curly loop"
+ },
+ {
+ "no": 2268,
+ "code": "303D",
+ "char": "〽",
+ "name": "part alternation mark"
+ },
+ {
+ "no": 2269,
+ "code": "2733",
+ "char": "✳",
+ "name": "eight-spoked asterisk"
+ },
+ {
+ "no": 2270,
+ "code": "2734",
+ "char": "✴",
+ "name": "eight-pointed star"
+ },
+ {
+ "no": 2271,
+ "code": "2747",
+ "char": "❇",
+ "name": "sparkle"
+ },
+ {
+ "no": 2272,
+ "code": "203C",
+ "char": "‼",
+ "name": "double exclamation mark"
+ },
+ {
+ "no": 2273,
+ "code": "2049",
+ "char": "⁉",
+ "name": "exclamation question mark"
+ },
+ {
+ "no": 2274,
+ "code": "2753",
+ "char": "❓",
+ "name": "question mark"
+ },
+ {
+ "no": 2275,
+ "code": "2754",
+ "char": "❔",
+ "name": "white question mark"
+ },
+ {
+ "no": 2276,
+ "code": "2755",
+ "char": "❕",
+ "name": "white exclamation mark"
+ },
+ {
+ "no": 2277,
+ "code": "2757",
+ "char": "❗",
+ "name": "exclamation mark"
+ },
+ {
+ "no": 2278,
+ "code": "3030",
+ "char": "〰",
+ "name": "wavy dash"
+ },
+ {
+ "no": 2279,
+ "code": "00A9",
+ "char": "©",
+ "name": "copyright"
+ },
+ {
+ "no": 2280,
+ "code": "00AE",
+ "char": "®",
+ "name": "registered"
+ },
+ {
+ "no": 2281,
+ "code": "2122",
+ "char": "™",
+ "name": "trade mark"
+ },
+ {
+ "no": 2282,
+ "code": "0023 FE0F 20E3",
+ "char": "#️⃣",
+ "name": "keycap: #"
+ },
+ {
+ "no": 2283,
+ "code": "002A FE0F 20E3",
+ "char": "*️⃣",
+ "name": "keycap: *"
+ },
+ {
+ "no": 2284,
+ "code": "0030 FE0F 20E3",
+ "char": "0️⃣",
+ "name": "keycap: 0"
+ },
+ {
+ "no": 2285,
+ "code": "0031 FE0F 20E3",
+ "char": "1️⃣",
+ "name": "keycap: 1"
+ },
+ {
+ "no": 2286,
+ "code": "0032 FE0F 20E3",
+ "char": "2️⃣",
+ "name": "keycap: 2"
+ },
+ {
+ "no": 2287,
+ "code": "0033 FE0F 20E3",
+ "char": "3️⃣",
+ "name": "keycap: 3"
+ },
+ {
+ "no": 2288,
+ "code": "0034 FE0F 20E3",
+ "char": "4️⃣",
+ "name": "keycap: 4"
+ },
+ {
+ "no": 2289,
+ "code": "0035 FE0F 20E3",
+ "char": "5️⃣",
+ "name": "keycap: 5"
+ },
+ {
+ "no": 2290,
+ "code": "0036 FE0F 20E3",
+ "char": "6️⃣",
+ "name": "keycap: 6"
+ },
+ {
+ "no": 2291,
+ "code": "0037 FE0F 20E3",
+ "char": "7️⃣",
+ "name": "keycap: 7"
+ },
+ {
+ "no": 2292,
+ "code": "0038 FE0F 20E3",
+ "char": "8️⃣",
+ "name": "keycap: 8"
+ },
+ {
+ "no": 2293,
+ "code": "0039 FE0F 20E3",
+ "char": "9️⃣",
+ "name": "keycap: 9"
+ },
+ {
+ "no": 2294,
+ "code": "1F51F",
+ "char": "🔟",
+ "name": "keycap 10"
+ },
+ {
+ "no": 2295,
+ "code": "1F4AF",
+ "char": "💯",
+ "name": "hundred points"
+ },
+ {
+ "no": 2296,
+ "code": "1F520",
+ "char": "🔠",
+ "name": "input latin uppercase"
+ },
+ {
+ "no": 2297,
+ "code": "1F521",
+ "char": "🔡",
+ "name": "input latin lowercase"
+ },
+ {
+ "no": 2298,
+ "code": "1F522",
+ "char": "🔢",
+ "name": "input numbers"
+ },
+ {
+ "no": 2299,
+ "code": "1F523",
+ "char": "🔣",
+ "name": "input symbols"
+ },
+ {
+ "no": 2300,
+ "code": "1F524",
+ "char": "🔤",
+ "name": "input latin letters"
+ },
+ {
+ "no": 2301,
+ "code": "1F170",
+ "char": "🅰",
+ "name": "A button (blood type)"
+ },
+ {
+ "no": 2302,
+ "code": "1F18E",
+ "char": "🆎",
+ "name": "AB button (blood type)"
+ },
+ {
+ "no": 2303,
+ "code": "1F171",
+ "char": "🅱",
+ "name": "B button (blood type)"
+ },
+ {
+ "no": 2304,
+ "code": "1F191",
+ "char": "🆑",
+ "name": "CL button"
+ },
+ {
+ "no": 2305,
+ "code": "1F192",
+ "char": "🆒",
+ "name": "COOL button"
+ },
+ {
+ "no": 2306,
+ "code": "1F193",
+ "char": "🆓",
+ "name": "FREE button"
+ },
+ {
+ "no": 2307,
+ "code": "2139",
+ "char": "ℹ",
+ "name": "information"
+ },
+ {
+ "no": 2308,
+ "code": "1F194",
+ "char": "🆔",
+ "name": "ID button"
+ },
+ {
+ "no": 2309,
+ "code": "24C2",
+ "char": "Ⓜ",
+ "name": "circled M"
+ },
+ {
+ "no": 2310,
+ "code": "1F195",
+ "char": "🆕",
+ "name": "NEW button"
+ },
+ {
+ "no": 2311,
+ "code": "1F196",
+ "char": "🆖",
+ "name": "NG button"
+ },
+ {
+ "no": 2312,
+ "code": "1F17E",
+ "char": "🅾",
+ "name": "O button (blood type)"
+ },
+ {
+ "no": 2313,
+ "code": "1F197",
+ "char": "🆗",
+ "name": "OK button"
+ },
+ {
+ "no": 2314,
+ "code": "1F17F",
+ "char": "🅿",
+ "name": "P button"
+ },
+ {
+ "no": 2315,
+ "code": "1F198",
+ "char": "🆘",
+ "name": "SOS button"
+ },
+ {
+ "no": 2316,
+ "code": "1F199",
+ "char": "🆙",
+ "name": "UP! button"
+ },
+ {
+ "no": 2317,
+ "code": "1F19A",
+ "char": "🆚",
+ "name": "VS button"
+ },
+ {
+ "no": 2318,
+ "code": "1F201",
+ "char": "🈁",
+ "name": "Japanese “here” button"
+ },
+ {
+ "no": 2319,
+ "code": "1F202",
+ "char": "🈂",
+ "name": "Japanese “service charge” button"
+ },
+ {
+ "no": 2320,
+ "code": "1F237",
+ "char": "🈷",
+ "name": "Japanese “monthly amount” button"
+ },
+ {
+ "no": 2321,
+ "code": "1F236",
+ "char": "🈶",
+ "name": "Japanese “not free of charge” button"
+ },
+ {
+ "no": 2322,
+ "code": "1F22F",
+ "char": "🈯",
+ "name": "Japanese “reserved” button"
+ },
+ {
+ "no": 2323,
+ "code": "1F250",
+ "char": "🉐",
+ "name": "Japanese “bargain” button"
+ },
+ {
+ "no": 2324,
+ "code": "1F239",
+ "char": "🈹",
+ "name": "Japanese “discount” button"
+ },
+ {
+ "no": 2325,
+ "code": "1F21A",
+ "char": "🈚",
+ "name": "Japanese “free of charge” button"
+ },
+ {
+ "no": 2326,
+ "code": "1F232",
+ "char": "🈲",
+ "name": "Japanese “prohibited” button"
+ },
+ {
+ "no": 2327,
+ "code": "1F251",
+ "char": "🉑",
+ "name": "Japanese “acceptable” button"
+ },
+ {
+ "no": 2328,
+ "code": "1F238",
+ "char": "🈸",
+ "name": "Japanese “application” button"
+ },
+ {
+ "no": 2329,
+ "code": "1F234",
+ "char": "🈴",
+ "name": "Japanese “passing grade” button"
+ },
+ {
+ "no": 2330,
+ "code": "1F233",
+ "char": "🈳",
+ "name": "Japanese “vacancy” button"
+ },
+ {
+ "no": 2331,
+ "code": "3297",
+ "char": "㊗",
+ "name": "Japanese “congratulations” button"
+ },
+ {
+ "no": 2332,
+ "code": "3299",
+ "char": "㊙",
+ "name": "Japanese “secret” button"
+ },
+ {
+ "no": 2333,
+ "code": "1F23A",
+ "char": "🈺",
+ "name": "Japanese “open for business” button"
+ },
+ {
+ "no": 2334,
+ "code": "1F235",
+ "char": "🈵",
+ "name": "Japanese “no vacancy” button"
+ },
+ {
+ "no": 2335,
+ "code": "25AA",
+ "char": "▪",
+ "name": "black small square"
+ },
+ {
+ "no": 2336,
+ "code": "25AB",
+ "char": "▫",
+ "name": "white small square"
+ },
+ {
+ "no": 2337,
+ "code": "25FB",
+ "char": "◻",
+ "name": "white medium square"
+ },
+ {
+ "no": 2338,
+ "code": "25FC",
+ "char": "◼",
+ "name": "black medium square"
+ },
+ {
+ "no": 2339,
+ "code": "25FD",
+ "char": "◽",
+ "name": "white medium-small square"
+ },
+ {
+ "no": 2340,
+ "code": "25FE",
+ "char": "◾",
+ "name": "black medium-small square"
+ },
+ {
+ "no": 2341,
+ "code": "2B1B",
+ "char": "⬛",
+ "name": "black large square"
+ },
+ {
+ "no": 2342,
+ "code": "2B1C",
+ "char": "⬜",
+ "name": "white large square"
+ },
+ {
+ "no": 2343,
+ "code": "1F536",
+ "char": "🔶",
+ "name": "large orange diamond"
+ },
+ {
+ "no": 2344,
+ "code": "1F537",
+ "char": "🔷",
+ "name": "large blue diamond"
+ },
+ {
+ "no": 2345,
+ "code": "1F538",
+ "char": "🔸",
+ "name": "small orange diamond"
+ },
+ {
+ "no": 2346,
+ "code": "1F539",
+ "char": "🔹",
+ "name": "small blue diamond"
+ },
+ {
+ "no": 2347,
+ "code": "1F53A",
+ "char": "🔺",
+ "name": "red triangle pointed up"
+ },
+ {
+ "no": 2348,
+ "code": "1F53B",
+ "char": "🔻",
+ "name": "red triangle pointed down"
+ },
+ {
+ "no": 2349,
+ "code": "1F4A0",
+ "char": "💠",
+ "name": "diamond with a dot"
+ },
+ {
+ "no": 2350,
+ "code": "1F518",
+ "char": "🔘",
+ "name": "radio button"
+ },
+ {
+ "no": 2351,
+ "code": "1F532",
+ "char": "🔲",
+ "name": "black square button"
+ },
+ {
+ "no": 2352,
+ "code": "1F533",
+ "char": "🔳",
+ "name": "white square button"
+ },
+ {
+ "no": 2353,
+ "code": "26AA",
+ "char": "⚪",
+ "name": "white circle"
+ },
+ {
+ "no": 2354,
+ "code": "26AB",
+ "char": "⚫",
+ "name": "black circle"
+ },
+ {
+ "no": 2355,
+ "code": "1F534",
+ "char": "🔴",
+ "name": "red circle"
+ },
+ {
+ "no": 2356,
+ "code": "1F535",
+ "char": "🔵",
+ "name": "blue circle"
+ },
+ {
+ "no": 2357,
+ "code": "1F3C1",
+ "char": "🏁",
+ "name": "chequered flag"
+ },
+ {
+ "no": 2358,
+ "code": "1F6A9",
+ "char": "🚩",
+ "name": "triangular flag"
+ },
+ {
+ "no": 2359,
+ "code": "1F38C",
+ "char": "🎌",
+ "name": "crossed flags"
+ },
+ {
+ "no": 2360,
+ "code": "1F3F4",
+ "char": "🏴",
+ "name": "black flag"
+ },
+ {
+ "no": 2361,
+ "code": "1F3F3",
+ "char": "🏳",
+ "name": "white flag"
+ },
+ {
+ "no": 2362,
+ "code": "1F3F3 FE0F 200D 1F308",
+ "char": "🏳️‍🌈",
+ "name": "rainbow flag"
+ },
+ {
+ "no": 2363,
+ "code": "1F1E6 1F1E8",
+ "char": "🇦🇨",
+ "name": "Ascension Island"
+ },
+ {
+ "no": 2364,
+ "code": "1F1E6 1F1E9",
+ "char": "🇦🇩",
+ "name": "Andorra"
+ },
+ {
+ "no": 2365,
+ "code": "1F1E6 1F1EA",
+ "char": "🇦🇪",
+ "name": "United Arab Emirates"
+ },
+ {
+ "no": 2366,
+ "code": "1F1E6 1F1EB",
+ "char": "🇦🇫",
+ "name": "Afghanistan"
+ },
+ {
+ "no": 2367,
+ "code": "1F1E6 1F1EC",
+ "char": "🇦🇬",
+ "name": "Antigua & Barbuda"
+ },
+ {
+ "no": 2368,
+ "code": "1F1E6 1F1EE",
+ "char": "🇦🇮",
+ "name": "Anguilla"
+ },
+ {
+ "no": 2369,
+ "code": "1F1E6 1F1F1",
+ "char": "🇦🇱",
+ "name": "Albania"
+ },
+ {
+ "no": 2370,
+ "code": "1F1E6 1F1F2",
+ "char": "🇦🇲",
+ "name": "Armenia"
+ },
+ {
+ "no": 2371,
+ "code": "1F1E6 1F1F4",
+ "char": "🇦🇴",
+ "name": "Angola"
+ },
+ {
+ "no": 2372,
+ "code": "1F1E6 1F1F6",
+ "char": "🇦🇶",
+ "name": "Antarctica"
+ },
+ {
+ "no": 2373,
+ "code": "1F1E6 1F1F7",
+ "char": "🇦🇷",
+ "name": "Argentina"
+ },
+ {
+ "no": 2374,
+ "code": "1F1E6 1F1F8",
+ "char": "🇦🇸",
+ "name": "American Samoa"
+ },
+ {
+ "no": 2375,
+ "code": "1F1E6 1F1F9",
+ "char": "🇦🇹",
+ "name": "Austria"
+ },
+ {
+ "no": 2376,
+ "code": "1F1E6 1F1FA",
+ "char": "🇦🇺",
+ "name": "Australia"
+ },
+ {
+ "no": 2377,
+ "code": "1F1E6 1F1FC",
+ "char": "🇦🇼",
+ "name": "Aruba"
+ },
+ {
+ "no": 2378,
+ "code": "1F1E6 1F1FD",
+ "char": "🇦🇽",
+ "name": "Åland Islands"
+ },
+ {
+ "no": 2379,
+ "code": "1F1E6 1F1FF",
+ "char": "🇦🇿",
+ "name": "Azerbaijan"
+ },
+ {
+ "no": 2380,
+ "code": "1F1E7 1F1E6",
+ "char": "🇧🇦",
+ "name": "Bosnia & Herzegovina"
+ },
+ {
+ "no": 2381,
+ "code": "1F1E7 1F1E7",
+ "char": "🇧🇧",
+ "name": "Barbados"
+ },
+ {
+ "no": 2382,
+ "code": "1F1E7 1F1E9",
+ "char": "🇧🇩",
+ "name": "Bangladesh"
+ },
+ {
+ "no": 2383,
+ "code": "1F1E7 1F1EA",
+ "char": "🇧🇪",
+ "name": "Belgium"
+ },
+ {
+ "no": 2384,
+ "code": "1F1E7 1F1EB",
+ "char": "🇧🇫",
+ "name": "Burkina Faso"
+ },
+ {
+ "no": 2385,
+ "code": "1F1E7 1F1EC",
+ "char": "🇧🇬",
+ "name": "Bulgaria"
+ },
+ {
+ "no": 2386,
+ "code": "1F1E7 1F1ED",
+ "char": "🇧🇭",
+ "name": "Bahrain"
+ },
+ {
+ "no": 2387,
+ "code": "1F1E7 1F1EE",
+ "char": "🇧🇮",
+ "name": "Burundi"
+ },
+ {
+ "no": 2388,
+ "code": "1F1E7 1F1EF",
+ "char": "🇧🇯",
+ "name": "Benin"
+ },
+ {
+ "no": 2389,
+ "code": "1F1E7 1F1F1",
+ "char": "🇧🇱",
+ "name": "St. Barthélemy"
+ },
+ {
+ "no": 2390,
+ "code": "1F1E7 1F1F2",
+ "char": "🇧🇲",
+ "name": "Bermuda"
+ },
+ {
+ "no": 2391,
+ "code": "1F1E7 1F1F3",
+ "char": "🇧🇳",
+ "name": "Brunei"
+ },
+ {
+ "no": 2392,
+ "code": "1F1E7 1F1F4",
+ "char": "🇧🇴",
+ "name": "Bolivia"
+ },
+ {
+ "no": 2393,
+ "code": "1F1E7 1F1F6",
+ "char": "🇧🇶",
+ "name": "Caribbean Netherlands"
+ },
+ {
+ "no": 2394,
+ "code": "1F1E7 1F1F7",
+ "char": "🇧🇷",
+ "name": "Brazil"
+ },
+ {
+ "no": 2395,
+ "code": "1F1E7 1F1F8",
+ "char": "🇧🇸",
+ "name": "Bahamas"
+ },
+ {
+ "no": 2396,
+ "code": "1F1E7 1F1F9",
+ "char": "🇧🇹",
+ "name": "Bhutan"
+ },
+ {
+ "no": 2397,
+ "code": "1F1E7 1F1FB",
+ "char": "🇧🇻",
+ "name": "Bouvet Island"
+ },
+ {
+ "no": 2398,
+ "code": "1F1E7 1F1FC",
+ "char": "🇧🇼",
+ "name": "Botswana"
+ },
+ {
+ "no": 2399,
+ "code": "1F1E7 1F1FE",
+ "char": "🇧🇾",
+ "name": "Belarus"
+ },
+ {
+ "no": 2400,
+ "code": "1F1E7 1F1FF",
+ "char": "🇧🇿",
+ "name": "Belize"
+ },
+ {
+ "no": 2401,
+ "code": "1F1E8 1F1E6",
+ "char": "🇨🇦",
+ "name": "Canada"
+ },
+ {
+ "no": 2402,
+ "code": "1F1E8 1F1E8",
+ "char": "🇨🇨",
+ "name": "Cocos (Keeling) Islands"
+ },
+ {
+ "no": 2403,
+ "code": "1F1E8 1F1E9",
+ "char": "🇨🇩",
+ "name": "Congo - Kinshasa"
+ },
+ {
+ "no": 2404,
+ "code": "1F1E8 1F1EB",
+ "char": "🇨🇫",
+ "name": "Central African Republic"
+ },
+ {
+ "no": 2405,
+ "code": "1F1E8 1F1EC",
+ "char": "🇨🇬",
+ "name": "Congo - Brazzaville"
+ },
+ {
+ "no": 2406,
+ "code": "1F1E8 1F1ED",
+ "char": "🇨🇭",
+ "name": "Switzerland"
+ },
+ {
+ "no": 2407,
+ "code": "1F1E8 1F1EE",
+ "char": "🇨🇮",
+ "name": "Côte d’Ivoire"
+ },
+ {
+ "no": 2408,
+ "code": "1F1E8 1F1F0",
+ "char": "🇨🇰",
+ "name": "Cook Islands"
+ },
+ {
+ "no": 2409,
+ "code": "1F1E8 1F1F1",
+ "char": "🇨🇱",
+ "name": "Chile"
+ },
+ {
+ "no": 2410,
+ "code": "1F1E8 1F1F2",
+ "char": "🇨🇲",
+ "name": "Cameroon"
+ },
+ {
+ "no": 2411,
+ "code": "1F1E8 1F1F3",
+ "char": "🇨🇳",
+ "name": "China"
+ },
+ {
+ "no": 2412,
+ "code": "1F1E8 1F1F4",
+ "char": "🇨🇴",
+ "name": "Colombia"
+ },
+ {
+ "no": 2413,
+ "code": "1F1E8 1F1F5",
+ "char": "🇨🇵",
+ "name": "Clipperton Island"
+ },
+ {
+ "no": 2414,
+ "code": "1F1E8 1F1F7",
+ "char": "🇨🇷",
+ "name": "Costa Rica"
+ },
+ {
+ "no": 2415,
+ "code": "1F1E8 1F1FA",
+ "char": "🇨🇺",
+ "name": "Cuba"
+ },
+ {
+ "no": 2416,
+ "code": "1F1E8 1F1FB",
+ "char": "🇨🇻",
+ "name": "Cape Verde"
+ },
+ {
+ "no": 2417,
+ "code": "1F1E8 1F1FC",
+ "char": "🇨🇼",
+ "name": "Curaçao"
+ },
+ {
+ "no": 2418,
+ "code": "1F1E8 1F1FD",
+ "char": "🇨🇽",
+ "name": "Christmas Island"
+ },
+ {
+ "no": 2419,
+ "code": "1F1E8 1F1FE",
+ "char": "🇨🇾",
+ "name": "Cyprus"
+ },
+ {
+ "no": 2420,
+ "code": "1F1E8 1F1FF",
+ "char": "🇨🇿",
+ "name": "Czechia"
+ },
+ {
+ "no": 2421,
+ "code": "1F1E9 1F1EA",
+ "char": "🇩🇪",
+ "name": "Germany"
+ },
+ {
+ "no": 2422,
+ "code": "1F1E9 1F1EC",
+ "char": "🇩🇬",
+ "name": "Diego Garcia"
+ },
+ {
+ "no": 2423,
+ "code": "1F1E9 1F1EF",
+ "char": "🇩🇯",
+ "name": "Djibouti"
+ },
+ {
+ "no": 2424,
+ "code": "1F1E9 1F1F0",
+ "char": "🇩🇰",
+ "name": "Denmark"
+ },
+ {
+ "no": 2425,
+ "code": "1F1E9 1F1F2",
+ "char": "🇩🇲",
+ "name": "Dominica"
+ },
+ {
+ "no": 2426,
+ "code": "1F1E9 1F1F4",
+ "char": "🇩🇴",
+ "name": "Dominican Republic"
+ },
+ {
+ "no": 2427,
+ "code": "1F1E9 1F1FF",
+ "char": "🇩🇿",
+ "name": "Algeria"
+ },
+ {
+ "no": 2428,
+ "code": "1F1EA 1F1E6",
+ "char": "🇪🇦",
+ "name": "Ceuta & Melilla"
+ },
+ {
+ "no": 2429,
+ "code": "1F1EA 1F1E8",
+ "char": "🇪🇨",
+ "name": "Ecuador"
+ },
+ {
+ "no": 2430,
+ "code": "1F1EA 1F1EA",
+ "char": "🇪🇪",
+ "name": "Estonia"
+ },
+ {
+ "no": 2431,
+ "code": "1F1EA 1F1EC",
+ "char": "🇪🇬",
+ "name": "Egypt"
+ },
+ {
+ "no": 2432,
+ "code": "1F1EA 1F1ED",
+ "char": "🇪🇭",
+ "name": "Western Sahara"
+ },
+ {
+ "no": 2433,
+ "code": "1F1EA 1F1F7",
+ "char": "🇪🇷",
+ "name": "Eritrea"
+ },
+ {
+ "no": 2434,
+ "code": "1F1EA 1F1F8",
+ "char": "🇪🇸",
+ "name": "Spain"
+ },
+ {
+ "no": 2435,
+ "code": "1F1EA 1F1F9",
+ "char": "🇪🇹",
+ "name": "Ethiopia"
+ },
+ {
+ "no": 2436,
+ "code": "1F1EA 1F1FA",
+ "char": "🇪🇺",
+ "name": "European Union"
+ },
+ {
+ "no": 2437,
+ "code": "1F1EB 1F1EE",
+ "char": "🇫🇮",
+ "name": "Finland"
+ },
+ {
+ "no": 2438,
+ "code": "1F1EB 1F1EF",
+ "char": "🇫🇯",
+ "name": "Fiji"
+ },
+ {
+ "no": 2439,
+ "code": "1F1EB 1F1F0",
+ "char": "🇫🇰",
+ "name": "Falkland Islands"
+ },
+ {
+ "no": 2440,
+ "code": "1F1EB 1F1F2",
+ "char": "🇫🇲",
+ "name": "Micronesia"
+ },
+ {
+ "no": 2441,
+ "code": "1F1EB 1F1F4",
+ "char": "🇫🇴",
+ "name": "Faroe Islands"
+ },
+ {
+ "no": 2442,
+ "code": "1F1EB 1F1F7",
+ "char": "🇫🇷",
+ "name": "France"
+ },
+ {
+ "no": 2443,
+ "code": "1F1EC 1F1E6",
+ "char": "🇬🇦",
+ "name": "Gabon"
+ },
+ {
+ "no": 2444,
+ "code": "1F1EC 1F1E7",
+ "char": "🇬🇧",
+ "name": "United Kingdom"
+ },
+ {
+ "no": 2445,
+ "code": "1F1EC 1F1E9",
+ "char": "🇬🇩",
+ "name": "Grenada"
+ },
+ {
+ "no": 2446,
+ "code": "1F1EC 1F1EA",
+ "char": "🇬🇪",
+ "name": "Georgia"
+ },
+ {
+ "no": 2447,
+ "code": "1F1EC 1F1EB",
+ "char": "🇬🇫",
+ "name": "French Guiana"
+ },
+ {
+ "no": 2448,
+ "code": "1F1EC 1F1EC",
+ "char": "🇬🇬",
+ "name": "Guernsey"
+ },
+ {
+ "no": 2449,
+ "code": "1F1EC 1F1ED",
+ "char": "🇬🇭",
+ "name": "Ghana"
+ },
+ {
+ "no": 2450,
+ "code": "1F1EC 1F1EE",
+ "char": "🇬🇮",
+ "name": "Gibraltar"
+ },
+ {
+ "no": 2451,
+ "code": "1F1EC 1F1F1",
+ "char": "🇬🇱",
+ "name": "Greenland"
+ },
+ {
+ "no": 2452,
+ "code": "1F1EC 1F1F2",
+ "char": "🇬🇲",
+ "name": "Gambia"
+ },
+ {
+ "no": 2453,
+ "code": "1F1EC 1F1F3",
+ "char": "🇬🇳",
+ "name": "Guinea"
+ },
+ {
+ "no": 2454,
+ "code": "1F1EC 1F1F5",
+ "char": "🇬🇵",
+ "name": "Guadeloupe"
+ },
+ {
+ "no": 2455,
+ "code": "1F1EC 1F1F6",
+ "char": "🇬🇶",
+ "name": "Equatorial Guinea"
+ },
+ {
+ "no": 2456,
+ "code": "1F1EC 1F1F7",
+ "char": "🇬🇷",
+ "name": "Greece"
+ },
+ {
+ "no": 2457,
+ "code": "1F1EC 1F1F8",
+ "char": "🇬🇸",
+ "name": "South Georgia & South Sandwich Islands"
+ },
+ {
+ "no": 2458,
+ "code": "1F1EC 1F1F9",
+ "char": "🇬🇹",
+ "name": "Guatemala"
+ },
+ {
+ "no": 2459,
+ "code": "1F1EC 1F1FA",
+ "char": "🇬🇺",
+ "name": "Guam"
+ },
+ {
+ "no": 2460,
+ "code": "1F1EC 1F1FC",
+ "char": "🇬🇼",
+ "name": "Guinea-Bissau"
+ },
+ {
+ "no": 2461,
+ "code": "1F1EC 1F1FE",
+ "char": "🇬🇾",
+ "name": "Guyana"
+ },
+ {
+ "no": 2462,
+ "code": "1F1ED 1F1F0",
+ "char": "🇭🇰",
+ "name": "Hong Kong SAR China"
+ },
+ {
+ "no": 2463,
+ "code": "1F1ED 1F1F2",
+ "char": "🇭🇲",
+ "name": "Heard & McDonald Islands"
+ },
+ {
+ "no": 2464,
+ "code": "1F1ED 1F1F3",
+ "char": "🇭🇳",
+ "name": "Honduras"
+ },
+ {
+ "no": 2465,
+ "code": "1F1ED 1F1F7",
+ "char": "🇭🇷",
+ "name": "Croatia"
+ },
+ {
+ "no": 2466,
+ "code": "1F1ED 1F1F9",
+ "char": "🇭🇹",
+ "name": "Haiti"
+ },
+ {
+ "no": 2467,
+ "code": "1F1ED 1F1FA",
+ "char": "🇭🇺",
+ "name": "Hungary"
+ },
+ {
+ "no": 2468,
+ "code": "1F1EE 1F1E8",
+ "char": "🇮🇨",
+ "name": "Canary Islands"
+ },
+ {
+ "no": 2469,
+ "code": "1F1EE 1F1E9",
+ "char": "🇮🇩",
+ "name": "Indonesia"
+ },
+ {
+ "no": 2470,
+ "code": "1F1EE 1F1EA",
+ "char": "🇮🇪",
+ "name": "Ireland"
+ },
+ {
+ "no": 2471,
+ "code": "1F1EE 1F1F1",
+ "char": "🇮🇱",
+ "name": "Israel"
+ },
+ {
+ "no": 2472,
+ "code": "1F1EE 1F1F2",
+ "char": "🇮🇲",
+ "name": "Isle of Man"
+ },
+ {
+ "no": 2473,
+ "code": "1F1EE 1F1F3",
+ "char": "🇮🇳",
+ "name": "India"
+ },
+ {
+ "no": 2474,
+ "code": "1F1EE 1F1F4",
+ "char": "🇮🇴",
+ "name": "British Indian Ocean Territory"
+ },
+ {
+ "no": 2475,
+ "code": "1F1EE 1F1F6",
+ "char": "🇮🇶",
+ "name": "Iraq"
+ },
+ {
+ "no": 2476,
+ "code": "1F1EE 1F1F7",
+ "char": "🇮🇷",
+ "name": "Iran"
+ },
+ {
+ "no": 2477,
+ "code": "1F1EE 1F1F8",
+ "char": "🇮🇸",
+ "name": "Iceland"
+ },
+ {
+ "no": 2478,
+ "code": "1F1EE 1F1F9",
+ "char": "🇮🇹",
+ "name": "Italy"
+ },
+ {
+ "no": 2479,
+ "code": "1F1EF 1F1EA",
+ "char": "🇯🇪",
+ "name": "Jersey"
+ },
+ {
+ "no": 2480,
+ "code": "1F1EF 1F1F2",
+ "char": "🇯🇲",
+ "name": "Jamaica"
+ },
+ {
+ "no": 2481,
+ "code": "1F1EF 1F1F4",
+ "char": "🇯🇴",
+ "name": "Jordan"
+ },
+ {
+ "no": 2482,
+ "code": "1F1EF 1F1F5",
+ "char": "🇯🇵",
+ "name": "Japan"
+ },
+ {
+ "no": 2483,
+ "code": "1F1F0 1F1EA",
+ "char": "🇰🇪",
+ "name": "Kenya"
+ },
+ {
+ "no": 2484,
+ "code": "1F1F0 1F1EC",
+ "char": "🇰🇬",
+ "name": "Kyrgyzstan"
+ },
+ {
+ "no": 2485,
+ "code": "1F1F0 1F1ED",
+ "char": "🇰🇭",
+ "name": "Cambodia"
+ },
+ {
+ "no": 2486,
+ "code": "1F1F0 1F1EE",
+ "char": "🇰🇮",
+ "name": "Kiribati"
+ },
+ {
+ "no": 2487,
+ "code": "1F1F0 1F1F2",
+ "char": "🇰🇲",
+ "name": "Comoros"
+ },
+ {
+ "no": 2488,
+ "code": "1F1F0 1F1F3",
+ "char": "🇰🇳",
+ "name": "St. Kitts & Nevis"
+ },
+ {
+ "no": 2489,
+ "code": "1F1F0 1F1F5",
+ "char": "🇰🇵",
+ "name": "North Korea"
+ },
+ {
+ "no": 2490,
+ "code": "1F1F0 1F1F7",
+ "char": "🇰🇷",
+ "name": "South Korea"
+ },
+ {
+ "no": 2491,
+ "code": "1F1F0 1F1FC",
+ "char": "🇰🇼",
+ "name": "Kuwait"
+ },
+ {
+ "no": 2492,
+ "code": "1F1F0 1F1FE",
+ "char": "🇰🇾",
+ "name": "Cayman Islands"
+ },
+ {
+ "no": 2493,
+ "code": "1F1F0 1F1FF",
+ "char": "🇰🇿",
+ "name": "Kazakhstan"
+ },
+ {
+ "no": 2494,
+ "code": "1F1F1 1F1E6",
+ "char": "🇱🇦",
+ "name": "Laos"
+ },
+ {
+ "no": 2495,
+ "code": "1F1F1 1F1E7",
+ "char": "🇱🇧",
+ "name": "Lebanon"
+ },
+ {
+ "no": 2496,
+ "code": "1F1F1 1F1E8",
+ "char": "🇱🇨",
+ "name": "St. Lucia"
+ },
+ {
+ "no": 2497,
+ "code": "1F1F1 1F1EE",
+ "char": "🇱🇮",
+ "name": "Liechtenstein"
+ },
+ {
+ "no": 2498,
+ "code": "1F1F1 1F1F0",
+ "char": "🇱🇰",
+ "name": "Sri Lanka"
+ },
+ {
+ "no": 2499,
+ "code": "1F1F1 1F1F7",
+ "char": "🇱🇷",
+ "name": "Liberia"
+ },
+ {
+ "no": 2500,
+ "code": "1F1F1 1F1F8",
+ "char": "🇱🇸",
+ "name": "Lesotho"
+ },
+ {
+ "no": 2501,
+ "code": "1F1F1 1F1F9",
+ "char": "🇱🇹",
+ "name": "Lithuania"
+ },
+ {
+ "no": 2502,
+ "code": "1F1F1 1F1FA",
+ "char": "🇱🇺",
+ "name": "Luxembourg"
+ },
+ {
+ "no": 2503,
+ "code": "1F1F1 1F1FB",
+ "char": "🇱🇻",
+ "name": "Latvia"
+ },
+ {
+ "no": 2504,
+ "code": "1F1F1 1F1FE",
+ "char": "🇱🇾",
+ "name": "Libya"
+ },
+ {
+ "no": 2505,
+ "code": "1F1F2 1F1E6",
+ "char": "🇲🇦",
+ "name": "Morocco"
+ },
+ {
+ "no": 2506,
+ "code": "1F1F2 1F1E8",
+ "char": "🇲🇨",
+ "name": "Monaco"
+ },
+ {
+ "no": 2507,
+ "code": "1F1F2 1F1E9",
+ "char": "🇲🇩",
+ "name": "Moldova"
+ },
+ {
+ "no": 2508,
+ "code": "1F1F2 1F1EA",
+ "char": "🇲🇪",
+ "name": "Montenegro"
+ },
+ {
+ "no": 2509,
+ "code": "1F1F2 1F1EB",
+ "char": "🇲🇫",
+ "name": "St. Martin"
+ },
+ {
+ "no": 2510,
+ "code": "1F1F2 1F1EC",
+ "char": "🇲🇬",
+ "name": "Madagascar"
+ },
+ {
+ "no": 2511,
+ "code": "1F1F2 1F1ED",
+ "char": "🇲🇭",
+ "name": "Marshall Islands"
+ },
+ {
+ "no": 2512,
+ "code": "1F1F2 1F1F0",
+ "char": "🇲🇰",
+ "name": "Macedonia"
+ },
+ {
+ "no": 2513,
+ "code": "1F1F2 1F1F1",
+ "char": "🇲🇱",
+ "name": "Mali"
+ },
+ {
+ "no": 2514,
+ "code": "1F1F2 1F1F2",
+ "char": "🇲🇲",
+ "name": "Myanmar (Burma)"
+ },
+ {
+ "no": 2515,
+ "code": "1F1F2 1F1F3",
+ "char": "🇲🇳",
+ "name": "Mongolia"
+ },
+ {
+ "no": 2516,
+ "code": "1F1F2 1F1F4",
+ "char": "🇲🇴",
+ "name": "Macau SAR China"
+ },
+ {
+ "no": 2517,
+ "code": "1F1F2 1F1F5",
+ "char": "🇲🇵",
+ "name": "Northern Mariana Islands"
+ },
+ {
+ "no": 2518,
+ "code": "1F1F2 1F1F6",
+ "char": "🇲🇶",
+ "name": "Martinique"
+ },
+ {
+ "no": 2519,
+ "code": "1F1F2 1F1F7",
+ "char": "🇲🇷",
+ "name": "Mauritania"
+ },
+ {
+ "no": 2520,
+ "code": "1F1F2 1F1F8",
+ "char": "🇲🇸",
+ "name": "Montserrat"
+ },
+ {
+ "no": 2521,
+ "code": "1F1F2 1F1F9",
+ "char": "🇲🇹",
+ "name": "Malta"
+ },
+ {
+ "no": 2522,
+ "code": "1F1F2 1F1FA",
+ "char": "🇲🇺",
+ "name": "Mauritius"
+ },
+ {
+ "no": 2523,
+ "code": "1F1F2 1F1FB",
+ "char": "🇲🇻",
+ "name": "Maldives"
+ },
+ {
+ "no": 2524,
+ "code": "1F1F2 1F1FC",
+ "char": "🇲🇼",
+ "name": "Malawi"
+ },
+ {
+ "no": 2525,
+ "code": "1F1F2 1F1FD",
+ "char": "🇲🇽",
+ "name": "Mexico"
+ },
+ {
+ "no": 2526,
+ "code": "1F1F2 1F1FE",
+ "char": "🇲🇾",
+ "name": "Malaysia"
+ },
+ {
+ "no": 2527,
+ "code": "1F1F2 1F1FF",
+ "char": "🇲🇿",
+ "name": "Mozambique"
+ },
+ {
+ "no": 2528,
+ "code": "1F1F3 1F1E6",
+ "char": "🇳🇦",
+ "name": "Namibia"
+ },
+ {
+ "no": 2529,
+ "code": "1F1F3 1F1E8",
+ "char": "🇳🇨",
+ "name": "New Caledonia"
+ },
+ {
+ "no": 2530,
+ "code": "1F1F3 1F1EA",
+ "char": "🇳🇪",
+ "name": "Niger"
+ },
+ {
+ "no": 2531,
+ "code": "1F1F3 1F1EB",
+ "char": "🇳🇫",
+ "name": "Norfolk Island"
+ },
+ {
+ "no": 2532,
+ "code": "1F1F3 1F1EC",
+ "char": "🇳🇬",
+ "name": "Nigeria"
+ },
+ {
+ "no": 2533,
+ "code": "1F1F3 1F1EE",
+ "char": "🇳🇮",
+ "name": "Nicaragua"
+ },
+ {
+ "no": 2534,
+ "code": "1F1F3 1F1F1",
+ "char": "🇳🇱",
+ "name": "Netherlands"
+ },
+ {
+ "no": 2535,
+ "code": "1F1F3 1F1F4",
+ "char": "🇳🇴",
+ "name": "Norway"
+ },
+ {
+ "no": 2536,
+ "code": "1F1F3 1F1F5",
+ "char": "🇳🇵",
+ "name": "Nepal"
+ },
+ {
+ "no": 2537,
+ "code": "1F1F3 1F1F7",
+ "char": "🇳🇷",
+ "name": "Nauru"
+ },
+ {
+ "no": 2538,
+ "code": "1F1F3 1F1FA",
+ "char": "🇳🇺",
+ "name": "Niue"
+ },
+ {
+ "no": 2539,
+ "code": "1F1F3 1F1FF",
+ "char": "🇳🇿",
+ "name": "New Zealand"
+ },
+ {
+ "no": 2540,
+ "code": "1F1F4 1F1F2",
+ "char": "🇴🇲",
+ "name": "Oman"
+ },
+ {
+ "no": 2541,
+ "code": "1F1F5 1F1E6",
+ "char": "🇵🇦",
+ "name": "Panama"
+ },
+ {
+ "no": 2542,
+ "code": "1F1F5 1F1EA",
+ "char": "🇵🇪",
+ "name": "Peru"
+ },
+ {
+ "no": 2543,
+ "code": "1F1F5 1F1EB",
+ "char": "🇵🇫",
+ "name": "French Polynesia"
+ },
+ {
+ "no": 2544,
+ "code": "1F1F5 1F1EC",
+ "char": "🇵🇬",
+ "name": "Papua New Guinea"
+ },
+ {
+ "no": 2545,
+ "code": "1F1F5 1F1ED",
+ "char": "🇵🇭",
+ "name": "Philippines"
+ },
+ {
+ "no": 2546,
+ "code": "1F1F5 1F1F0",
+ "char": "🇵🇰",
+ "name": "Pakistan"
+ },
+ {
+ "no": 2547,
+ "code": "1F1F5 1F1F1",
+ "char": "🇵🇱",
+ "name": "Poland"
+ },
+ {
+ "no": 2548,
+ "code": "1F1F5 1F1F2",
+ "char": "🇵🇲",
+ "name": "St. Pierre & Miquelon"
+ },
+ {
+ "no": 2549,
+ "code": "1F1F5 1F1F3",
+ "char": "🇵🇳",
+ "name": "Pitcairn Islands"
+ },
+ {
+ "no": 2550,
+ "code": "1F1F5 1F1F7",
+ "char": "🇵🇷",
+ "name": "Puerto Rico"
+ },
+ {
+ "no": 2551,
+ "code": "1F1F5 1F1F8",
+ "char": "🇵🇸",
+ "name": "Palestinian Territories"
+ },
+ {
+ "no": 2552,
+ "code": "1F1F5 1F1F9",
+ "char": "🇵🇹",
+ "name": "Portugal"
+ },
+ {
+ "no": 2553,
+ "code": "1F1F5 1F1FC",
+ "char": "🇵🇼",
+ "name": "Palau"
+ },
+ {
+ "no": 2554,
+ "code": "1F1F5 1F1FE",
+ "char": "🇵🇾",
+ "name": "Paraguay"
+ },
+ {
+ "no": 2555,
+ "code": "1F1F6 1F1E6",
+ "char": "🇶🇦",
+ "name": "Qatar"
+ },
+ {
+ "no": 2556,
+ "code": "1F1F7 1F1EA",
+ "char": "🇷🇪",
+ "name": "Réunion"
+ },
+ {
+ "no": 2557,
+ "code": "1F1F7 1F1F4",
+ "char": "🇷🇴",
+ "name": "Romania"
+ },
+ {
+ "no": 2558,
+ "code": "1F1F7 1F1F8",
+ "char": "🇷🇸",
+ "name": "Serbia"
+ },
+ {
+ "no": 2559,
+ "code": "1F1F7 1F1FA",
+ "char": "🇷🇺",
+ "name": "Russia"
+ },
+ {
+ "no": 2560,
+ "code": "1F1F7 1F1FC",
+ "char": "🇷🇼",
+ "name": "Rwanda"
+ },
+ {
+ "no": 2561,
+ "code": "1F1F8 1F1E6",
+ "char": "🇸🇦",
+ "name": "Saudi Arabia"
+ },
+ {
+ "no": 2562,
+ "code": "1F1F8 1F1E7",
+ "char": "🇸🇧",
+ "name": "Solomon Islands"
+ },
+ {
+ "no": 2563,
+ "code": "1F1F8 1F1E8",
+ "char": "🇸🇨",
+ "name": "Seychelles"
+ },
+ {
+ "no": 2564,
+ "code": "1F1F8 1F1E9",
+ "char": "🇸🇩",
+ "name": "Sudan"
+ },
+ {
+ "no": 2565,
+ "code": "1F1F8 1F1EA",
+ "char": "🇸🇪",
+ "name": "Sweden"
+ },
+ {
+ "no": 2566,
+ "code": "1F1F8 1F1EC",
+ "char": "🇸🇬",
+ "name": "Singapore"
+ },
+ {
+ "no": 2567,
+ "code": "1F1F8 1F1ED",
+ "char": "🇸🇭",
+ "name": "St. Helena"
+ },
+ {
+ "no": 2568,
+ "code": "1F1F8 1F1EE",
+ "char": "🇸🇮",
+ "name": "Slovenia"
+ },
+ {
+ "no": 2569,
+ "code": "1F1F8 1F1EF",
+ "char": "🇸🇯",
+ "name": "Svalbard & Jan Mayen"
+ },
+ {
+ "no": 2570,
+ "code": "1F1F8 1F1F0",
+ "char": "🇸🇰",
+ "name": "Slovakia"
+ },
+ {
+ "no": 2571,
+ "code": "1F1F8 1F1F1",
+ "char": "🇸🇱",
+ "name": "Sierra Leone"
+ },
+ {
+ "no": 2572,
+ "code": "1F1F8 1F1F2",
+ "char": "🇸🇲",
+ "name": "San Marino"
+ },
+ {
+ "no": 2573,
+ "code": "1F1F8 1F1F3",
+ "char": "🇸🇳",
+ "name": "Senegal"
+ },
+ {
+ "no": 2574,
+ "code": "1F1F8 1F1F4",
+ "char": "🇸🇴",
+ "name": "Somalia"
+ },
+ {
+ "no": 2575,
+ "code": "1F1F8 1F1F7",
+ "char": "🇸🇷",
+ "name": "Suriname"
+ },
+ {
+ "no": 2576,
+ "code": "1F1F8 1F1F8",
+ "char": "🇸🇸",
+ "name": "South Sudan"
+ },
+ {
+ "no": 2577,
+ "code": "1F1F8 1F1F9",
+ "char": "🇸🇹",
+ "name": "São Tomé & Príncipe"
+ },
+ {
+ "no": 2578,
+ "code": "1F1F8 1F1FB",
+ "char": "🇸🇻",
+ "name": "El Salvador"
+ },
+ {
+ "no": 2579,
+ "code": "1F1F8 1F1FD",
+ "char": "🇸🇽",
+ "name": "Sint Maarten"
+ },
+ {
+ "no": 2580,
+ "code": "1F1F8 1F1FE",
+ "char": "🇸🇾",
+ "name": "Syria"
+ },
+ {
+ "no": 2581,
+ "code": "1F1F8 1F1FF",
+ "char": "🇸🇿",
+ "name": "Swaziland"
+ },
+ {
+ "no": 2582,
+ "code": "1F1F9 1F1E6",
+ "char": "🇹🇦",
+ "name": "Tristan da Cunha"
+ },
+ {
+ "no": 2583,
+ "code": "1F1F9 1F1E8",
+ "char": "🇹🇨",
+ "name": "Turks & Caicos Islands"
+ },
+ {
+ "no": 2584,
+ "code": "1F1F9 1F1E9",
+ "char": "🇹🇩",
+ "name": "Chad"
+ },
+ {
+ "no": 2585,
+ "code": "1F1F9 1F1EB",
+ "char": "🇹🇫",
+ "name": "French Southern Territories"
+ },
+ {
+ "no": 2586,
+ "code": "1F1F9 1F1EC",
+ "char": "🇹🇬",
+ "name": "Togo"
+ },
+ {
+ "no": 2587,
+ "code": "1F1F9 1F1ED",
+ "char": "🇹🇭",
+ "name": "Thailand"
+ },
+ {
+ "no": 2588,
+ "code": "1F1F9 1F1EF",
+ "char": "🇹🇯",
+ "name": "Tajikistan"
+ },
+ {
+ "no": 2589,
+ "code": "1F1F9 1F1F0",
+ "char": "🇹🇰",
+ "name": "Tokelau"
+ },
+ {
+ "no": 2590,
+ "code": "1F1F9 1F1F1",
+ "char": "🇹🇱",
+ "name": "Timor-Leste"
+ },
+ {
+ "no": 2591,
+ "code": "1F1F9 1F1F2",
+ "char": "🇹🇲",
+ "name": "Turkmenistan"
+ },
+ {
+ "no": 2592,
+ "code": "1F1F9 1F1F3",
+ "char": "🇹🇳",
+ "name": "Tunisia"
+ },
+ {
+ "no": 2593,
+ "code": "1F1F9 1F1F4",
+ "char": "🇹🇴",
+ "name": "Tonga"
+ },
+ {
+ "no": 2594,
+ "code": "1F1F9 1F1F7",
+ "char": "🇹🇷",
+ "name": "Turkey"
+ },
+ {
+ "no": 2595,
+ "code": "1F1F9 1F1F9",
+ "char": "🇹🇹",
+ "name": "Trinidad & Tobago"
+ },
+ {
+ "no": 2596,
+ "code": "1F1F9 1F1FB",
+ "char": "🇹🇻",
+ "name": "Tuvalu"
+ },
+ {
+ "no": 2597,
+ "code": "1F1F9 1F1FC",
+ "char": "🇹🇼",
+ "name": "Taiwan"
+ },
+ {
+ "no": 2598,
+ "code": "1F1F9 1F1FF",
+ "char": "🇹🇿",
+ "name": "Tanzania"
+ },
+ {
+ "no": 2599,
+ "code": "1F1FA 1F1E6",
+ "char": "🇺🇦",
+ "name": "Ukraine"
+ },
+ {
+ "no": 2600,
+ "code": "1F1FA 1F1EC",
+ "char": "🇺🇬",
+ "name": "Uganda"
+ },
+ {
+ "no": 2601,
+ "code": "1F1FA 1F1F2",
+ "char": "🇺🇲",
+ "name": "U.S. Outlying Islands"
+ },
+ {
+ "no": 2602,
+ "code": "1F1FA 1F1F3",
+ "char": "🇺🇳",
+ "name": "United Nations"
+ },
+ {
+ "no": 2603,
+ "code": "1F1FA 1F1F8",
+ "char": "🇺🇸",
+ "name": "United States"
+ },
+ {
+ "no": 2604,
+ "code": "1F1FA 1F1FE",
+ "char": "🇺🇾",
+ "name": "Uruguay"
+ },
+ {
+ "no": 2605,
+ "code": "1F1FA 1F1FF",
+ "char": "🇺🇿",
+ "name": "Uzbekistan"
+ },
+ {
+ "no": 2606,
+ "code": "1F1FB 1F1E6",
+ "char": "🇻🇦",
+ "name": "Vatican City"
+ },
+ {
+ "no": 2607,
+ "code": "1F1FB 1F1E8",
+ "char": "🇻🇨",
+ "name": "St. Vincent & Grenadines"
+ },
+ {
+ "no": 2608,
+ "code": "1F1FB 1F1EA",
+ "char": "🇻🇪",
+ "name": "Venezuela"
+ },
+ {
+ "no": 2609,
+ "code": "1F1FB 1F1EC",
+ "char": "🇻🇬",
+ "name": "British Virgin Islands"
+ },
+ {
+ "no": 2610,
+ "code": "1F1FB 1F1EE",
+ "char": "🇻🇮",
+ "name": "U.S. Virgin Islands"
+ },
+ {
+ "no": 2611,
+ "code": "1F1FB 1F1F3",
+ "char": "🇻🇳",
+ "name": "Vietnam"
+ },
+ {
+ "no": 2612,
+ "code": "1F1FB 1F1FA",
+ "char": "🇻🇺",
+ "name": "Vanuatu"
+ },
+ {
+ "no": 2613,
+ "code": "1F1FC 1F1EB",
+ "char": "🇼🇫",
+ "name": "Wallis & Futuna"
+ },
+ {
+ "no": 2614,
+ "code": "1F1FC 1F1F8",
+ "char": "🇼🇸",
+ "name": "Samoa"
+ },
+ {
+ "no": 2615,
+ "code": "1F1FD 1F1F0",
+ "char": "🇽🇰",
+ "name": "Kosovo"
+ },
+ {
+ "no": 2616,
+ "code": "1F1FE 1F1EA",
+ "char": "🇾🇪",
+ "name": "Yemen"
+ },
+ {
+ "no": 2617,
+ "code": "1F1FE 1F1F9",
+ "char": "🇾🇹",
+ "name": "Mayotte"
+ },
+ {
+ "no": 2618,
+ "code": "1F1FF 1F1E6",
+ "char": "🇿🇦",
+ "name": "South Africa"
+ },
+ {
+ "no": 2619,
+ "code": "1F1FF 1F1F2",
+ "char": "🇿🇲",
+ "name": "Zambia"
+ },
+ {
+ "no": 2620,
+ "code": "1F1FF 1F1FC",
+ "char": "🇿🇼",
+ "name": "Zimbabwe"
+ },
+ {
+ "no": 2621,
+ "code": "1F3F4 E0067 E0062 E0065 E006E E0067 E007F",
+ "char": "🏴󠁧󠁢󠁥󠁮󠁧󠁿",
+ "name": "⊛ England"
+ },
+ {
+ "no": 2622,
+ "code": "1F3F4 E0067 E0062 E0073 E0063 E0074 E007F",
+ "char": "🏴󠁧󠁢󠁳󠁣󠁴󠁿",
+ "name": "⊛ Scotland"
+ },
+ {
+ "no": 2623,
+ "code": "1F3F4 E0067 E0062 E0077 E006C E0073 E007F",
+ "char": "🏴󠁧󠁢󠁷󠁬󠁳󠁿",
+ "name": "⊛ Wales"
+ }
+]
diff --git a/data/gnome-shell-dbus-interfaces.gresource.xml b/data/gnome-shell-dbus-interfaces.gresource.xml
new file mode 100644
index 0000000..69bc674
--- /dev/null
+++ b/data/gnome-shell-dbus-interfaces.gresource.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/shell/dbus-interfaces">
+ <file preprocess="xml-stripblanks">net.hadess.SensorProxy.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.Application.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.bolt1.Device.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.bolt1.Manager.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.DBus.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Agent.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Manager.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Access.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.impl.portal.PermissionStore.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Request.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.login1.Manager.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.login1.Session.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.login1.User.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.ModemManager1.Modem.Modem3gpp.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.ModemManager1.Modem.ModemCdma.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.ModemManager1.Modem.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.ModemManager.Modem.Cdma.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.ModemManager.Modem.Gsm.Network.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.Notifications.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.PackageKit.Offline.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.realmd.Provider.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.realmd.Realm.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.realmd.Service.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.UPower.Device.xml</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.UPower.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Magnifier.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Magnifier.ZoomRegion.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Mutter.ScreenCast.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.ScreenSaver.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.SessionManager.EndSessionDialog.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.SessionManager.Inhibitor.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.SessionManager.Presence.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.SessionManager.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Color.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Power.Screen.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Rfkill.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Wacom.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.AudioDeviceSelection.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.CalendarServer.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.ClocksIntegration.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.Extensions.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.Introspect.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.HotplugSniffer.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.PerfHelper.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.PortalHelper.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.Screencast.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.Screenshot.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.Wacom.PadOsd.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.WeatherIntegration.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.xml</file>
+ <file preprocess="xml-stripblanks">org.Gtk.MountOperationHandler.xml</file>
+ <file preprocess="xml-stripblanks">org.gtk.Notifications.xml</file>
+ <file preprocess="xml-stripblanks">org.mpris.MediaPlayer2.Player.xml</file>
+ <file preprocess="xml-stripblanks">org.mpris.MediaPlayer2.xml</file>
+ </gresource>
+</gresources>
diff --git a/data/gnome-shell-osk-layouts.gresource.xml b/data/gnome-shell-osk-layouts.gresource.xml
new file mode 100644
index 0000000..8730e1d
--- /dev/null
+++ b/data/gnome-shell-osk-layouts.gresource.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/shell/osk-layouts">
+ <file>am.json</file>
+ <file>ara.json</file>
+ <file>be.json</file>
+ <file>bg.json</file>
+ <file>by.json</file>
+ <file>ca.json</file>
+ <file>cz.json</file>
+ <file>de.json</file>
+ <file>dk.json</file>
+ <file>ee.json</file>
+ <file>epo.json</file>
+ <file>es+cat.json</file>
+ <file>es.json</file>
+ <file>fi.json</file>
+ <file>fr.json</file>
+ <file>ge.json</file>
+ <file>gr.json</file>
+ <file>hr.json</file>
+ <file>hu.json</file>
+ <file>id.json</file>
+ <file>il.json</file>
+ <file>in+bolnagri.json</file>
+ <file>in+mal.json</file>
+ <file>ir.json</file>
+ <file>is.json</file>
+ <file>it.json</file>
+ <file>ke.json</file>
+ <file>kg.json</file>
+ <file>kh.json</file>
+ <file>la.json</file>
+ <file>latam.json</file>
+ <file>lt.json</file>
+ <file>lv.json</file>
+ <file>mk.json</file>
+ <file>mn.json</file>
+ <file>my.json</file>
+ <file>nl.json</file>
+ <file>no.json</file>
+ <file>ph.json</file>
+ <file>pl.json</file>
+ <file>pt.json</file>
+ <file>ro.json</file>
+ <file>rs.json</file>
+ <file>ru.json</file>
+ <file>se.json</file>
+ <file>si.json</file>
+ <file>sk.json</file>
+ <file>th.json</file>
+ <file>tr.json</file>
+ <file>ua.json</file>
+ <file>uk.json</file>
+ <file>us.json</file>
+ <file>vn.json</file>
+ <file>za.json</file>
+ <file>emoji.json</file>
+ </gresource>
+</gresources>
diff --git a/data/gnome-shell-overrides-migration.desktop.in b/data/gnome-shell-overrides-migration.desktop.in
new file mode 100644
index 0000000..99452e6
--- /dev/null
+++ b/data/gnome-shell-overrides-migration.desktop.in
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Type=Application
+Name=GNOME settings overrides migration
+NoDisplay=true
+Exec=@libexecdir@/gnome-shell-overrides-migration.sh
diff --git a/data/gnome-shell-overrides.convert b/data/gnome-shell-overrides.convert
new file mode 100644
index 0000000..142790a
--- /dev/null
+++ b/data/gnome-shell-overrides.convert
@@ -0,0 +1,4 @@
+[org.gnome.shell.overrides]
+attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs
+edge-tiling = /desktop/gnome/shell/windows/edge_tiling
+workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary
diff --git a/data/gnome-shell-theme.gresource.xml b/data/gnome-shell-theme.gresource.xml
new file mode 100644
index 0000000..025630f
--- /dev/null
+++ b/data/gnome-shell-theme.gresource.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/shell/theme">
+ <file>calendar-today.svg</file>
+ <file>checkbox-focused.svg</file>
+ <file>checkbox-off-focused.svg</file>
+ <file>checkbox-off.svg</file>
+ <file>checkbox.svg</file>
+ <file alias="icons/scalable/actions/color-pick.svg">color-pick.svg</file>
+ <file>dash-placeholder.svg</file>
+ <file>gnome-shell.css</file>
+ <file>gnome-shell-high-contrast.css</file>
+ <file alias="icons/scalable/status/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
+ <file>no-events.svg</file>
+ <file>no-notifications.svg</file>
+ <file>pad-osd.css</file>
+ <file alias="icons/scalable/status/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
+ <file alias="icons/scalable/status/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
+ <file alias="icons/scalable/actions/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
+ <file alias="icons/scalable/actions/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
+ <file alias="icons/scalable/actions/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
+ <file alias="icons/scalable/actions/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
+ <file alias="icons/scalable/status/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file>
+ <file alias="icons/scalable/status/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file>
+ <file alias="icons/scalable/status/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file>
+ <file alias="icons/scalable/status/keyboard-layout-filled-symbolic.svg">keyboard-layout-filled-symbolic.svg</file>
+ <file alias="icons/scalable/status/keyboard-shift-filled-symbolic.svg">keyboard-shift-filled-symbolic.svg</file>
+ <file>process-working.svg</file>
+ <file>toggle-off.svg</file>
+ <file>toggle-off-dark.svg</file>
+ <file>toggle-off-hc.svg</file>
+ <file>toggle-on.svg</file>
+ <file>toggle-on-dark.svg</file>
+ <file>toggle-on-hc.svg</file>
+ </gresource>
+</gresources>
diff --git a/data/gnome-shell.portal b/data/gnome-shell.portal
new file mode 100644
index 0000000..b704637
--- /dev/null
+++ b/data/gnome-shell.portal
@@ -0,0 +1,4 @@
+[portal]
+DBusName=org.freedesktop.impl.portal.desktop.gnome
+Interfaces=org.freedesktop.impl.portal.Access
+UseIn=gnome
diff --git a/data/icons/hicolor/scalable/apps/org.gnome.Shell.Extensions.svg b/data/icons/hicolor/scalable/apps/org.gnome.Shell.Extensions.svg
new file mode 100644
index 0000000..496be6b
--- /dev/null
+++ b/data/icons/hicolor/scalable/apps/org.gnome.Shell.Extensions.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="10.23" y1="87.43" x2="133.236" y2="88.679" gradientTransform="translate(-8 -16)"><stop offset="0" stop-color="#208757"/><stop offset=".077" stop-color="#2ec27e"/><stop offset=".147" stop-color="#208a5a"/><stop offset=".198" stop-color="#26a269"/><stop offset=".364" stop-color="#1c774d"/><stop offset=".407" stop-color="#26a269"/><stop offset=".493" stop-color="#26a269"/><stop offset=".576" stop-color="#26a269"/><stop offset=".606" stop-color="#2ec27e"/><stop offset=".681" stop-color="#26a269"/><stop offset=".784" stop-color="#1d7a4e"/><stop offset=".945" stop-color="#28ab6f"/><stop offset="1" stop-color="#48d493"/></linearGradient></defs><path d="M21.965 18.363v4l2.039 17.75c.418 3.637 1.055 7.282.844 10.938-.106 1.828-.465 3.668-1.309 5.293-.426.812-.969 1.57-1.644 2.191-.676.621-1.485 1.106-2.364 1.356-1.047.297-2.156.261-3.238.164-1.094-.098-2.227-.282-3.137-.903-.394-.273-.73-.617-1.082-.945-.351-.328-.726-.645-1.168-.832-.691-.297-1.492-.254-2.207-.023-.715.23-1.355.64-1.972 1.066-1.188.824-2.325 1.758-3.184 2.922-1.734 2.344-2.203 5.46-1.711 8.336.367 2.152 1.258 4.238 2.688 5.89.722.836 1.582 1.563 2.566 2.063.98.504 2.09.773 3.195.71 1.446-.085 2.79-.73 4.114-1.327 1.32-.594 2.718-1.16 4.168-1.067a5.113 5.113 0 012.332.758 5.958 5.958 0 011.773 1.707c.848 1.242 1.234 2.742 1.531 4.219 1.832 9.133.778 18.82-2.98 27.344v4c6.812 2.347 13.8 4.199 20.886 5.535 2.356.441 4.801.824 7.13.246 1.163-.29 2.28-.832 3.148-1.66a5.39 5.39 0 001.441-2.34c.266-.887.278-1.828.254-2.754L54 110c-.426.09-.875.059-1.285-.082a2.751 2.751 0 01-1.16-.8 3.768 3.768 0 01-.7-1.231c-.316-.895-.351-1.864-.355-2.813-.008-1.57.063-3.187.684-4.629.629-1.465 1.793-2.652 3.117-3.535 2.64-1.758 5.898-2.375 9.07-2.414 2.91-.035 5.918.414 8.387 1.953 1.238.77 2.316 1.809 3.043 3.07.722 1.262 1.078 2.739.953 4.188-.098 1.117-.477 2.2-1.02 3.18A9.862 9.862 0 0172 110c.012.996.02 1.992.02 2.988.003.555.003 1.114.07 1.664.07.551.21 1.098.476 1.586.383.7 1.012 1.239 1.692 1.657.68.414 1.422.722 2.176.984 4.207 1.46 8.793 1.562 13.203.922a40.756 40.756 0 0015.86-5.88l-.005-4.003a60.146 60.146 0 01-3.433-25.465c.125-1.512.312-3.039.894-4.441.29-.7.68-1.364 1.18-1.93.504-.566 1.12-1.039 1.82-1.332.82-.344 1.727-.434 2.613-.367.887.07 1.75.297 2.598.57 1.688.547 3.344 1.297 5.117 1.418 1.492.098 2.996-.266 4.332-.937a9.894 9.894 0 004.016-3.715 9.91 9.91 0 001.418-5.285l.176-2.258a16.406 16.406 0 00-3.075-6.477c-.785-.996-1.707-1.914-2.835-2.496a5.247 5.247 0 00-1.805-.558 4.18 4.18 0 00-1.875.214c-.988.364-1.774 1.125-2.703 1.614-1.032.543-2.203.738-3.364.824-1.148.086-2.324.07-3.425-.274-1.48-.464-2.743-1.52-3.602-2.812-.855-1.293-1.332-2.805-1.59-4.328-.574-3.399-.117-6.871.266-10.297a227.56 227.56 0 001.34-19.973 497.333 497.333 0 01-21.118-5.117c-1.355-.36-2.718-.726-4.113-.894-1.394-.165-2.836-.118-4.168.332a7.108 7.108 0 00-2.93 1.894v4c0 .414.016.828.11 1.235.094.402.258.789.445 1.156.371.738.82 1.433 1.313 2.097.98 1.329 2.136 2.563 2.765 4.094.688 1.676.668 3.606.07 5.317-.597 1.707-1.75 3.203-3.179 4.312-1.43 1.113-3.133 1.852-4.895 2.262-1.765.414-3.593.508-5.402.406-2.926-.164-5.906-.875-8.25-2.633-1.172-.883-2.164-2.015-2.793-3.34-.625-1.324-.879-2.828-.668-4.277.293-1.973 1.399-3.71 2.45-5.406.421-.684.831-1.38 1.078-2.14.242-.763.296-1.571.308-2.372L54.633 18a1.89 1.89 0 01-1.695.777c-.516-.047-.989-.3-1.41-.601-.419-.301-.801-.653-1.231-.938-.871-.578-1.914-.855-2.957-.933-1.043-.075-2.09.039-3.125.191-2.403.356-4.77.91-7.176 1.266-2.402.351-4.832.46-7.262.496zm0 0" fill="url(#a)"/><path d="M21.965 18.363l2.039 17.746c.426 3.715 1.16 7.414 1.094 11.149-.035 1.867-.34 3.77-1.239 5.41-.449.816-1.047 1.562-1.785 2.133-.738.574-1.617.972-2.543 1.09-1.504.195-2.996-.344-4.379-.961-1.379-.621-2.75-1.344-4.246-1.555-1.465-.21-2.984.094-4.293.777-1.308.688-2.406 1.746-3.207 2.989-1.601 2.484-1.972 5.605-1.574 8.535.3 2.219 1.05 4.433 2.512 6.133.73.847 1.633 1.558 2.656 2.011 1.023.457 2.168.657 3.281.52 1.54-.192 2.926-1 4.324-1.676.704-.336 1.422-.644 2.176-.828.754-.184 1.551-.238 2.309-.066.82.183 1.566.628 2.164 1.218.601.586 1.05 1.313 1.375 2.086.64 1.551.762 3.258.84 4.934a123.2 123.2 0 01-2.25 29.965 133.42 133.42 0 0020.886 5.53c2.352.427 4.793.782 7.11.196 1.16-.293 2.27-.828 3.152-1.633.883-.804 1.528-1.89 1.711-3.074.133-.879.012-1.789-.25-2.64-.262-.852-.668-1.657-1.101-2.438-.868-1.559-1.887-3.086-2.227-4.84-.3-1.558-.023-3.207.676-4.633.703-1.425 1.816-2.629 3.12-3.535 2.614-1.804 5.9-2.383 9.075-2.41 2.91-.023 5.918.414 8.39 1.953 1.235.77 2.313 1.809 3.04 3.07.73 1.258 1.097 2.743.953 4.188-.117 1.113-.524 2.18-1.024 3.18-.5 1.004-1.093 1.957-1.609 2.949-.512.996-.95 2.047-1.11 3.152-.156 1.11-.019 2.29.555 3.25.41.684 1.02 1.23 1.696 1.649.675.422 1.418.722 2.168.992a30.23 30.23 0 0015.183 1.332 30.128 30.128 0 0013.88-6.293l-2.587-19.371c-.453-3.406-1.14-6.813-1.047-10.246.043-1.719.34-3.461 1.141-4.98a6.796 6.796 0 011.578-2.02 5.338 5.338 0 012.262-1.18c.8-.183 1.637-.164 2.441-.02.809.145 1.59.41 2.352.708 1.527.597 3.023 1.34 4.648 1.558 1.5.203 3.055-.062 4.426-.699 1.375-.64 2.566-1.648 3.469-2.863 1.808-2.434 2.418-5.625 2.047-8.63-.305-2.448-1.258-4.862-2.953-6.655-.848-.895-1.875-1.63-3.016-2.098-1.14-.473-2.395-.684-3.621-.563-1.637.157-3.153.875-4.688 1.461-.765.297-1.55.559-2.355.707-.809.149-1.649.176-2.45-.004-1.214-.27-2.296-1.007-3.081-1.972-.786-.965-1.286-2.14-1.547-3.36-.524-2.43-.125-4.953.23-7.414a199.18 199.18 0 002-24.914 119.325 119.325 0 00-22.3-4.867c-2.329-.281-4.75-.48-6.97.274-1.113.378-2.152 1-2.933 1.875-.781.87-1.289 2.011-1.312 3.183-.02.824.199 1.645.543 2.395.347.75.812 1.441 1.312 2.097 1 1.317 2.148 2.559 2.773 4.09.688 1.676.676 3.606.082 5.32-.593 1.711-1.746 3.207-3.175 4.32-1.434 1.114-3.137 1.852-4.903 2.263-1.765.41-3.593.5-5.406.394-2.918-.172-5.894-.89-8.23-2.652-1.168-.88-2.157-2.016-2.79-3.332-.632-1.317-.906-2.82-.69-4.266.296-1.965 1.437-3.68 2.398-5.418.48-.871.925-1.77 1.199-2.723.277-.953.379-1.976.168-2.945-.219-1.016-.774-1.941-1.512-2.672-.738-.726-1.652-1.261-2.629-1.617-1.949-.71-4.078-.707-6.148-.586a58.229 58.229 0 00-22.254 5.867zm0 0" fill="#33d17a"/></svg> \ No newline at end of file
diff --git a/data/icons/hicolor/symbolic/apps/org.gnome.Shell.Extensions-symbolic.svg b/data/icons/hicolor/symbolic/apps/org.gnome.Shell.Extensions-symbolic.svg
new file mode 100644
index 0000000..4208a4d
--- /dev/null
+++ b/data/icons/hicolor/symbolic/apps/org.gnome.Shell.Extensions-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.5 1.031c-.371 0-.742-.035-1.11.016-.367.05-.73.203-.972.476-.125.141-.215.309-.266.485-.047.18-.054.367-.02.55.032.184.102.356.192.516.09.164.203.309.317.457L5 4H2a1.8 1.8 0 00-.41.035.791.791 0 00-.36.195.791.791 0 00-.195.36C1 4.723 1 4.863 1 5v2.75l.77-.344c.265-.117.542-.23.832-.242.289-.016.586.074.812.254.227.18.383.441.465.723.082.277.101.57.121.859.02.316.04.637-.016.95-.058.312-.199.616-.43.831a1.264 1.264 0 01-.874.32c-.317-.007-.618-.128-.91-.257L1 10.5V14c0 .137.004.277.035.41a.791.791 0 00.195.36c.098.097.227.16.36.195.133.035.273.035.41.035h3l-.328-.68c-.14-.293-.274-.597-.29-.922-.015-.32.095-.652.31-.894.214-.242.523-.39.84-.453.316-.067.644-.059.968-.059.324 0 .652-.008.969.059.316.062.625.21.84.453.214.242.324.574.308.894-.015.325-.148.63-.289.922L8 15h3a1.8 1.8 0 00.41-.035.791.791 0 00.36-.195.791.791 0 00.195-.36C12 14.277 12 14.137 12 14v-3.563l.703.297c.29.125.59.239.902.246.313.004.63-.101.864-.308.238-.203.386-.496.46-.8C15 9.565 15 9.25 15 8.937c0-.313 0-.63-.07-.934-.075-.305-.223-.598-.461-.8a1.288 1.288 0 00-.864-.31c-.312.008-.613.122-.902.247L12 7.437V5a1.8 1.8 0 00-.035-.41.791.791 0 00-.195-.36.791.791 0 00-.36-.195C11.277 4 11.137 4 11 4H8l.36-.469c.113-.148.226-.293.316-.457.09-.16.16-.332.191-.515a1.248 1.248 0 00-.02-.551 1.256 1.256 0 00-.265-.485c-.242-.273-.605-.425-.973-.476-.367-.05-.738-.016-1.109-.016zm0 0" fill="#474747"/></svg> \ No newline at end of file
diff --git a/data/icons/meson.build b/data/icons/meson.build
new file mode 100644
index 0000000..eff6e4b
--- /dev/null
+++ b/data/icons/meson.build
@@ -0,0 +1 @@
+install_subdir('hicolor', install_dir: icondir)
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 0000000..25a8142
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,130 @@
+desktop_files = [
+ 'org.gnome.Shell.desktop',
+ 'org.gnome.Shell.Extensions.desktop',
+]
+service_files = []
+
+if have_networkmanager
+ desktop_files += 'org.gnome.Shell.PortalHelper.desktop'
+ service_files += 'org.gnome.Shell.PortalHelper.service'
+endif
+
+desktopconf = configuration_data()
+# We substitute in bindir so it works as an autostart
+# file when built in a non-system prefix
+desktopconf.set('bindir', bindir)
+desktopconf.set('systemd_hidden', have_systemd ? 'true' : 'false')
+
+foreach desktop_file : desktop_files
+ i18n.merge_file('desktop',
+ input: configure_file(
+ input: desktop_file + '.in.in',
+ output: desktop_file + '.in',
+ configuration: desktopconf
+ ),
+ output: desktop_file,
+ po_dir: po_dir,
+ install: true,
+ install_dir: desktopdir,
+ type: 'desktop'
+ )
+endforeach
+
+serviceconf = configuration_data()
+serviceconf.set('libexecdir', libexecdir)
+foreach service_file : service_files
+ configure_file(
+ input: service_file + '.in',
+ output: service_file,
+ configuration: serviceconf,
+ install_dir: servicedir
+ )
+endforeach
+
+
+subdir('dbus-interfaces')
+subdir('icons')
+subdir('theme')
+
+data_resources = [
+ ['dbus-interfaces', []],
+ ['osk-layouts', []],
+ ['theme', theme_deps]
+]
+foreach resource : data_resources
+ gnome.compile_resources(
+ 'gnome-shell-' + resource[0],
+ 'gnome-shell-@0@.gresource.xml'.format(resource[0]),
+ source_dir: resource[0],
+ dependencies: resource[1],
+ gresource_bundle: true,
+ install: true,
+ install_dir: pkgdatadir
+ )
+endforeach
+
+perfconf = configuration_data()
+perfconf.set('datadir', datadir)
+configure_file(
+ input: 'perf-background.xml.in',
+ output: 'perf-background.xml',
+ configuration: perfconf,
+ install_dir: pkgdatadir
+)
+
+
+install_data('gnome-shell.portal', install_dir: portaldir)
+install_data('50-gnome-shell-system.xml', install_dir: keysdir)
+
+
+schemaconf = configuration_data()
+schemaconf.set('GETTEXT_PACKAGE', meson.project_name())
+schema = configure_file(
+ input: 'org.gnome.shell.gschema.xml.in',
+ output: 'org.gnome.shell.gschema.xml',
+ configuration: schemaconf,
+ install_dir: schemadir
+)
+install_data('00_org.gnome.shell.gschema.override', install_dir: schemadir)
+
+overrides_migration_conf = configuration_data()
+overrides_migration_conf.set('libexecdir', libexecdir)
+overrides_migration = configure_file(
+ input: 'gnome-shell-overrides-migration.desktop.in',
+ output: 'gnome-shell-overrides-migration.desktop',
+ configuration: overrides_migration_conf,
+ install_dir: autostartdir
+)
+
+if have_systemd
+ unitconf = configuration_data()
+ unitconf.set('bindir', bindir)
+
+ configure_file(
+ input: 'org.gnome.Shell@x11.service.in',
+ output: 'org.gnome.Shell@x11.service',
+ configuration: unitconf,
+ install_dir: systemduserunitdir
+ )
+
+ configure_file(
+ input: 'org.gnome.Shell@wayland.service.in',
+ output: 'org.gnome.Shell@wayland.service',
+ configuration: unitconf,
+ install_dir: systemduserunitdir
+ )
+
+ units = files('org.gnome.Shell.target',
+ 'org.gnome.Shell-disable-extensions.service')
+
+ install_data(units, install_dir: systemduserunitdir)
+endif
+
+# for unit tests - gnome.compile_schemas() only looks in srcdir
+custom_target('compile-schemas',
+ input: schema,
+ output: 'gschemas.compiled',
+ command: [find_program('glib-compile-schemas'), meson.current_build_dir()],
+ build_by_default: true)
+
+install_data('gnome-shell-overrides.convert', install_dir: convertdir)
diff --git a/data/org.gnome.Shell-disable-extensions.service b/data/org.gnome.Shell-disable-extensions.service
new file mode 100644
index 0000000..de91167
--- /dev/null
+++ b/data/org.gnome.Shell-disable-extensions.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Disable GNOME Shell extensions after failure
+# Note that this unit must not conflict with anything, and must
+# be able to run in parallel with the gnome-session-shutdown.target.
+DefaultDependencies=no
+
+# We want to disable extensions only if gnome-shell has flagged the extensions
+# to be a likely cause of trouble.
+ConditionPathExists=%t/gnome-shell-disable-extensions
+
+[Service]
+Type=simple
+# Disable extensions
+ExecStart=gsettings set org.gnome.shell disable-user-extensions true
+Restart=no
diff --git a/data/org.gnome.Shell.Extensions.desktop.in.in b/data/org.gnome.Shell.Extensions.desktop.in.in
new file mode 100644
index 0000000..9c3b6bc
--- /dev/null
+++ b/data/org.gnome.Shell.Extensions.desktop.in.in
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Type=Application
+# Keep in sync with subprojects/extensions-app
+Name=Extensions
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Shell.Extensions
+# Never launch this, just provide name+icon to portal dialog
+Exec=false
+OnlyShowIn=GNOME;
+NoDisplay=true
diff --git a/data/org.gnome.Shell.PortalHelper.desktop.in.in b/data/org.gnome.Shell.PortalHelper.desktop.in.in
new file mode 100644
index 0000000..269669e
--- /dev/null
+++ b/data/org.gnome.Shell.PortalHelper.desktop.in.in
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Name=Network Login
+Type=Application
+Exec=gapplication launch org.gnome.Shell.PortalHelper
+DBusActivatable=true
+NoDisplay=true
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=network-workgroup
+StartupNotify=true
+OnlyShowIn=GNOME;
diff --git a/data/org.gnome.Shell.PortalHelper.service.in b/data/org.gnome.Shell.PortalHelper.service.in
new file mode 100644
index 0000000..5465a32
--- /dev/null
+++ b/data/org.gnome.Shell.PortalHelper.service.in
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=org.gnome.Shell.PortalHelper
+Exec=@libexecdir@/gnome-shell-portal-helper
diff --git a/data/org.gnome.Shell.desktop.in.in b/data/org.gnome.Shell.desktop.in.in
new file mode 100644
index 0000000..59d1cd2
--- /dev/null
+++ b/data/org.gnome.Shell.desktop.in.in
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Type=Application
+Name=GNOME Shell
+Comment=Window management and application launching
+Exec=@bindir@/gnome-shell
+Categories=GNOME;GTK;Core;
+OnlyShowIn=GNOME;
+NoDisplay=true
+X-GNOME-Autostart-Phase=DisplayServer
+X-GNOME-Provides=panel;windowmanager;
+X-GNOME-Autostart-Notify=true
+X-GNOME-AutoRestart=false
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/data/org.gnome.Shell.target b/data/org.gnome.Shell.target
new file mode 100644
index 0000000..55f9539
--- /dev/null
+++ b/data/org.gnome.Shell.target
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME Shell
+DefaultDependencies=no
+
+Requisite=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session-initialized.target
+
+Wants=org.gnome.Shell@wayland.service
+Wants=org.gnome.Shell@x11.service
diff --git a/data/org.gnome.Shell@wayland.service.in b/data/org.gnome.Shell@wayland.service.in
new file mode 100644
index 0000000..692d45b
--- /dev/null
+++ b/data/org.gnome.Shell@wayland.service.in
@@ -0,0 +1,34 @@
+[Unit]
+Description=GNOME Shell on Wayland
+# On wayland, force a session shutdown
+OnFailure=org.gnome.Shell-disable-extensions.service gnome-session-shutdown.target
+OnFailureJobMode=replace-irreversibly
+CollectMode=inactive-or-failed
+RefuseManualStart=on
+RefuseManualStop=on
+
+After=gnome-session-manager.target
+
+Requisite=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session-initialized.target
+
+[Service]
+Slice=session.slice
+Type=notify
+# NOTE: This can be replaced with ConditionEnvironment=XDG_SESSION_TYPE=%I
+# with systemd >= 245. Also, the current solution is kind of painful
+# as systemd had a bug where it retries the condition.
+# Only start if the template instance matches the session type.
+ExecCondition=/bin/sh -c 'test "$XDG_SESSION_TYPE" = "%I" || exit 2'
+ExecStart=@bindir@/gnome-shell
+# Exit code 1 means we are probably *not* dealing with an extension failure
+SuccessExitStatus=1
+
+# unset some environment variables that were set by the shell and won't work now that the shell is gone
+ExecStopPost=-/bin/sh -c 'test "$SERVICE_RESULT" != "exec-condition" && systemctl --user unset-environment GNOME_SETUP_DISPLAY WAYLAND_DISPLAY DISPLAY XAUTHORITY'
+
+# On wayland we cannot restart
+Restart=no
+# Kill any stubborn child processes after this long
+TimeoutStopSec=5
diff --git a/data/org.gnome.Shell@x11.service.in b/data/org.gnome.Shell@x11.service.in
new file mode 100644
index 0000000..a70f249
--- /dev/null
+++ b/data/org.gnome.Shell@x11.service.in
@@ -0,0 +1,39 @@
+[Unit]
+Description=GNOME Shell on X11
+# On X11, try to show the GNOME Session Failed screen
+OnFailure=org.gnome.Shell-disable-extensions.service gnome-session-failed.target
+OnFailureJobMode=replace
+CollectMode=inactive-or-failed
+RefuseManualStart=on
+RefuseManualStop=on
+
+After=gnome-session-manager.target
+
+Requisite=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session-initialized.target
+
+# Limit startup frequency more than the default
+StartLimitIntervalSec=15s
+StartLimitBurst=3
+
+[Service]
+Slice=session.slice
+Type=notify
+# NOTE: This can be replaced with ConditionEnvironment=XDG_SESSION_TYPE=%I
+# with systemd >= 245. Also, the current solution is kind of painful
+# as systemd had a bug where it retries the condition.
+# Only start if the template instance matches the session type.
+ExecCondition=/bin/sh -c 'test "$XDG_SESSION_TYPE" = "%I" || exit 2'
+ExecStart=@bindir@/gnome-shell
+# Exit code 1 means we are probably *not* dealing with an extension failure
+SuccessExitStatus=1
+
+# On X11 we do not need to unset any variables
+
+# On X11 we want to restart on-success (Alt+F2 + r) and on-failure.
+Restart=always
+# Do not wait before restarting the shell
+RestartSec=0ms
+# Kill any stubborn child processes after this long
+TimeoutStopSec=5
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
new file mode 100644
index 0000000..6eacfa5
--- /dev/null
+++ b/data/org.gnome.shell.gschema.xml.in
@@ -0,0 +1,316 @@
+<schemalist>
+ <schema id="org.gnome.shell" path="/org/gnome/shell/"
+ gettext-domain="@GETTEXT_PACKAGE@">
+ <key name="development-tools" type="b">
+ <default>true</default>
+ <summary>
+ Enable internal tools useful for developers and testers from Alt-F2
+ </summary>
+ <description>
+ Allows access to internal debugging and monitoring tools
+ using the Alt-F2 dialog.
+ </description>
+ </key>
+ <key name="enabled-extensions" type="as">
+ <default>[]</default>
+ <summary>UUIDs of extensions to enable</summary>
+ <description>
+ GNOME Shell extensions have a UUID property; this key lists extensions
+ which should be loaded. Any extension that wants to be loaded needs
+ to be in this list. You can also manipulate this list with the
+ EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
+ </description>
+ </key>
+ <key name="disabled-extensions" type="as">
+ <default>[]</default>
+ <summary>UUIDs of extensions to force disabling</summary>
+ <description>
+ GNOME Shell extensions have a UUID property; this key lists extensions
+ which should be disabled, even if loaded as part of the current mode.
+ You can also manipulate this list with the EnableExtension and
+ DisableExtension D-Bus methods on org.gnome.Shell.
+ This key takes precedence over the “enabled-extensions” setting.
+ </description>
+ </key>
+ <key name="disable-user-extensions" type="b">
+ <default>false</default>
+ <summary>Disable user extensions</summary>
+ <description>
+ Disable all extensions the user has enabled without affecting
+ the “enabled-extension” setting.
+ </description>
+ </key>
+ <key name="disable-extension-version-validation" type="b">
+ <default>true</default>
+ <summary>Disables the validation of extension version compatibility</summary>
+ <description>
+ GNOME Shell will only load extensions that claim to support the current
+ running version. Enabling this option will disable this check and try to
+ load all extensions regardless of the versions they claim to support.
+ </description>
+ </key>
+ <key name="favorite-apps" type="as">
+ <default>[ 'org.gnome.Epiphany.desktop', 'org.gnome.Geary.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Photos.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
+ <summary>List of desktop file IDs for favorite applications</summary>
+ <description>
+ The applications corresponding to these identifiers
+ will be displayed in the favorites area.
+ </description>
+ </key>
+ <key name="app-picker-view" type="u">
+ <default>0</default>
+ <summary>App Picker View</summary>
+ <description>
+ Index of the currently selected view in the application picker.
+ </description>
+ </key>
+ <key name="command-history" type="as">
+ <default>[]</default>
+ <summary>History for command (Alt-F2) dialog</summary>
+ </key>
+ <key name="looking-glass-history" type="as">
+ <default>[]</default>
+ <!-- Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass -->
+ <summary>History for the looking glass dialog</summary>
+ </key>
+ <key name="always-show-log-out" type="b">
+ <default>false</default>
+ <summary>Always show the “Log out” menu item in the user menu.</summary>
+ <description>
+ This key overrides the automatic hiding of the “Log out”
+ menu item in single-user, single-session situations.
+ </description>
+ </key>
+ <key name="remember-mount-password" type="b">
+ <default>false</default>
+ <summary>Whether to remember password for mounting encrypted or remote filesystems</summary>
+ <description>
+ The shell will request a password when an encrypted device or a
+ remote filesystem is mounted. If the password can be saved for
+ future use a “Remember Password” checkbox will be present.
+ This key sets the default state of the checkbox.
+ </description>
+ </key>
+ <key name="had-bluetooth-devices-setup" type="b">
+ <default>false</default>
+ <summary>Whether the default Bluetooth adapter had set up devices associated to it</summary>
+ <description>
+ The shell will only show a Bluetooth menu item if a Bluetooth
+ adapter is powered, or if there were devices set up associated
+ with the default adapter. This will be reset if the default
+ adapter is ever seen not to have devices associated to it.
+ </description>
+ </key>
+ <key name="introspect" type="b">
+ <default>false</default>
+ <summary>Enable introspection API</summary>
+ <description>
+ Enables a D-Bus API that allows to introspect the application state of
+ the shell.
+ </description>
+ </key>
+ <key name="app-picker-layout" type="aa{sv}">
+ <default>[]</default>
+ <summary>Layout of the app picker</summary>
+ <description>
+ Layout of the app picker. Each entry in the array is a page. Pages are
+ stored in the order they appear in GNOME Shell. Each page contains an
+ “application id” → 'data' pair. Currently, the following values are
+ stored as 'data':
+ • “position”: the position of the application icon in the page
+ </description>
+ </key>
+ <child name="keybindings" schema="org.gnome.shell.keybindings"/>
+ </schema>
+
+ <schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
+ gettext-domain="@GETTEXT_PACKAGE@">
+ <key name="open-application-menu" type="as">
+ <default>["&lt;Super&gt;F10"]</default>
+ <summary>Keybinding to open the application menu</summary>
+ <description>
+ Keybinding to open the application menu.
+ </description>
+ </key>
+ <key name="toggle-application-view" type="as">
+ <default>["&lt;Super&gt;a"]</default>
+ <summary>Keybinding to open the “Show Applications” view</summary>
+ <description>
+ Keybinding to open the “Show Applications” view of the Activities
+ Overview.
+ </description>
+ </key>
+ <key name="toggle-overview" type="as">
+ <default>["&lt;Super&gt;s"]</default>
+ <summary>Keybinding to open the overview</summary>
+ <description>
+ Keybinding to open the Activities Overview.
+ </description>
+ </key>
+ <key name="toggle-message-tray" type="as">
+ <default>["&lt;Super&gt;v","&lt;Super&gt;m"]</default>
+ <summary>Keybinding to toggle the visibility of the notification list</summary>
+ <description>
+ Keybinding to toggle the visibility of the notification list.
+ </description>
+ </key>
+ <key name="focus-active-notification" type="as">
+ <default>["&lt;Super&gt;n"]</default>
+ <summary>Keybinding to focus the active notification</summary>
+ <description>
+ Keybinding to focus the active notification.
+ </description>
+ </key>
+ <key name="switch-to-application-1" type="as">
+ <default>["&lt;Super&gt;1"]</default>
+ <summary>Switch to application 1</summary>
+ </key>
+ <key name="switch-to-application-2" type="as">
+ <default>["&lt;Super&gt;2"]</default>
+ <summary>Switch to application 2</summary>
+ </key>
+ <key name="switch-to-application-3" type="as">
+ <default>["&lt;Super&gt;3"]</default>
+ <summary>Switch to application 3</summary>
+ </key>
+ <key name="switch-to-application-4" type="as">
+ <default>["&lt;Super&gt;4"]</default>
+ <summary>Switch to application 4</summary>
+ </key>
+ <key name="switch-to-application-5" type="as">
+ <default>["&lt;Super&gt;5"]</default>
+ <summary>Switch to application 5</summary>
+ </key>
+ <key name="switch-to-application-6" type="as">
+ <default>["&lt;Super&gt;6"]</default>
+ <summary>Switch to application 6</summary>
+ </key>
+ <key name="switch-to-application-7" type="as">
+ <default>["&lt;Super&gt;7"]</default>
+ <summary>Switch to application 7</summary>
+ </key>
+ <key name="switch-to-application-8" type="as">
+ <default>["&lt;Super&gt;8"]</default>
+ <summary>Switch to application 8</summary>
+ </key>
+ <key name="switch-to-application-9" type="as">
+ <default>["&lt;Super&gt;9"]</default>
+ <summary>Switch to application 9</summary>
+ </key>
+ </schema>
+
+ <schema id="org.gnome.shell.app-switcher"
+ path="/org/gnome/shell/app-switcher/"
+ gettext-domain="@GETTEXT_PACKAGE@">
+ <key type="b" name="current-workspace-only">
+ <default>false</default>
+ <summary>Limit switcher to current workspace.</summary>
+ <description>
+ If true, only applications that have windows on the current workspace are shown in the switcher.
+ Otherwise, all applications are included.
+ </description>
+ </key>
+ </schema>
+
+ <enum id="org.gnome.shell.window-switcher.AppIconMode">
+ <value value="1" nick="thumbnail-only"/>
+ <value value="2" nick="app-icon-only"/>
+ <value value="3" nick="both"/>
+ </enum>
+ <schema id="org.gnome.shell.window-switcher"
+ path="/org/gnome/shell/window-switcher/"
+ gettext-domain="@GETTEXT_PACKAGE@">
+ <key name="app-icon-mode" enum="org.gnome.shell.window-switcher.AppIconMode">
+ <default>'both'</default>
+ <summary>The application icon mode.</summary>
+ <description>
+ Configures how the windows are shown in the switcher. Valid possibilities
+ are “thumbnail-only” (shows a thumbnail of the window), “app-icon-only”
+ (shows only the application icon) or “both”.
+ </description>
+ </key>
+ <key type="b" name="current-workspace-only">
+ <default>true</default>
+ <summary>Limit switcher to current workspace.</summary>
+ <description>
+ If true, only windows from the current workspace are shown in the switcher.
+ Otherwise, all windows are included.
+ </description>
+ </key>
+ </schema>
+
+ <schema id="org.gnome.shell.world-clocks" path="/org/gnome/shell/world-clocks/"
+ gettext-domain="@GETTEXT_PACKAGE@">
+ <key name="locations" type="av">
+ <summary>Locations</summary>
+ <description>
+ The locations to show in world clocks
+ </description>
+ <default>[]</default>
+ </key>
+ </schema>
+
+ <schema id="org.gnome.shell.weather" path="/org/gnome/shell/weather/"
+ gettext-domain="@GETTEXT_PACKAGE@">
+ <key name="automatic-location" type="b">
+ <summary>Automatic location</summary>
+ <description>
+ Whether to fetch the current location or not
+ </description>
+ <default>false</default>
+ </key>
+
+ <key name="locations" type="av">
+ <summary>Location</summary>
+ <description>
+ The location for which to show a forecast
+ </description>
+ <default>[]</default>
+ </key>
+ </schema>
+
+ <!-- unused, change 00_org.gnome.shell.gschema.override instead -->
+ <schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/"
+ gettext-domain="@GETTEXT_PACKAGE@">
+ <key name="attach-modal-dialogs" type="b">
+ <default>true</default>
+ <summary>Attach modal dialog to the parent window</summary>
+ <description>
+ This key overrides the key in org.gnome.mutter when running
+ GNOME Shell.
+ </description>
+ </key>
+
+ <key name="edge-tiling" type="b">
+ <default>true</default>
+ <summary>Enable edge tiling when dropping windows on screen edges</summary>
+ <description>
+ This key overrides the key in org.gnome.mutter when running GNOME Shell.
+ </description>
+ </key>
+
+ <key name="dynamic-workspaces" type="b">
+ <default>true</default>
+ <summary>Workspaces are managed dynamically</summary>
+ <description>
+ This key overrides the key in org.gnome.mutter when running GNOME Shell.
+ </description>
+ </key>
+
+ <key name="workspaces-only-on-primary" type="b">
+ <default>true</default>
+ <summary>Workspaces only on primary monitor</summary>
+ <description>
+ This key overrides the key in org.gnome.mutter when running GNOME Shell.
+ </description>
+ </key>
+
+ <key name="focus-change-on-pointer-rest" type="b">
+ <default>true</default>
+ <summary>Delay focus changes in mouse mode until the pointer stops moving</summary>
+ <description>
+ This key overrides the key in org.gnome.mutter when running GNOME Shell.
+ </description>
+ </key>
+ </schema>
+</schemalist>
diff --git a/data/osk-layouts/am.json b/data/osk-layouts/am.json
new file mode 100644
index 0000000..23c86ba
--- /dev/null
+++ b/data/osk-layouts/am.json
@@ -0,0 +1,599 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "է"
+ ],
+ [
+ "թ"
+ ],
+ [
+ "փ"
+ ],
+ [
+ "ձ"
+ ],
+ [
+ "ջ"
+ ],
+ [
+ "ր"
+ ],
+ [
+ "չ"
+ ],
+ [
+ "ճ"
+ ],
+ [
+ "ժ"
+ ],
+ [
+ "ծ"
+ ]
+ ],
+ [
+ [
+ "ք"
+ ],
+ [
+ "ո"
+ ],
+ [
+ "ե",
+ "և"
+ ],
+ [
+ "ռ"
+ ],
+ [
+ "տ"
+ ],
+ [
+ "ը"
+ ],
+ [
+ "ւ"
+ ],
+ [
+ "ի"
+ ],
+ [
+ "օ"
+ ],
+ [
+ "պ"
+ ]
+ ],
+ [
+ [
+ "ա"
+ ],
+ [
+ "ս"
+ ],
+ [
+ "դ"
+ ],
+ [
+ "ֆ"
+ ],
+ [
+ "գ"
+ ],
+ [
+ "հ"
+ ],
+ [
+ "յ"
+ ],
+ [
+ "կ"
+ ],
+ [
+ "լ"
+ ],
+ [
+ "խ"
+ ]
+ ],
+ [
+ [
+ "զ"
+ ],
+ [
+ "ղ"
+ ],
+ [
+ "ց"
+ ],
+ [
+ "վ"
+ ],
+ [
+ "բ"
+ ],
+ [
+ "ն"
+ ],
+ [
+ "մ"
+ ],
+ [
+ "շ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ "։"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Է"
+ ],
+ [
+ "Թ"
+ ],
+ [
+ "Փ"
+ ],
+ [
+ "Ձ"
+ ],
+ [
+ "Ջ"
+ ],
+ [
+ "Ր"
+ ],
+ [
+ "Չ"
+ ],
+ [
+ "Ճ"
+ ],
+ [
+ "Ժ"
+ ],
+ [
+ "Ծ"
+ ]
+ ],
+ [
+ [
+ "Ք"
+ ],
+ [
+ "Ո"
+ ],
+ [
+ "Ե",
+ "ԵՒ"
+ ],
+ [
+ "Ռ"
+ ],
+ [
+ "Տ"
+ ],
+ [
+ "Ը"
+ ],
+ [
+ "Ւ"
+ ],
+ [
+ "Ի"
+ ],
+ [
+ "Օ"
+ ],
+ [
+ "Պ"
+ ]
+ ],
+ [
+ [
+ "Ա"
+ ],
+ [
+ "Ս"
+ ],
+ [
+ "Դ"
+ ],
+ [
+ "Ֆ"
+ ],
+ [
+ "Գ"
+ ],
+ [
+ "Հ"
+ ],
+ [
+ "Յ"
+ ],
+ [
+ "Կ"
+ ],
+ [
+ "Լ"
+ ],
+ [
+ "Խ"
+ ]
+ ],
+ [
+ [
+ "Զ"
+ ],
+ [
+ "Ղ"
+ ],
+ [
+ "Ց"
+ ],
+ [
+ "Վ"
+ ],
+ [
+ "Բ"
+ ],
+ [
+ "Ն"
+ ],
+ [
+ "Մ"
+ ],
+ [
+ "Շ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ "։"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "՜",
+ "¡"
+ ],
+ [
+ "?",
+ "՞",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ "՝"
+ ],
+ [
+ "։",
+ "!",
+ "?",
+ ",",
+ ".",
+ "֊",
+ "՜",
+ "՝",
+ "՞",
+ ":",
+ ";",
+ "@",
+ "ՙ",
+ "՚",
+ "՛",
+ "՟"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ "՝"
+ ],
+ [
+ "։",
+ "!",
+ "?",
+ ",",
+ ".",
+ "֊",
+ "՜",
+ "՝",
+ "՞",
+ ":",
+ ";",
+ "@",
+ "ՙ",
+ "՚",
+ "՛",
+ "՟"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "hy",
+ "name": "Armenian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/ara.json b/data/osk-layouts/ara.json
new file mode 100644
index 0000000..0a4900c
--- /dev/null
+++ b/data/osk-layouts/ara.json
@@ -0,0 +1,488 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "ض"
+ ],
+ [
+ "ص"
+ ],
+ [
+ "ث"
+ ],
+ [
+ "ق",
+ "ڨ"
+ ],
+ [
+ "ف",
+ "ڤ",
+ "ڢ",
+ "ڥ"
+ ],
+ [
+ "غ"
+ ],
+ [
+ "ع"
+ ],
+ [
+ "ه",
+ "ه‍"
+ ],
+ [
+ "خ"
+ ],
+ [
+ "ح"
+ ],
+ [
+ "ج",
+ "چ"
+ ]
+ ],
+ [
+ [
+ "ش",
+ "ڜ"
+ ],
+ [
+ "س"
+ ],
+ [
+ "ي",
+ "ئ",
+ "ى"
+ ],
+ [
+ "ب",
+ "پ"
+ ],
+ [
+ "ل",
+ "لا",
+ "لأ",
+ "لإ",
+ "لآ"
+ ],
+ [
+ "ا",
+ "آ",
+ "ء",
+ "أ",
+ "إ",
+ "ٱ"
+ ],
+ [
+ "ت"
+ ],
+ [
+ "ن"
+ ],
+ [
+ "م"
+ ],
+ [
+ "ك",
+ "گ",
+ "ک"
+ ],
+ [
+ "ط"
+ ]
+ ],
+ [
+ [
+ "ذ"
+ ],
+ [
+ "ء"
+ ],
+ [
+ "ؤ"
+ ],
+ [
+ "ر"
+ ],
+ [
+ "ى",
+ "ئ"
+ ],
+ [
+ "ة"
+ ],
+ [
+ "و"
+ ],
+ [
+ "ز",
+ "ژ"
+ ],
+ [
+ "ظ"
+ ],
+ [
+ "د"
+ ]
+ ],
+ [
+ [
+ "،"
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "\"",
+ "'",
+ "#",
+ "-",
+ ":",
+ "!",
+ "،",
+ "؟",
+ "@",
+ "&",
+ "%",
+ "+",
+ "؛",
+ "/",
+ ")",
+ "("
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "١",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "٢",
+ "²",
+ "⅔"
+ ],
+ [
+ "٣",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "٤",
+ "⁴"
+ ],
+ [
+ "٥",
+ "⅝"
+ ],
+ [
+ "٦"
+ ],
+ [
+ "٧",
+ "⅞"
+ ],
+ [
+ "٨"
+ ],
+ [
+ "٩"
+ ],
+ [
+ "٠",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "٪",
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "﴿",
+ ">",
+ "}",
+ "]"
+ ],
+ [
+ ")",
+ "﴾",
+ "<",
+ "{",
+ "["
+ ]
+ ],
+ [
+ [
+ "*",
+ "★",
+ "٭"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ "؛",
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "؟",
+ "?"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ "،",
+ "؟",
+ "؛",
+ "!",
+ ":",
+ "-",
+ "/",
+ "'",
+ "\""
+ ],
+ [
+ ".",
+ "ٕ",
+ "ٔ",
+ "ْ",
+ "ٍ",
+ "ٌ",
+ "ً",
+ "ّ",
+ "ٖ",
+ "ٰ",
+ "ٓ",
+ "ِ",
+ "ُ",
+ "َ",
+ "ـ"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ ">",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ " "
+ ],
+ [
+ "،",
+ "؟",
+ "؛",
+ "!",
+ ":",
+ "-",
+ "/",
+ "'",
+ "\""
+ ],
+ [
+ ".",
+ "ٕ",
+ "ٔ",
+ "ْ",
+ "ٍ",
+ "ٌ",
+ "ً",
+ "ّ",
+ "ٖ",
+ "ٰ",
+ "ٓ",
+ "ِ",
+ "ُ",
+ "َ",
+ "ـ"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "ar",
+ "name": "Arabic"
+} \ No newline at end of file
diff --git a/data/osk-layouts/be.json b/data/osk-layouts/be.json
new file mode 100644
index 0000000..2427916
--- /dev/null
+++ b/data/osk-layouts/be.json
@@ -0,0 +1,584 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "ë",
+ "ê",
+ "è",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "ij"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "û",
+ "ù",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ï",
+ "ì",
+ "î",
+ "į",
+ "ī",
+ "ij"
+ ],
+ [
+ "o",
+ "ó",
+ "ö",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "ä",
+ "â",
+ "à",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "Ë",
+ "Ê",
+ "È",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "IJ"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Û",
+ "Ù",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ï",
+ "Ì",
+ "Î",
+ "Į",
+ "Ī",
+ "IJ"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ö",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "Ä",
+ "Â",
+ "À",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "nl-BE",
+ "name": "Dutch (Belgium)"
+} \ No newline at end of file
diff --git a/data/osk-layouts/bg.json b/data/osk-layouts/bg.json
new file mode 100644
index 0000000..5c8528f
--- /dev/null
+++ b/data/osk-layouts/bg.json
@@ -0,0 +1,533 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "я"
+ ],
+ [
+ "в"
+ ],
+ [
+ "е"
+ ],
+ [
+ "р"
+ ],
+ [
+ "т"
+ ],
+ [
+ "ъ"
+ ],
+ [
+ "у"
+ ],
+ [
+ "и",
+ "ѝ"
+ ],
+ [
+ "о"
+ ],
+ [
+ "п"
+ ],
+ [
+ "ч"
+ ]
+ ],
+ [
+ [
+ "а"
+ ],
+ [
+ "с"
+ ],
+ [
+ "д"
+ ],
+ [
+ "ф"
+ ],
+ [
+ "г"
+ ],
+ [
+ "х"
+ ],
+ [
+ "й"
+ ],
+ [
+ "к"
+ ],
+ [
+ "л"
+ ],
+ [
+ "ш"
+ ],
+ [
+ "щ"
+ ]
+ ],
+ [
+ [
+ "з"
+ ],
+ [
+ "ь"
+ ],
+ [
+ "ц"
+ ],
+ [
+ "ж"
+ ],
+ [
+ "б"
+ ],
+ [
+ "н"
+ ],
+ [
+ "м"
+ ],
+ [
+ "ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Я"
+ ],
+ [
+ "В"
+ ],
+ [
+ "Е"
+ ],
+ [
+ "Р"
+ ],
+ [
+ "Т"
+ ],
+ [
+ "Ъ"
+ ],
+ [
+ "У"
+ ],
+ [
+ "И",
+ "Ѝ"
+ ],
+ [
+ "О"
+ ],
+ [
+ "П"
+ ],
+ [
+ "Ч"
+ ]
+ ],
+ [
+ [
+ "А"
+ ],
+ [
+ "С"
+ ],
+ [
+ "Д"
+ ],
+ [
+ "Ф"
+ ],
+ [
+ "Г"
+ ],
+ [
+ "Х"
+ ],
+ [
+ "Й"
+ ],
+ [
+ "К"
+ ],
+ [
+ "Л"
+ ],
+ [
+ "Ш"
+ ],
+ [
+ "Щ"
+ ]
+ ],
+ [
+ [
+ "З"
+ ],
+ [
+ "Ь"
+ ],
+ [
+ "Ц"
+ ],
+ [
+ "Ж"
+ ],
+ [
+ "Б"
+ ],
+ [
+ "Н"
+ ],
+ [
+ "М"
+ ],
+ [
+ "Ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "bg",
+ "name": "Bulgarian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/by.json b/data/osk-layouts/by.json
new file mode 100644
index 0000000..1f98cd2
--- /dev/null
+++ b/data/osk-layouts/by.json
@@ -0,0 +1,541 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "й"
+ ],
+ [
+ "ц"
+ ],
+ [
+ "у"
+ ],
+ [
+ "к"
+ ],
+ [
+ "е",
+ "ё"
+ ],
+ [
+ "н"
+ ],
+ [
+ "г"
+ ],
+ [
+ "ш"
+ ],
+ [
+ "ў"
+ ],
+ [
+ "з"
+ ],
+ [
+ "х"
+ ]
+ ],
+ [
+ [
+ "ф"
+ ],
+ [
+ "ы"
+ ],
+ [
+ "в"
+ ],
+ [
+ "а"
+ ],
+ [
+ "п"
+ ],
+ [
+ "р"
+ ],
+ [
+ "о"
+ ],
+ [
+ "л"
+ ],
+ [
+ "д"
+ ],
+ [
+ "ж"
+ ],
+ [
+ "э"
+ ]
+ ],
+ [
+ [
+ "я"
+ ],
+ [
+ "ч"
+ ],
+ [
+ "с"
+ ],
+ [
+ "м"
+ ],
+ [
+ "і"
+ ],
+ [
+ "т"
+ ],
+ [
+ "ь",
+ "ъ"
+ ],
+ [
+ "б"
+ ],
+ [
+ "ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Й"
+ ],
+ [
+ "Ц"
+ ],
+ [
+ "У"
+ ],
+ [
+ "К"
+ ],
+ [
+ "Е",
+ "Ё"
+ ],
+ [
+ "Н"
+ ],
+ [
+ "Г"
+ ],
+ [
+ "Ш"
+ ],
+ [
+ "Ў"
+ ],
+ [
+ "З"
+ ],
+ [
+ "Х"
+ ]
+ ],
+ [
+ [
+ "Ф"
+ ],
+ [
+ "Ы"
+ ],
+ [
+ "В"
+ ],
+ [
+ "А"
+ ],
+ [
+ "П"
+ ],
+ [
+ "Р"
+ ],
+ [
+ "О"
+ ],
+ [
+ "Л"
+ ],
+ [
+ "Д"
+ ],
+ [
+ "Ж"
+ ],
+ [
+ "Э"
+ ]
+ ],
+ [
+ [
+ "Я"
+ ],
+ [
+ "Ч"
+ ],
+ [
+ "С"
+ ],
+ [
+ "М"
+ ],
+ [
+ "І"
+ ],
+ [
+ "Т"
+ ],
+ [
+ "Ь",
+ "Ъ"
+ ],
+ [
+ "Б"
+ ],
+ [
+ "Ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "be",
+ "name": "Belarusian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/ca.json b/data/osk-layouts/ca.json
new file mode 100644
index 0000000..2b2bedc
--- /dev/null
+++ b/data/osk-layouts/ca.json
@@ -0,0 +1,599 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ê",
+ "ë",
+ "%",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "%",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ù",
+ "û",
+ "%",
+ "ü",
+ "ú",
+ "ū"
+ ],
+ [
+ "i",
+ "î",
+ "%",
+ "ï",
+ "ì",
+ "í",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ô",
+ "œ",
+ "%",
+ "ö",
+ "ò",
+ "ó",
+ "õ",
+ "ø",
+ "ō",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "à",
+ "â",
+ "%",
+ "æ",
+ "á",
+ "ä",
+ "ã",
+ "å",
+ "ā",
+ "ª"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "ć",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ê",
+ "Ë",
+ "%",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "%",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ù",
+ "Û",
+ "%",
+ "Ü",
+ "Ú",
+ "Ū"
+ ],
+ [
+ "I",
+ "Î",
+ "%",
+ "Ï",
+ "Ì",
+ "Í",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ô",
+ "Œ",
+ "%",
+ "Ö",
+ "Ò",
+ "Ó",
+ "Õ",
+ "Ø",
+ "Ō",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "À",
+ "Â",
+ "%",
+ "Æ",
+ "Á",
+ "Ä",
+ "Ã",
+ "Å",
+ "Ā",
+ "ª"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Ć",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "fr-CA",
+ "name": "French Canada"
+} \ No newline at end of file
diff --git a/data/osk-layouts/cz.json b/data/osk-layouts/cz.json
new file mode 100644
index 0000000..9bad074
--- /dev/null
+++ b/data/osk-layouts/cz.json
@@ -0,0 +1,613 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "ě",
+ "è",
+ "ê",
+ "ë",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r",
+ "ř"
+ ],
+ [
+ "t",
+ "ť"
+ ],
+ [
+ "z",
+ "ž",
+ "ź",
+ "ż"
+ ],
+ [
+ "u",
+ "ú",
+ "ů",
+ "û",
+ "ü",
+ "ù",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "î",
+ "ï",
+ "ì",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ó",
+ "ö",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "à",
+ "â",
+ "ä",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s",
+ "š",
+ "ß",
+ "ś"
+ ],
+ [
+ "d",
+ "ď"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "y",
+ "ý",
+ "ÿ"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "č",
+ "ç",
+ "ć"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ň",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "Ě",
+ "È",
+ "Ê",
+ "Ë",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R",
+ "Ř"
+ ],
+ [
+ "T",
+ "Ť"
+ ],
+ [
+ "Z",
+ "Ž",
+ "Ź",
+ "Ż"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ů",
+ "Û",
+ "Ü",
+ "Ù",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Î",
+ "Ï",
+ "Ì",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ö",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "À",
+ "Â",
+ "Ä",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S",
+ "Š",
+ "SS",
+ "Ś"
+ ],
+ [
+ "D",
+ "Ď"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Y",
+ "Ý",
+ "Ÿ"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Č",
+ "Ç",
+ "Ć"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ň",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "cs",
+ "name": "Czech"
+} \ No newline at end of file
diff --git a/data/osk-layouts/de.json b/data/osk-layouts/de.json
new file mode 100644
index 0000000..751a856
--- /dev/null
+++ b/data/osk-layouts/de.json
@@ -0,0 +1,570 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ê",
+ "ë",
+ "ė"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "z"
+ ],
+ [
+ "u",
+ "ü",
+ "û",
+ "ù",
+ "ú",
+ "ū"
+ ],
+ [
+ "i"
+ ],
+ [
+ "o",
+ "ö",
+ "ô",
+ "ò",
+ "ó",
+ "õ",
+ "œ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "ä",
+ "â",
+ "à",
+ "á",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s",
+ "ß",
+ "ś",
+ "š"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "y"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ê",
+ "Ë",
+ "Ė"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Z"
+ ],
+ [
+ "U",
+ "Ü",
+ "Û",
+ "Ù",
+ "Ú",
+ "Ū"
+ ],
+ [
+ "I"
+ ],
+ [
+ "O",
+ "Ö",
+ "Ô",
+ "Ò",
+ "Ó",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Ä",
+ "Â",
+ "À",
+ "Á",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S",
+ "SS",
+ "Ś",
+ "Š"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Y"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "de",
+ "name": "German"
+} \ No newline at end of file
diff --git a/data/osk-layouts/dk.json b/data/osk-layouts/dk.json
new file mode 100644
index 0000000..80df9ae
--- /dev/null
+++ b/data/osk-layouts/dk.json
@@ -0,0 +1,590 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "ë"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "ý",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "û",
+ "ù",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ï"
+ ],
+ [
+ "o",
+ "ó",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ō"
+ ],
+ [
+ "p"
+ ],
+ [
+ "å"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "ä",
+ "à",
+ "â",
+ "ã",
+ "ā"
+ ],
+ [
+ "s",
+ "ß",
+ "ś",
+ "š"
+ ],
+ [
+ "d",
+ "ð"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l",
+ "ł"
+ ],
+ [
+ "æ",
+ "ä"
+ ],
+ [
+ "ø",
+ "ö"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "Ë"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Û",
+ "Ù",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ï"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ō"
+ ],
+ [
+ "P"
+ ],
+ [
+ "Å"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "Ä",
+ "À",
+ "Â",
+ "Ã",
+ "Ā"
+ ],
+ [
+ "S",
+ "SS",
+ "Ś",
+ "Š"
+ ],
+ [
+ "D",
+ "Ð"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L",
+ "Ł"
+ ],
+ [
+ "Æ",
+ "Ä"
+ ],
+ [
+ "Ø",
+ "Ö"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "da",
+ "name": "Danish"
+} \ No newline at end of file
diff --git a/data/osk-layouts/ee.json b/data/osk-layouts/ee.json
new file mode 100644
index 0000000..5fd2f11
--- /dev/null
+++ b/data/osk-layouts/ee.json
@@ -0,0 +1,666 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "ē",
+ "è",
+ "ė",
+ "é",
+ "ê",
+ "ë",
+ "ę",
+ "ě"
+ ],
+ [
+ "r",
+ "ŗ",
+ "ř",
+ "ŕ"
+ ],
+ [
+ "t",
+ "ţ",
+ "ť"
+ ],
+ [
+ "y",
+ "ý",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ü",
+ "ū",
+ "ų",
+ "ù",
+ "ú",
+ "û",
+ "ů",
+ "ű"
+ ],
+ [
+ "i",
+ "ī",
+ "ì",
+ "į",
+ "í",
+ "î",
+ "ï",
+ "ı"
+ ],
+ [
+ "o",
+ "ö",
+ "õ",
+ "ò",
+ "ó",
+ "ô",
+ "œ",
+ "ő",
+ "ø"
+ ],
+ [
+ "p"
+ ],
+ [
+ "ü"
+ ]
+ ],
+ [
+ [
+ "a",
+ "ä",
+ "ā",
+ "à",
+ "á",
+ "â",
+ "ã",
+ "å",
+ "æ",
+ "ą"
+ ],
+ [
+ "s",
+ "š",
+ "ß",
+ "ś",
+ "ş"
+ ],
+ [
+ "d",
+ "ď"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g",
+ "ģ",
+ "ğ"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k",
+ "ķ"
+ ],
+ [
+ "l",
+ "ļ",
+ "ł",
+ "ĺ",
+ "ľ"
+ ],
+ [
+ "ö",
+ "õ"
+ ],
+ [
+ "ä"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ž",
+ "ż",
+ "ź"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "č",
+ "ç",
+ "ć"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ņ",
+ "ñ",
+ "ń",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "Ē",
+ "È",
+ "Ė",
+ "É",
+ "Ê",
+ "Ë",
+ "Ę",
+ "Ě"
+ ],
+ [
+ "R",
+ "Ŗ",
+ "Ř",
+ "Ŕ"
+ ],
+ [
+ "T",
+ "Ţ",
+ "Ť"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ü",
+ "Ū",
+ "Ų",
+ "Ù",
+ "Ú",
+ "Û",
+ "Ů",
+ "Ű"
+ ],
+ [
+ "I",
+ "Ī",
+ "Ì",
+ "Į",
+ "Í",
+ "Î",
+ "Ï",
+ "I"
+ ],
+ [
+ "O",
+ "Ö",
+ "Õ",
+ "Ò",
+ "Ó",
+ "Ô",
+ "Œ",
+ "Ő",
+ "Ø"
+ ],
+ [
+ "P"
+ ],
+ [
+ "Ü"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Ä",
+ "Ā",
+ "À",
+ "Á",
+ "Â",
+ "Ã",
+ "Å",
+ "Æ",
+ "Ą"
+ ],
+ [
+ "S",
+ "Š",
+ "SS",
+ "Ś",
+ "Ş"
+ ],
+ [
+ "D",
+ "Ď"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G",
+ "Ģ",
+ "Ğ"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K",
+ "Ķ"
+ ],
+ [
+ "L",
+ "Ļ",
+ "Ł",
+ "Ĺ",
+ "Ľ"
+ ],
+ [
+ "Ö",
+ "Õ"
+ ],
+ [
+ "Ä"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ž",
+ "Ż",
+ "Ź"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Č",
+ "Ç",
+ "Ć"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ņ",
+ "Ñ",
+ "Ń",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "et",
+ "name": "Estonian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/epo.json b/data/osk-layouts/epo.json
new file mode 100644
index 0000000..71f9ef8
--- /dev/null
+++ b/data/osk-layouts/epo.json
@@ -0,0 +1,711 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "ŝ",
+ "q"
+ ],
+ [
+ "ĝ",
+ "w",
+ "ŵ"
+ ],
+ [
+ "e",
+ "é",
+ "ě",
+ "è",
+ "ê",
+ "ë",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r",
+ "ř",
+ "ŕ",
+ "ŗ"
+ ],
+ [
+ "t",
+ "ť",
+ "ț",
+ "ţ",
+ "ŧ"
+ ],
+ [
+ "ŭ",
+ "y",
+ "ý",
+ "ŷ",
+ "ÿ",
+ "þ"
+ ],
+ [
+ "u",
+ "ú",
+ "ů",
+ "û",
+ "ü",
+ "ù",
+ "ū",
+ "ũ",
+ "ű",
+ "ų",
+ "µ"
+ ],
+ [
+ "i",
+ "í",
+ "î",
+ "ï",
+ "ĩ",
+ "ì",
+ "į",
+ "ī",
+ "ı",
+ "ij"
+ ],
+ [
+ "o",
+ "ó",
+ "ö",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ø",
+ "ō",
+ "ő",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "à",
+ "â",
+ "ä",
+ "æ",
+ "ã",
+ "å",
+ "ā",
+ "ă",
+ "ą",
+ "ª"
+ ],
+ [
+ "s",
+ "ß",
+ "š",
+ "ś",
+ "ș",
+ "ş"
+ ],
+ [
+ "d",
+ "ð",
+ "ď",
+ "đ"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g",
+ "ğ",
+ "ġ",
+ "ģ"
+ ],
+ [
+ "h",
+ "ĥ",
+ "ħ"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k",
+ "ķ",
+ "ĸ"
+ ],
+ [
+ "l",
+ "ĺ",
+ "ļ",
+ "ľ",
+ "ŀ",
+ "ł"
+ ],
+ [
+ "ĵ"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ź",
+ "ż",
+ "ž"
+ ],
+ [
+ "ĉ",
+ "x"
+ ],
+ [
+ "c",
+ "ć",
+ "č",
+ "ç",
+ "ċ"
+ ],
+ [
+ "v",
+ "w",
+ "ŵ"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń",
+ "ņ",
+ "ň",
+ "ʼn",
+ "ŋ"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Ŝ",
+ "Q"
+ ],
+ [
+ "Ĝ",
+ "W",
+ "Ŵ"
+ ],
+ [
+ "E",
+ "É",
+ "Ě",
+ "È",
+ "Ê",
+ "Ë",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R",
+ "Ř",
+ "Ŕ",
+ "Ŗ"
+ ],
+ [
+ "T",
+ "Ť",
+ "Ț",
+ "Ţ",
+ "Ŧ"
+ ],
+ [
+ "Ŭ",
+ "Y",
+ "Ý",
+ "Ŷ",
+ "Ÿ",
+ "Þ"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ů",
+ "Û",
+ "Ü",
+ "Ù",
+ "Ū",
+ "Ũ",
+ "Ű",
+ "Ų",
+ "Μ"
+ ],
+ [
+ "I",
+ "Í",
+ "Î",
+ "Ï",
+ "Ĩ",
+ "Ì",
+ "Į",
+ "Ī",
+ "I",
+ "IJ"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ö",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō",
+ "Ő",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "À",
+ "Â",
+ "Ä",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā",
+ "Ă",
+ "Ą",
+ "ª"
+ ],
+ [
+ "S",
+ "SS",
+ "Š",
+ "Ś",
+ "Ș",
+ "Ş"
+ ],
+ [
+ "D",
+ "Ð",
+ "Ď",
+ "Đ"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G",
+ "Ğ",
+ "Ġ",
+ "Ģ"
+ ],
+ [
+ "H",
+ "Ĥ",
+ "Ħ"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K",
+ "Ķ",
+ "ĸ"
+ ],
+ [
+ "L",
+ "Ĺ",
+ "Ļ",
+ "Ľ",
+ "Ŀ",
+ "Ł"
+ ],
+ [
+ "Ĵ"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ź",
+ "Ż",
+ "Ž"
+ ],
+ [
+ "Ĉ",
+ "X"
+ ],
+ [
+ "C",
+ "Ć",
+ "Č",
+ "Ç",
+ "Ċ"
+ ],
+ [
+ "V",
+ "W",
+ "Ŵ"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń",
+ "Ņ",
+ "Ň",
+ "ʼN",
+ "Ŋ"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "eo",
+ "name": "Esperanto"
+} \ No newline at end of file
diff --git a/data/osk-layouts/es+cat.json b/data/osk-layouts/es+cat.json
new file mode 100644
index 0000000..d0bd125
--- /dev/null
+++ b/data/osk-layouts/es+cat.json
@@ -0,0 +1,602 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "è",
+ "é",
+ "ë",
+ "ê",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "ù",
+ "û",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ï",
+ "ì",
+ "î",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ò",
+ "ó",
+ "ö",
+ "ô",
+ "õ",
+ "ø",
+ "œ",
+ "ō",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "à",
+ "á",
+ "ä",
+ "â",
+ "ã",
+ "å",
+ "ą",
+ "æ",
+ "ā",
+ "ª"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l",
+ "l·l",
+ "ł"
+ ],
+ [
+ "ç"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "ć",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "·",
+ "!",
+ ",",
+ "?",
+ ":",
+ ";",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "È",
+ "É",
+ "Ë",
+ "Ê",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Ù",
+ "Û",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ï",
+ "Ì",
+ "Î",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ò",
+ "Ó",
+ "Ö",
+ "Ô",
+ "Õ",
+ "Ø",
+ "Œ",
+ "Ō",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "À",
+ "Á",
+ "Ä",
+ "Â",
+ "Ã",
+ "Å",
+ "Ą",
+ "Æ",
+ "Ā",
+ "ª"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L",
+ "L·L",
+ "Ł"
+ ],
+ [
+ "Ç"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Ć",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "·",
+ "!",
+ ",",
+ "?",
+ ":",
+ ";",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "?",
+ "·"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "?",
+ "·"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "ca",
+ "name": "Catalan"
+} \ No newline at end of file
diff --git a/data/osk-layouts/es.json b/data/osk-layouts/es.json
new file mode 100644
index 0000000..0bb5d72
--- /dev/null
+++ b/data/osk-layouts/es.json
@@ -0,0 +1,604 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ë",
+ "ê",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "ù",
+ "û",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ï",
+ "ì",
+ "î",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ó",
+ "ò",
+ "ö",
+ "ô",
+ "õ",
+ "ø",
+ "œ",
+ "ō",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "à",
+ "ä",
+ "â",
+ "ã",
+ "å",
+ "ą",
+ "æ",
+ "ā",
+ "ª"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ],
+ [
+ "ñ"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "ć",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ ";",
+ "!",
+ ",",
+ "?",
+ ":",
+ "¡",
+ "@",
+ "¿"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ë",
+ "Ê",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Ù",
+ "Û",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ï",
+ "Ì",
+ "Î",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ò",
+ "Ö",
+ "Ô",
+ "Õ",
+ "Ø",
+ "Œ",
+ "Ō",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "À",
+ "Ä",
+ "Â",
+ "Ã",
+ "Å",
+ "Ą",
+ "Æ",
+ "Ā",
+ "ª"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ],
+ [
+ "Ñ"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Ć",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ ";",
+ "!",
+ ",",
+ "?",
+ ":",
+ "¡",
+ "@",
+ "¿"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ",",
+ "!",
+ "¡"
+ ],
+ [
+ ".",
+ "?",
+ "¿"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ",",
+ "!",
+ "¡"
+ ],
+ [
+ ".",
+ "?",
+ "¿"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "es",
+ "name": "Spanish"
+} \ No newline at end of file
diff --git a/data/osk-layouts/fi.json b/data/osk-layouts/fi.json
new file mode 100644
index 0000000..3ba5b56
--- /dev/null
+++ b/data/osk-layouts/fi.json
@@ -0,0 +1,570 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "ü"
+ ],
+ [
+ "i"
+ ],
+ [
+ "o",
+ "ø",
+ "ô",
+ "ò",
+ "ó",
+ "õ",
+ "œ",
+ "ō"
+ ],
+ [
+ "p"
+ ],
+ [
+ "å"
+ ]
+ ],
+ [
+ [
+ "a",
+ "æ",
+ "à",
+ "á",
+ "â",
+ "ã",
+ "ā"
+ ],
+ [
+ "s",
+ "š",
+ "ß",
+ "ś"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ],
+ [
+ "ö",
+ "ø"
+ ],
+ [
+ "ä",
+ "æ"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ž",
+ "ź",
+ "ż"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Ü"
+ ],
+ [
+ "I"
+ ],
+ [
+ "O",
+ "Ø",
+ "Ô",
+ "Ò",
+ "Ó",
+ "Õ",
+ "Œ",
+ "Ō"
+ ],
+ [
+ "P"
+ ],
+ [
+ "Å"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Æ",
+ "À",
+ "Á",
+ "Â",
+ "Ã",
+ "Ā"
+ ],
+ [
+ "S",
+ "Š",
+ "SS",
+ "Ś"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ],
+ [
+ "Ö",
+ "Ø"
+ ],
+ [
+ "Ä",
+ "Æ"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ž",
+ "Ź",
+ "Ż"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "fi",
+ "name": "Finnish"
+} \ No newline at end of file
diff --git a/data/osk-layouts/fr.json b/data/osk-layouts/fr.json
new file mode 100644
index 0000000..dd572b1
--- /dev/null
+++ b/data/osk-layouts/fr.json
@@ -0,0 +1,614 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "a",
+ "à",
+ "â",
+ "%",
+ "æ",
+ "á",
+ "ä",
+ "ã",
+ "å",
+ "ā",
+ "ª"
+ ],
+ [
+ "z"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ê",
+ "ë",
+ "%",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "%",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ù",
+ "û",
+ "%",
+ "ü",
+ "ú",
+ "ū"
+ ],
+ [
+ "i",
+ "î",
+ "%",
+ "ï",
+ "ì",
+ "í",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ô",
+ "œ",
+ "%",
+ "ö",
+ "ò",
+ "ó",
+ "õ",
+ "ø",
+ "ō",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "q"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ "w"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "ć",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "A",
+ "À",
+ "Â",
+ "%",
+ "Æ",
+ "Á",
+ "Ä",
+ "Ã",
+ "Å",
+ "Ā",
+ "ª"
+ ],
+ [
+ "Z"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ê",
+ "Ë",
+ "%",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "%",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ù",
+ "Û",
+ "%",
+ "Ü",
+ "Ú",
+ "Ū"
+ ],
+ [
+ "I",
+ "Î",
+ "%",
+ "Ï",
+ "Ì",
+ "Í",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ô",
+ "Œ",
+ "%",
+ "Ö",
+ "Ò",
+ "Ó",
+ "Õ",
+ "Ø",
+ "Ō",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "Q"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ "W"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Ć",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "fr",
+ "name": "French"
+} \ No newline at end of file
diff --git a/data/osk-layouts/ge.json b/data/osk-layouts/ge.json
new file mode 100644
index 0000000..a94b3ba
--- /dev/null
+++ b/data/osk-layouts/ge.json
@@ -0,0 +1,409 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "ქ"
+ ],
+ [
+ "წ"
+ ],
+ [
+ "ე",
+ "ჱ"
+ ],
+ [
+ "რ"
+ ],
+ [
+ "ტ"
+ ],
+ [
+ "ყ",
+ "ჸ"
+ ],
+ [
+ "უ"
+ ],
+ [
+ "ი",
+ "ჲ"
+ ],
+ [
+ "ო"
+ ],
+ [
+ "პ"
+ ]
+ ],
+ [
+ [
+ "ა",
+ "ჺ"
+ ],
+ [
+ "ს"
+ ],
+ [
+ "დ"
+ ],
+ [
+ "ფ",
+ "ჶ"
+ ],
+ [
+ "გ",
+ "ჹ"
+ ],
+ [
+ "ჰ",
+ "ჵ"
+ ],
+ [
+ "ჯ",
+ "ჷ"
+ ],
+ [
+ "კ"
+ ],
+ [
+ "ლ"
+ ]
+ ],
+ [
+ [
+ "ზ"
+ ],
+ [
+ "ხ",
+ "ჴ"
+ ],
+ [
+ "ც"
+ ],
+ [
+ "ვ",
+ "ჳ"
+ ],
+ [
+ "ბ"
+ ],
+ [
+ "ნ",
+ "ჼ"
+ ],
+ [
+ "მ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "ka",
+ "name": "Georgian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/gr.json b/data/osk-layouts/gr.json
new file mode 100644
index 0000000..b2337e5
--- /dev/null
+++ b/data/osk-layouts/gr.json
@@ -0,0 +1,532 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ ";",
+ ":"
+ ],
+ [
+ "ς"
+ ],
+ [
+ "ε",
+ "έ"
+ ],
+ [
+ "ρ"
+ ],
+ [
+ "τ"
+ ],
+ [
+ "υ",
+ "ύ",
+ "ϋ",
+ "ΰ"
+ ],
+ [
+ "θ"
+ ],
+ [
+ "ι",
+ "ί",
+ "ϊ",
+ "ΐ"
+ ],
+ [
+ "ο",
+ "ό"
+ ],
+ [
+ "π"
+ ]
+ ],
+ [
+ [
+ "α",
+ "ά"
+ ],
+ [
+ "σ"
+ ],
+ [
+ "δ"
+ ],
+ [
+ "φ"
+ ],
+ [
+ "γ"
+ ],
+ [
+ "η",
+ "ή"
+ ],
+ [
+ "ξ"
+ ],
+ [
+ "κ"
+ ],
+ [
+ "λ"
+ ]
+ ],
+ [
+ [
+ "ζ"
+ ],
+ [
+ "χ"
+ ],
+ [
+ "ψ"
+ ],
+ [
+ "ω",
+ "ώ"
+ ],
+ [
+ "β"
+ ],
+ [
+ "ν"
+ ],
+ [
+ "μ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ ";",
+ ":"
+ ],
+ [
+ "Σ"
+ ],
+ [
+ "Ε",
+ "Έ"
+ ],
+ [
+ "Ρ"
+ ],
+ [
+ "Τ"
+ ],
+ [
+ "Υ",
+ "Ύ",
+ "Ϋ",
+ "Ϋ́"
+ ],
+ [
+ "Θ"
+ ],
+ [
+ "Ι",
+ "Ί",
+ "Ϊ",
+ "Ϊ́"
+ ],
+ [
+ "Ο",
+ "Ό"
+ ],
+ [
+ "Π"
+ ]
+ ],
+ [
+ [
+ "Α",
+ "Ά"
+ ],
+ [
+ "Σ"
+ ],
+ [
+ "Δ"
+ ],
+ [
+ "Φ"
+ ],
+ [
+ "Γ"
+ ],
+ [
+ "Η",
+ "Ή"
+ ],
+ [
+ "Ξ"
+ ],
+ [
+ "Κ"
+ ],
+ [
+ "Λ"
+ ]
+ ],
+ [
+ [
+ "Ζ"
+ ],
+ [
+ "Χ"
+ ],
+ [
+ "Ψ"
+ ],
+ [
+ "Ω",
+ "Ώ"
+ ],
+ [
+ "Β"
+ ],
+ [
+ "Ν"
+ ],
+ [
+ "Μ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "el",
+ "name": "Greek"
+} \ No newline at end of file
diff --git a/data/osk-layouts/hr.json b/data/osk-layouts/hr.json
new file mode 100644
index 0000000..ff0d1d0
--- /dev/null
+++ b/data/osk-layouts/hr.json
@@ -0,0 +1,531 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "z",
+ "ž",
+ "ź",
+ "ż"
+ ],
+ [
+ "u"
+ ],
+ [
+ "i"
+ ],
+ [
+ "o"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a"
+ ],
+ [
+ "s",
+ "š",
+ "ś",
+ "ß"
+ ],
+ [
+ "d",
+ "đ"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "y"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "č",
+ "ć",
+ "ç"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Z",
+ "Ž",
+ "Ź",
+ "Ż"
+ ],
+ [
+ "U"
+ ],
+ [
+ "I"
+ ],
+ [
+ "O"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A"
+ ],
+ [
+ "S",
+ "Š",
+ "Ś",
+ "SS"
+ ],
+ [
+ "D",
+ "Đ"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Y"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Č",
+ "Ć",
+ "Ç"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "hr",
+ "name": "Croatian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/hu.json b/data/osk-layouts/hu.json
new file mode 100644
index 0000000..9bcc532
--- /dev/null
+++ b/data/osk-layouts/hu.json
@@ -0,0 +1,579 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ê",
+ "ë",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "z"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "ű",
+ "û",
+ "ù",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "î",
+ "ï",
+ "ì",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ó",
+ "ö",
+ "ő",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "à",
+ "â",
+ "ä",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "y"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ê",
+ "Ë",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Z"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Ű",
+ "Û",
+ "Ù",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Î",
+ "Ï",
+ "Ì",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ö",
+ "Ő",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "À",
+ "Â",
+ "Ä",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Y"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "hu",
+ "name": "Hungarian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/id.json b/data/osk-layouts/id.json
new file mode 100644
index 0000000..2342962
--- /dev/null
+++ b/data/osk-layouts/id.json
@@ -0,0 +1,507 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u"
+ ],
+ [
+ "i"
+ ],
+ [
+ "o"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U"
+ ],
+ [
+ "I"
+ ],
+ [
+ "O"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "id",
+ "name": "Indonesian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/il.json b/data/osk-layouts/il.json
new file mode 100644
index 0000000..76dd588
--- /dev/null
+++ b/data/osk-layouts/il.json
@@ -0,0 +1,419 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "'",
+ "\""
+ ],
+ [
+ "-",
+ "_"
+ ],
+ [
+ "ק"
+ ],
+ [
+ "ר"
+ ],
+ [
+ "א"
+ ],
+ [
+ "ט"
+ ],
+ [
+ "ו"
+ ],
+ [
+ "ן"
+ ],
+ [
+ "ם"
+ ],
+ [
+ "פ"
+ ]
+ ],
+ [
+ [
+ "ש"
+ ],
+ [
+ "ד"
+ ],
+ [
+ "ג",
+ "ג׳"
+ ],
+ [
+ "כ"
+ ],
+ [
+ "ע"
+ ],
+ [
+ "י",
+ "ײַ"
+ ],
+ [
+ "ח",
+ "ח׳"
+ ],
+ [
+ "ל"
+ ],
+ [
+ "ך"
+ ],
+ [
+ "ף"
+ ]
+ ],
+ [
+ [
+ "ז",
+ "ז׳"
+ ],
+ [
+ "ס"
+ ],
+ [
+ "ב"
+ ],
+ [
+ "ה"
+ ],
+ [
+ "נ"
+ ],
+ [
+ "מ"
+ ],
+ [
+ "צ",
+ "צ׳"
+ ],
+ [
+ "ת",
+ "ת׳"
+ ],
+ [
+ "ץ",
+ "ץ׳"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "₪",
+ "$",
+ "¢",
+ "€",
+ "£",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±",
+ "﬩"
+ ],
+ [
+ "(",
+ ">",
+ "}",
+ "]"
+ ],
+ [
+ ")",
+ "<",
+ "{",
+ "["
+ ]
+ ],
+ [
+ [
+ "*",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ",",
+ "!"
+ ],
+ [
+ ".",
+ "?"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "€"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ ">",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ " "
+ ],
+ [
+ ",",
+ "!"
+ ],
+ [
+ ".",
+ "?"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "he",
+ "name": "Hebrew"
+} \ No newline at end of file
diff --git a/data/osk-layouts/in+bolnagri.json b/data/osk-layouts/in+bolnagri.json
new file mode 100644
index 0000000..36f10ac
--- /dev/null
+++ b/data/osk-layouts/in+bolnagri.json
@@ -0,0 +1,439 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "◌ौ"
+ ],
+ [
+ "◌ै"
+ ],
+ [
+ "◌ा"
+ ],
+ [
+ "◌ी"
+ ],
+ [
+ "◌ू"
+ ],
+ [
+ "ब",
+ "ब॒",
+ "%"
+ ],
+ [
+ "ह"
+ ],
+ [
+ "ग",
+ "ज्ञ",
+ "ग़",
+ "ग॒",
+ "%"
+ ],
+ [
+ "द"
+ ],
+ [
+ "ज",
+ "ज॒",
+ "ज्ञ",
+ "ज़",
+ "%"
+ ],
+ [
+ "ड",
+ "ड॒",
+ "ड़"
+ ]
+ ],
+ [
+ [
+ "◌ो"
+ ],
+ [
+ "◌े"
+ ],
+ [
+ "◌्"
+ ],
+ [
+ "◌ि"
+ ],
+ [
+ "◌ु"
+ ],
+ [
+ "प"
+ ],
+ [
+ "र",
+ "ऋ",
+ "ऱ",
+ "ॠ"
+ ],
+ [
+ "क",
+ "क़"
+ ],
+ [
+ "त",
+ "त्र"
+ ],
+ [
+ "च"
+ ],
+ [
+ "ट"
+ ]
+ ],
+ [
+ [
+ "◌ॉ"
+ ],
+ [
+ "◌ं"
+ ],
+ [
+ "म",
+ "ॐ"
+ ],
+ [
+ "न",
+ "ञ",
+ "ङ",
+ "ऩ"
+ ],
+ [
+ "व"
+ ],
+ [
+ "ल",
+ "ऌ",
+ "ॡ"
+ ],
+ [
+ "स"
+ ],
+ [
+ "य",
+ "य़"
+ ],
+ [
+ "◌़"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "१",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "२",
+ "²",
+ "⅔"
+ ],
+ [
+ "३",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "४",
+ "⁴"
+ ],
+ [
+ "५",
+ "⅝"
+ ],
+ [
+ "६"
+ ],
+ [
+ "७",
+ "⅞"
+ ],
+ [
+ "८"
+ ],
+ [
+ "९"
+ ],
+ [
+ "०",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "₹",
+ "$",
+ "¢",
+ "€",
+ "£",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "€"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "hi",
+ "name": "Hindi"
+} \ No newline at end of file
diff --git a/data/osk-layouts/in+mal.json b/data/osk-layouts/in+mal.json
new file mode 100644
index 0000000..bc153be
--- /dev/null
+++ b/data/osk-layouts/in+mal.json
@@ -0,0 +1,559 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "െ"
+ ],
+ [
+ "ൌ"
+ ],
+ [
+ "ൈ"
+ ],
+ [
+ "ാ"
+ ],
+ [
+ "ീ"
+ ],
+ [
+ "ൂ"
+ ],
+ [
+ "ബ"
+ ],
+ [
+ "ഹ"
+ ],
+ [
+ "ഗ"
+ ],
+ [
+ "ദ"
+ ],
+ [
+ "ജ"
+ ],
+ [
+ "ഡ"
+ ],
+ [
+ "‍"
+ ]
+ ],
+ [
+ [
+ "ോ"
+ ],
+ [
+ "േ"
+ ],
+ [
+ "്"
+ ],
+ [
+ "ി"
+ ],
+ [
+ "ു"
+ ],
+ [
+ "പ"
+ ],
+ [
+ "ര"
+ ],
+ [
+ "ക"
+ ],
+ [
+ "ത"
+ ],
+ [
+ "ച"
+ ],
+ [
+ "ട"
+ ]
+ ],
+ [
+ [
+ "െ"
+ ],
+ [
+ "ം"
+ ],
+ [
+ "മ",
+ "ç"
+ ],
+ [
+ "ന"
+ ],
+ [
+ "വ"
+ ],
+ [
+ "ല",
+ "ñ"
+ ],
+ [
+ "സ"
+ ],
+ [
+ "ഷ"
+ ],
+ [
+ "യ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "ഔ"
+ ],
+ [
+ "ഐ"
+ ],
+ [
+ "ആ"
+ ],
+ [
+ "ഈ"
+ ],
+ [
+ "ഊ"
+ ],
+ [
+ "ഭ"
+ ],
+ [
+ "ങ"
+ ],
+ [
+ "ഘ"
+ ],
+ [
+ "ധ"
+ ],
+ [
+ "ഝ"
+ ],
+ [
+ "ഢ"
+ ],
+ [
+ "ഞ"
+ ]
+ ],
+ [
+ [
+ "ഓ"
+ ],
+ [
+ "ഏ"
+ ],
+ [
+ "അ"
+ ],
+ [
+ "ഇ"
+ ],
+ [
+ "ഉ"
+ ],
+ [
+ "ഫ"
+ ],
+ [
+ "റ"
+ ],
+ [
+ "ഖ"
+ ],
+ [
+ "ഥ"
+ ],
+ [
+ "ഛ"
+ ],
+ [
+ "ഠ"
+ ]
+ ],
+ [
+ [
+ "എ"
+ ],
+ [
+ "​"
+ ],
+ [
+ "ണ"
+ ],
+ [
+ "ന"
+ ],
+ [
+ "ഴ"
+ ],
+ [
+ "ള"
+ ],
+ [
+ "ശ"
+ ],
+ [
+ "ഷ"
+ ],
+ [
+ "യ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "൧",
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "൨",
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "൩",
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "൪",
+ "4",
+ "⁴"
+ ],
+ [
+ "൫",
+ "5",
+ "⅝"
+ ],
+ [
+ "൬",
+ "6"
+ ],
+ [
+ "൭",
+ "7",
+ "⅞"
+ ],
+ [
+ "൮",
+ "8"
+ ],
+ [
+ "൯",
+ "9"
+ ],
+ [
+ "൦",
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "₹",
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "ml",
+ "name": "Malayalam"
+}
diff --git a/data/osk-layouts/ir.json b/data/osk-layouts/ir.json
new file mode 100644
index 0000000..a773b14
--- /dev/null
+++ b/data/osk-layouts/ir.json
@@ -0,0 +1,495 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "ض"
+ ],
+ [
+ "ص"
+ ],
+ [
+ "ث"
+ ],
+ [
+ "ق",
+ "ڨ"
+ ],
+ [
+ "ف",
+ "ڤ",
+ "ڢ",
+ "ڥ"
+ ],
+ [
+ "غ"
+ ],
+ [
+ "ع"
+ ],
+ [
+ "ه",
+ "ه‍"
+ ],
+ [
+ "خ"
+ ],
+ [
+ "ح"
+ ],
+ [
+ "ج",
+ "چ"
+ ]
+ ],
+ [
+ [
+ "ش",
+ "ڜ"
+ ],
+ [
+ "س"
+ ],
+ [
+ "ي",
+ "ئ",
+ "ى"
+ ],
+ [
+ "ب",
+ "پ"
+ ],
+ [
+ "ل",
+ "لا",
+ "لأ",
+ "لإ",
+ "لآ"
+ ],
+ [
+ "ا",
+ "آ",
+ "ء",
+ "أ",
+ "إ",
+ "ٱ"
+ ],
+ [
+ "ت"
+ ],
+ [
+ "ن"
+ ],
+ [
+ "م"
+ ],
+ [
+ "ك",
+ "گ",
+ "ک"
+ ],
+ [
+ "ط"
+ ]
+ ],
+ [
+ [
+ "ذ"
+ ],
+ [
+ "ء"
+ ],
+ [
+ "ؤ"
+ ],
+ [
+ "ر"
+ ],
+ [
+ "ى",
+ "ئ"
+ ],
+ [
+ "ة"
+ ],
+ [
+ "و"
+ ],
+ [
+ "ز",
+ "ژ"
+ ],
+ [
+ "ظ"
+ ],
+ [
+ "د"
+ ]
+ ],
+ [
+ [
+ "،"
+ ],
+ [
+ " "
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "\"",
+ "'",
+ "#",
+ "-",
+ ":",
+ "!",
+ "،",
+ "؟",
+ "@",
+ "&",
+ "%",
+ "+",
+ "؛",
+ "/",
+ ")",
+ "("
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "۱",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "۲",
+ "²",
+ "⅔"
+ ],
+ [
+ "۳",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "۴",
+ "⁴"
+ ],
+ [
+ "۵",
+ "⅝"
+ ],
+ [
+ "۶"
+ ],
+ [
+ "۷",
+ "⅞"
+ ],
+ [
+ "۸"
+ ],
+ [
+ "۹"
+ ],
+ [
+ "۰",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "٬",
+ "@"
+ ],
+ [
+ "٫",
+ "#"
+ ],
+ [
+ "﷼",
+ "$",
+ "¢",
+ "€",
+ "£",
+ "¥",
+ "₱"
+ ],
+ [
+ "٪",
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "﴿",
+ ">",
+ "}",
+ "]"
+ ],
+ [
+ ")",
+ "﴾",
+ "<",
+ "{",
+ "["
+ ]
+ ],
+ [
+ [
+ "*",
+ "★",
+ "٭"
+ ],
+ [
+ "«",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "»",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ "؛",
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "؟",
+ "?"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ "،",
+ ":",
+ "!",
+ "؟",
+ "؛",
+ "-",
+ "/",
+ "»",
+ "«"
+ ],
+ [
+ ".",
+ "ٕ",
+ "ٔ",
+ "ْ",
+ "ٍ",
+ "ٌ",
+ "ً",
+ "ّ",
+ "ٖ",
+ "ٰ",
+ "ٓ",
+ "ِ",
+ "ُ",
+ "َ",
+ "ـ"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "€"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "«",
+ "›",
+ "≥",
+ ">"
+ ],
+ [
+ "»",
+ "‹",
+ "≤",
+ "<"
+ ],
+ [
+ " "
+ ],
+ [
+ "،",
+ ":",
+ "!",
+ "؟",
+ "؛",
+ "-",
+ "/",
+ "»",
+ "«"
+ ],
+ [
+ ".",
+ "ٕ",
+ "ٔ",
+ "ْ",
+ "ٍ",
+ "ٌ",
+ "ً",
+ "ّ",
+ "ٖ",
+ "ٰ",
+ "ٓ",
+ "ِ",
+ "ُ",
+ "َ",
+ "ـ"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "fa",
+ "name": "Persian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/is.json b/data/osk-layouts/is.json
new file mode 100644
index 0000000..b53df32
--- /dev/null
+++ b/data/osk-layouts/is.json
@@ -0,0 +1,583 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "ë",
+ "è",
+ "ê",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t",
+ "þ"
+ ],
+ [
+ "y",
+ "ý",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "û",
+ "ù",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ï",
+ "î",
+ "ì",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ó",
+ "ö",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "ä",
+ "æ",
+ "å",
+ "à",
+ "â",
+ "ã",
+ "ā"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d",
+ "ð"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "Ë",
+ "È",
+ "Ê",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T",
+ "Þ"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Û",
+ "Ù",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ï",
+ "Î",
+ "Ì",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ö",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "Ä",
+ "Æ",
+ "Å",
+ "À",
+ "Â",
+ "Ã",
+ "Ā"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D",
+ "Ð"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "is",
+ "name": "Icelandic"
+} \ No newline at end of file
diff --git a/data/osk-layouts/it.json b/data/osk-layouts/it.json
new file mode 100644
index 0000000..d865266
--- /dev/null
+++ b/data/osk-layouts/it.json
@@ -0,0 +1,580 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "è",
+ "é",
+ "ê",
+ "ë",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "ù",
+ "ú",
+ "û",
+ "ü",
+ "ū"
+ ],
+ [
+ "i",
+ "ì",
+ "í",
+ "î",
+ "ï",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ò",
+ "ó",
+ "ô",
+ "ö",
+ "õ",
+ "œ",
+ "ø",
+ "ō",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "à",
+ "á",
+ "â",
+ "ä",
+ "æ",
+ "ã",
+ "å",
+ "ā",
+ "ª"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "È",
+ "É",
+ "Ê",
+ "Ë",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Ù",
+ "Ú",
+ "Û",
+ "Ü",
+ "Ū"
+ ],
+ [
+ "I",
+ "Ì",
+ "Í",
+ "Î",
+ "Ï",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ò",
+ "Ó",
+ "Ô",
+ "Ö",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "À",
+ "Á",
+ "Â",
+ "Ä",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā",
+ "ª"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "it",
+ "name": "Italian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/ke.json b/data/osk-layouts/ke.json
new file mode 100644
index 0000000..9c3e935
--- /dev/null
+++ b/data/osk-layouts/ke.json
@@ -0,0 +1,577 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "è",
+ "é",
+ "ê",
+ "ë",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "û",
+ "ü",
+ "ù",
+ "ú",
+ "ū"
+ ],
+ [
+ "i",
+ "î",
+ "ï",
+ "í",
+ "ī",
+ "ì"
+ ],
+ [
+ "o",
+ "ô",
+ "ö",
+ "ò",
+ "ó",
+ "œ",
+ "ø",
+ "ō",
+ "õ"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "à",
+ "á",
+ "â",
+ "ä",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s",
+ "ß"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g",
+ "g'"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "È",
+ "É",
+ "Ê",
+ "Ë",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Û",
+ "Ü",
+ "Ù",
+ "Ú",
+ "Ū"
+ ],
+ [
+ "I",
+ "Î",
+ "Ï",
+ "Í",
+ "Ī",
+ "Ì"
+ ],
+ [
+ "O",
+ "Ô",
+ "Ö",
+ "Ò",
+ "Ó",
+ "Œ",
+ "Ø",
+ "Ō",
+ "Õ"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "À",
+ "Á",
+ "Â",
+ "Ä",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S",
+ "SS"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G",
+ "G'"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "sw",
+ "name": "Swahili"
+} \ No newline at end of file
diff --git a/data/osk-layouts/kg.json b/data/osk-layouts/kg.json
new file mode 100644
index 0000000..b56915a
--- /dev/null
+++ b/data/osk-layouts/kg.json
@@ -0,0 +1,547 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "й"
+ ],
+ [
+ "ц"
+ ],
+ [
+ "у",
+ "ү"
+ ],
+ [
+ "к"
+ ],
+ [
+ "е",
+ "ё"
+ ],
+ [
+ "н",
+ "ң"
+ ],
+ [
+ "г"
+ ],
+ [
+ "ш"
+ ],
+ [
+ "щ"
+ ],
+ [
+ "з"
+ ],
+ [
+ "х"
+ ]
+ ],
+ [
+ [
+ "ф"
+ ],
+ [
+ "ы"
+ ],
+ [
+ "в"
+ ],
+ [
+ "а"
+ ],
+ [
+ "п"
+ ],
+ [
+ "р"
+ ],
+ [
+ "о",
+ "ө"
+ ],
+ [
+ "л"
+ ],
+ [
+ "д"
+ ],
+ [
+ "ж"
+ ],
+ [
+ "э"
+ ]
+ ],
+ [
+ [
+ "я"
+ ],
+ [
+ "ч"
+ ],
+ [
+ "с"
+ ],
+ [
+ "м"
+ ],
+ [
+ "и"
+ ],
+ [
+ "т"
+ ],
+ [
+ "ь",
+ "ъ"
+ ],
+ [
+ "б"
+ ],
+ [
+ "ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Й"
+ ],
+ [
+ "Ц"
+ ],
+ [
+ "У",
+ "Ү"
+ ],
+ [
+ "К"
+ ],
+ [
+ "Е",
+ "Ё"
+ ],
+ [
+ "Н",
+ "Ң"
+ ],
+ [
+ "Г"
+ ],
+ [
+ "Ш"
+ ],
+ [
+ "Щ"
+ ],
+ [
+ "З"
+ ],
+ [
+ "Х"
+ ]
+ ],
+ [
+ [
+ "Ф"
+ ],
+ [
+ "Ы"
+ ],
+ [
+ "В"
+ ],
+ [
+ "А"
+ ],
+ [
+ "П"
+ ],
+ [
+ "Р"
+ ],
+ [
+ "О",
+ "Ө"
+ ],
+ [
+ "Л"
+ ],
+ [
+ "Д"
+ ],
+ [
+ "Ж"
+ ],
+ [
+ "Э"
+ ]
+ ],
+ [
+ [
+ "Я"
+ ],
+ [
+ "Ч"
+ ],
+ [
+ "С"
+ ],
+ [
+ "М"
+ ],
+ [
+ "И"
+ ],
+ [
+ "Т"
+ ],
+ [
+ "Ь",
+ "Ъ"
+ ],
+ [
+ "Б"
+ ],
+ [
+ "Ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "ky",
+ "name": "Kirghiz"
+} \ No newline at end of file
diff --git a/data/osk-layouts/kh.json b/data/osk-layouts/kh.json
new file mode 100644
index 0000000..e5d34cb
--- /dev/null
+++ b/data/osk-layouts/kh.json
@@ -0,0 +1,481 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "១",
+ "៱"
+ ],
+ [
+ "២",
+ "៲"
+ ],
+ [
+ "៣",
+ "៳"
+ ],
+ [
+ "៤",
+ "៴"
+ ],
+ [
+ "៥",
+ "៵"
+ ],
+ [
+ "៦",
+ "៶"
+ ],
+ [
+ "៧",
+ "៷"
+ ],
+ [
+ "៨",
+ "៸"
+ ],
+ [
+ "៩",
+ "៹"
+ ],
+ [
+ "០",
+ "៰"
+ ],
+ [
+ "ឥ",
+ "",
+ "ឦ"
+ ],
+ [
+ "ឲ",
+ "ឱ"
+ ]
+ ],
+ [
+ [
+ "ឆ"
+ ],
+ [
+ "ឹ"
+ ],
+ [
+ "េ"
+ ],
+ [
+ "រ"
+ ],
+ [
+ "ត"
+ ],
+ [
+ "យ"
+ ],
+ [
+ "ុ"
+ ],
+ [
+ "ិ"
+ ],
+ [
+ "ោ"
+ ],
+ [
+ "ផ"
+ ],
+ [
+ "ៀ"
+ ],
+ [
+ "ឪ",
+ "ឧ",
+ "ឱ",
+ "ឳ",
+ "ឩ",
+ "ឨ"
+ ]
+ ],
+ [
+ [
+ "ា"
+ ],
+ [
+ "ស"
+ ],
+ [
+ "ដ"
+ ],
+ [
+ "ថ"
+ ],
+ [
+ "ង"
+ ],
+ [
+ "ហ"
+ ],
+ [
+ "្"
+ ],
+ [
+ "ក"
+ ],
+ [
+ "ល"
+ ],
+ [
+ "ើ"
+ ],
+ [
+ "់"
+ ],
+ [
+ "ឮ",
+ "ឭ",
+ "ឰ"
+ ]
+ ],
+ [
+ [
+ "ឋ"
+ ],
+ [
+ "ខ"
+ ],
+ [
+ "ច"
+ ],
+ [
+ "វ"
+ ],
+ [
+ "ប"
+ ],
+ [
+ "ន"
+ ],
+ [
+ "ម"
+ ],
+ [
+ "ុំ"
+ ],
+ [
+ "។"
+ ],
+ [
+ "៊"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "៛",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "km",
+ "name": "Khmer"
+} \ No newline at end of file
diff --git a/data/osk-layouts/la.json b/data/osk-layouts/la.json
new file mode 100644
index 0000000..aedff60
--- /dev/null
+++ b/data/osk-layouts/la.json
@@ -0,0 +1,472 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "ຢ",
+ "໑"
+ ],
+ [
+ "ຟ",
+ "໒"
+ ],
+ [
+ "ໂ",
+ "໓"
+ ],
+ [
+ "ຖ",
+ "໔"
+ ],
+ [
+ "ຸ"
+ ],
+ [
+ "ູ"
+ ],
+ [
+ "ຄ",
+ "໕"
+ ],
+ [
+ "ຕ",
+ "໖"
+ ],
+ [
+ "ຈ",
+ "໗"
+ ],
+ [
+ "ຂ",
+ "໘"
+ ],
+ [
+ "ຊ",
+ "໙"
+ ],
+ [
+ "ໍ"
+ ]
+ ],
+ [
+ [
+ "ົ"
+ ],
+ [
+ "ໄ",
+ "໐"
+ ],
+ [
+ "ຳ"
+ ],
+ [
+ "ພ"
+ ],
+ [
+ "ະ"
+ ],
+ [
+ "ິ"
+ ],
+ [
+ "ີ"
+ ],
+ [
+ "ຮ"
+ ],
+ [
+ "ນ"
+ ],
+ [
+ "ຍ"
+ ],
+ [
+ "ບ"
+ ],
+ [
+ "ລ"
+ ]
+ ],
+ [
+ [
+ "ັ"
+ ],
+ [
+ "ຫ"
+ ],
+ [
+ "ກ"
+ ],
+ [
+ "ດ"
+ ],
+ [
+ "ເ"
+ ],
+ [
+ "້"
+ ],
+ [
+ "່"
+ ],
+ [
+ "າ"
+ ],
+ [
+ "ສ"
+ ],
+ [
+ "ວ"
+ ],
+ [
+ "ງ"
+ ],
+ [
+ "“"
+ ]
+ ],
+ [
+ [
+ "ຜ"
+ ],
+ [
+ "ປ"
+ ],
+ [
+ "ແ"
+ ],
+ [
+ "ອ"
+ ],
+ [
+ "ຶ"
+ ],
+ [
+ "ື"
+ ],
+ [
+ "ທ"
+ ],
+ [
+ "ມ"
+ ],
+ [
+ "ໃ"
+ ],
+ [
+ "ຝ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "₭",
+ "$",
+ "¢",
+ "€",
+ "£",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "€"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "lo",
+ "name": "Lao"
+} \ No newline at end of file
diff --git a/data/osk-layouts/latam.json b/data/osk-layouts/latam.json
new file mode 100644
index 0000000..4095c7a
--- /dev/null
+++ b/data/osk-layouts/latam.json
@@ -0,0 +1,603 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ë",
+ "ê",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "ù",
+ "û",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ï",
+ "ì",
+ "î",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ó",
+ "ò",
+ "ö",
+ "ô",
+ "õ",
+ "ø",
+ "œ",
+ "ō",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "à",
+ "ä",
+ "â",
+ "ã",
+ "å",
+ "ą",
+ "æ",
+ "ā",
+ "ª"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ],
+ [
+ "ñ"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "ć",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ ";",
+ "!",
+ ",",
+ "?",
+ ":",
+ "¡",
+ "@",
+ "¿"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ë",
+ "Ê",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Ù",
+ "Û",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ï",
+ "Ì",
+ "Î",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ò",
+ "Ö",
+ "Ô",
+ "Õ",
+ "Ø",
+ "Œ",
+ "Ō",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "À",
+ "Ä",
+ "Â",
+ "Ã",
+ "Å",
+ "Ą",
+ "Æ",
+ "Ā",
+ "ª"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ],
+ [
+ "Ñ"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Ć",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ ";",
+ "!",
+ ",",
+ "?",
+ ":",
+ "¡",
+ "@",
+ "¿"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ",",
+ "!",
+ "¡"
+ ],
+ [
+ ".",
+ "?",
+ "¿"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ",",
+ "!",
+ "¡"
+ ],
+ [
+ ".",
+ "?",
+ "¿"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "es-US",
+ "name": "Spanish United States"
+} \ No newline at end of file
diff --git a/data/osk-layouts/lt.json b/data/osk-layouts/lt.json
new file mode 100644
index 0000000..7cd5352
--- /dev/null
+++ b/data/osk-layouts/lt.json
@@ -0,0 +1,647 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "ė",
+ "ę",
+ "ē",
+ "è",
+ "é",
+ "ê",
+ "ë",
+ "ě"
+ ],
+ [
+ "r",
+ "ŗ",
+ "ř",
+ "ŕ"
+ ],
+ [
+ "t",
+ "ţ",
+ "ť"
+ ],
+ [
+ "y",
+ "ý",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ū",
+ "ų",
+ "ü",
+ "ū",
+ "ù",
+ "ú",
+ "û",
+ "ů",
+ "ű"
+ ],
+ [
+ "i",
+ "į",
+ "ī",
+ "ì",
+ "í",
+ "î",
+ "ï",
+ "ı"
+ ],
+ [
+ "o",
+ "ö",
+ "õ",
+ "ò",
+ "ó",
+ "ô",
+ "œ",
+ "ő",
+ "ø"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "ą",
+ "ä",
+ "ā",
+ "à",
+ "á",
+ "â",
+ "ã",
+ "å",
+ "æ"
+ ],
+ [
+ "s",
+ "š",
+ "ß",
+ "ś",
+ "ş"
+ ],
+ [
+ "d",
+ "ď"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g",
+ "ģ",
+ "ğ"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k",
+ "ķ"
+ ],
+ [
+ "l",
+ "ļ",
+ "ł",
+ "ĺ",
+ "ľ"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ž",
+ "ż",
+ "ź"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "č",
+ "ç",
+ "ć"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ņ",
+ "ñ",
+ "ń",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "Ė",
+ "Ę",
+ "Ē",
+ "È",
+ "É",
+ "Ê",
+ "Ë",
+ "Ě"
+ ],
+ [
+ "R",
+ "Ŗ",
+ "Ř",
+ "Ŕ"
+ ],
+ [
+ "T",
+ "Ţ",
+ "Ť"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ū",
+ "Ų",
+ "Ü",
+ "Ū",
+ "Ù",
+ "Ú",
+ "Û",
+ "Ů",
+ "Ű"
+ ],
+ [
+ "I",
+ "Į",
+ "Ī",
+ "Ì",
+ "Í",
+ "Î",
+ "Ï",
+ "I"
+ ],
+ [
+ "O",
+ "Ö",
+ "Õ",
+ "Ò",
+ "Ó",
+ "Ô",
+ "Œ",
+ "Ő",
+ "Ø"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Ą",
+ "Ä",
+ "Ā",
+ "À",
+ "Á",
+ "Â",
+ "Ã",
+ "Å",
+ "Æ"
+ ],
+ [
+ "S",
+ "Š",
+ "SS",
+ "Ś",
+ "Ş"
+ ],
+ [
+ "D",
+ "Ď"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G",
+ "Ģ",
+ "Ğ"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K",
+ "Ķ"
+ ],
+ [
+ "L",
+ "Ļ",
+ "Ł",
+ "Ĺ",
+ "Ľ"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ž",
+ "Ż",
+ "Ź"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Č",
+ "Ç",
+ "Ć"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ņ",
+ "Ñ",
+ "Ń",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "lt",
+ "name": "Lithuanian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/lv.json b/data/osk-layouts/lv.json
new file mode 100644
index 0000000..bab6ae3
--- /dev/null
+++ b/data/osk-layouts/lv.json
@@ -0,0 +1,645 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "ē",
+ "ė",
+ "è",
+ "é",
+ "ê",
+ "ë",
+ "ę",
+ "ě"
+ ],
+ [
+ "r",
+ "ŗ",
+ "ř",
+ "ŕ"
+ ],
+ [
+ "t",
+ "ţ",
+ "ť"
+ ],
+ [
+ "y",
+ "ý",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ū",
+ "ų",
+ "ù",
+ "ú",
+ "û",
+ "ü",
+ "ů",
+ "ű"
+ ],
+ [
+ "i",
+ "ī",
+ "į",
+ "ì",
+ "í",
+ "î",
+ "ï",
+ "ı"
+ ],
+ [
+ "o",
+ "ò",
+ "ó",
+ "ô",
+ "õ",
+ "ö",
+ "œ",
+ "ő",
+ "ø"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "ā",
+ "à",
+ "á",
+ "â",
+ "ã",
+ "ä",
+ "å",
+ "æ",
+ "ą"
+ ],
+ [
+ "s",
+ "š",
+ "ß",
+ "ś",
+ "ş"
+ ],
+ [
+ "d",
+ "ď"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g",
+ "ģ",
+ "ğ"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k",
+ "ķ"
+ ],
+ [
+ "l",
+ "ļ",
+ "ł",
+ "ĺ",
+ "ľ"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ž",
+ "ż",
+ "ź"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "č",
+ "ç",
+ "ć"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ņ",
+ "ñ",
+ "ń",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "Ē",
+ "Ė",
+ "È",
+ "É",
+ "Ê",
+ "Ë",
+ "Ę",
+ "Ě"
+ ],
+ [
+ "R",
+ "Ŗ",
+ "Ř",
+ "Ŕ"
+ ],
+ [
+ "T",
+ "Ţ",
+ "Ť"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ū",
+ "Ų",
+ "Ù",
+ "Ú",
+ "Û",
+ "Ü",
+ "Ů",
+ "Ű"
+ ],
+ [
+ "I",
+ "Ī",
+ "Į",
+ "Ì",
+ "Í",
+ "Î",
+ "Ï",
+ "I"
+ ],
+ [
+ "O",
+ "Ò",
+ "Ó",
+ "Ô",
+ "Õ",
+ "Ö",
+ "Œ",
+ "Ő",
+ "Ø"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Ā",
+ "À",
+ "Á",
+ "Â",
+ "Ã",
+ "Ä",
+ "Å",
+ "Æ",
+ "Ą"
+ ],
+ [
+ "S",
+ "Š",
+ "SS",
+ "Ś",
+ "Ş"
+ ],
+ [
+ "D",
+ "Ď"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G",
+ "Ģ",
+ "Ğ"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K",
+ "Ķ"
+ ],
+ [
+ "L",
+ "Ļ",
+ "Ł",
+ "Ĺ",
+ "Ľ"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ž",
+ "Ż",
+ "Ź"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Č",
+ "Ç",
+ "Ć"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ņ",
+ "Ñ",
+ "Ń",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "lv",
+ "name": "Latvian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/mk.json b/data/osk-layouts/mk.json
new file mode 100644
index 0000000..2815121
--- /dev/null
+++ b/data/osk-layouts/mk.json
@@ -0,0 +1,541 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "љ"
+ ],
+ [
+ "њ"
+ ],
+ [
+ "е",
+ "ѐ"
+ ],
+ [
+ "р"
+ ],
+ [
+ "т"
+ ],
+ [
+ "ѕ"
+ ],
+ [
+ "у"
+ ],
+ [
+ "и",
+ "ѝ"
+ ],
+ [
+ "о"
+ ],
+ [
+ "п"
+ ],
+ [
+ "ш"
+ ]
+ ],
+ [
+ [
+ "а"
+ ],
+ [
+ "с"
+ ],
+ [
+ "д"
+ ],
+ [
+ "ф"
+ ],
+ [
+ "г"
+ ],
+ [
+ "х"
+ ],
+ [
+ "ј"
+ ],
+ [
+ "к"
+ ],
+ [
+ "л"
+ ],
+ [
+ "ч"
+ ],
+ [
+ "ќ"
+ ]
+ ],
+ [
+ [
+ "з"
+ ],
+ [
+ "џ"
+ ],
+ [
+ "ц"
+ ],
+ [
+ "в"
+ ],
+ [
+ "б"
+ ],
+ [
+ "н"
+ ],
+ [
+ "м"
+ ],
+ [
+ "ѓ"
+ ],
+ [
+ "ж"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Љ"
+ ],
+ [
+ "Њ"
+ ],
+ [
+ "Е",
+ "Ѐ"
+ ],
+ [
+ "Р"
+ ],
+ [
+ "Т"
+ ],
+ [
+ "Ѕ"
+ ],
+ [
+ "У"
+ ],
+ [
+ "И",
+ "Ѝ"
+ ],
+ [
+ "О"
+ ],
+ [
+ "П"
+ ],
+ [
+ "Ш"
+ ]
+ ],
+ [
+ [
+ "А"
+ ],
+ [
+ "С"
+ ],
+ [
+ "Д"
+ ],
+ [
+ "Ф"
+ ],
+ [
+ "Г"
+ ],
+ [
+ "Х"
+ ],
+ [
+ "Ј"
+ ],
+ [
+ "К"
+ ],
+ [
+ "Л"
+ ],
+ [
+ "Ч"
+ ],
+ [
+ "Ќ"
+ ]
+ ],
+ [
+ [
+ "З"
+ ],
+ [
+ "Џ"
+ ],
+ [
+ "Ц"
+ ],
+ [
+ "В"
+ ],
+ [
+ "Б"
+ ],
+ [
+ "Н"
+ ],
+ [
+ "М"
+ ],
+ [
+ "Ѓ"
+ ],
+ [
+ "Ж"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "mk",
+ "name": "Macedonian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/mn.json b/data/osk-layouts/mn.json
new file mode 100644
index 0000000..88eaa24
--- /dev/null
+++ b/data/osk-layouts/mn.json
@@ -0,0 +1,547 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "ф"
+ ],
+ [
+ "ц"
+ ],
+ [
+ "у"
+ ],
+ [
+ "ж"
+ ],
+ [
+ "э"
+ ],
+ [
+ "н"
+ ],
+ [
+ "г"
+ ],
+ [
+ "ш",
+ "щ"
+ ],
+ [
+ "ү"
+ ],
+ [
+ "з"
+ ],
+ [
+ "к"
+ ]
+ ],
+ [
+ [
+ "й"
+ ],
+ [
+ "ы"
+ ],
+ [
+ "б"
+ ],
+ [
+ "ө"
+ ],
+ [
+ "а"
+ ],
+ [
+ "х"
+ ],
+ [
+ "р"
+ ],
+ [
+ "о"
+ ],
+ [
+ "л"
+ ],
+ [
+ "д"
+ ],
+ [
+ "п"
+ ]
+ ],
+ [
+ [
+ "я"
+ ],
+ [
+ "ч"
+ ],
+ [
+ "ё",
+ "е"
+ ],
+ [
+ "с"
+ ],
+ [
+ "м"
+ ],
+ [
+ "и"
+ ],
+ [
+ "т"
+ ],
+ [
+ "ь",
+ "ъ"
+ ],
+ [
+ "в",
+ "ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Ф"
+ ],
+ [
+ "Ц"
+ ],
+ [
+ "У"
+ ],
+ [
+ "Ж"
+ ],
+ [
+ "Э"
+ ],
+ [
+ "Н"
+ ],
+ [
+ "Г"
+ ],
+ [
+ "Ш",
+ "Щ"
+ ],
+ [
+ "Ү"
+ ],
+ [
+ "З"
+ ],
+ [
+ "К"
+ ]
+ ],
+ [
+ [
+ "Й"
+ ],
+ [
+ "Ы"
+ ],
+ [
+ "Б"
+ ],
+ [
+ "Ө"
+ ],
+ [
+ "А"
+ ],
+ [
+ "Х"
+ ],
+ [
+ "Р"
+ ],
+ [
+ "О"
+ ],
+ [
+ "Л"
+ ],
+ [
+ "Д"
+ ],
+ [
+ "П"
+ ]
+ ],
+ [
+ [
+ "Я"
+ ],
+ [
+ "Ч"
+ ],
+ [
+ "Ё",
+ "Е"
+ ],
+ [
+ "С"
+ ],
+ [
+ "М"
+ ],
+ [
+ "И"
+ ],
+ [
+ "Т"
+ ],
+ [
+ "Ь",
+ "Ъ"
+ ],
+ [
+ "В",
+ "Ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "₮",
+ "$",
+ "¢",
+ "€",
+ "£",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "€"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "mn",
+ "name": "Mongolian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/my.json b/data/osk-layouts/my.json
new file mode 100644
index 0000000..dfd5e09
--- /dev/null
+++ b/data/osk-layouts/my.json
@@ -0,0 +1,507 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u"
+ ],
+ [
+ "i"
+ ],
+ [
+ "o"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U"
+ ],
+ [
+ "I"
+ ],
+ [
+ "O"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "ms",
+ "name": "Malay"
+} \ No newline at end of file
diff --git a/data/osk-layouts/nl.json b/data/osk-layouts/nl.json
new file mode 100644
index 0000000..7a630b4
--- /dev/null
+++ b/data/osk-layouts/nl.json
@@ -0,0 +1,584 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "ë",
+ "ê",
+ "è",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "ij"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "û",
+ "ù",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ï",
+ "ì",
+ "î",
+ "į",
+ "ī",
+ "ij"
+ ],
+ [
+ "o",
+ "ó",
+ "ö",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "ä",
+ "â",
+ "à",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "Ë",
+ "Ê",
+ "È",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "IJ"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Û",
+ "Ù",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ï",
+ "Ì",
+ "Î",
+ "Į",
+ "Ī",
+ "IJ"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ö",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "Ä",
+ "Â",
+ "À",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "nl",
+ "name": "Dutch"
+} \ No newline at end of file
diff --git a/data/osk-layouts/no.json b/data/osk-layouts/no.json
new file mode 100644
index 0000000..a70be9c
--- /dev/null
+++ b/data/osk-layouts/no.json
@@ -0,0 +1,590 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "ë"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "ý",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "û",
+ "ù",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ï"
+ ],
+ [
+ "o",
+ "ó",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ō"
+ ],
+ [
+ "p"
+ ],
+ [
+ "å"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "ä",
+ "à",
+ "â",
+ "ã",
+ "ā"
+ ],
+ [
+ "s",
+ "ß",
+ "ś",
+ "š"
+ ],
+ [
+ "d",
+ "ð"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l",
+ "ł"
+ ],
+ [
+ "ø",
+ "ö"
+ ],
+ [
+ "æ",
+ "ä"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "Ë"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Û",
+ "Ù",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ï"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ō"
+ ],
+ [
+ "P"
+ ],
+ [
+ "Å"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "Ä",
+ "À",
+ "Â",
+ "Ã",
+ "Ā"
+ ],
+ [
+ "S",
+ "SS",
+ "Ś",
+ "Š"
+ ],
+ [
+ "D",
+ "Ð"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L",
+ "Ł"
+ ],
+ [
+ "Ø",
+ "Ö"
+ ],
+ [
+ "Æ",
+ "Ä"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "nb",
+ "name": "Norwegian Bokmål"
+}
diff --git a/data/osk-layouts/ph.json b/data/osk-layouts/ph.json
new file mode 100644
index 0000000..8d127b5
--- /dev/null
+++ b/data/osk-layouts/ph.json
@@ -0,0 +1,507 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u"
+ ],
+ [
+ "i"
+ ],
+ [
+ "o"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U"
+ ],
+ [
+ "I"
+ ],
+ [
+ "O"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "fil",
+ "name": "Filipino"
+} \ No newline at end of file
diff --git a/data/osk-layouts/pl.json b/data/osk-layouts/pl.json
new file mode 100644
index 0000000..4b08cd5
--- /dev/null
+++ b/data/osk-layouts/pl.json
@@ -0,0 +1,579 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "ę",
+ "è",
+ "é",
+ "ê",
+ "ë",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u"
+ ],
+ [
+ "i"
+ ],
+ [
+ "o",
+ "ó",
+ "ö",
+ "ô",
+ "ò",
+ "õ",
+ "œ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "ą",
+ "á",
+ "à",
+ "â",
+ "ä",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s",
+ "ś",
+ "ß",
+ "š"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l",
+ "ł"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ż",
+ "ź",
+ "ž"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ć",
+ "ç",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ń",
+ "ñ"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "Ę",
+ "È",
+ "É",
+ "Ê",
+ "Ë",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U"
+ ],
+ [
+ "I"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ö",
+ "Ô",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Ą",
+ "Á",
+ "À",
+ "Â",
+ "Ä",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S",
+ "Ś",
+ "SS",
+ "Š"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L",
+ "Ł"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ż",
+ "Ź",
+ "Ž"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ć",
+ "Ç",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ń",
+ "Ñ"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "pl",
+ "name": "Polish"
+} \ No newline at end of file
diff --git a/data/osk-layouts/pt.json b/data/osk-layouts/pt.json
new file mode 100644
index 0000000..efd857a
--- /dev/null
+++ b/data/osk-layouts/pt.json
@@ -0,0 +1,584 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "ê",
+ "è",
+ "ę",
+ "ė",
+ "ē",
+ "ë"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "ú",
+ "ü",
+ "ù",
+ "û",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "î",
+ "ì",
+ "ï",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ó",
+ "õ",
+ "ô",
+ "ò",
+ "ö",
+ "œ",
+ "ø",
+ "ō",
+ "º"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "ã",
+ "à",
+ "â",
+ "ä",
+ "å",
+ "æ",
+ "ª"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "č",
+ "ć"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "Ê",
+ "È",
+ "Ę",
+ "Ė",
+ "Ē",
+ "Ë"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ü",
+ "Ù",
+ "Û",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Î",
+ "Ì",
+ "Ï",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ó",
+ "Õ",
+ "Ô",
+ "Ò",
+ "Ö",
+ "Œ",
+ "Ø",
+ "Ō",
+ "º"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "Ã",
+ "À",
+ "Â",
+ "Ä",
+ "Å",
+ "Æ",
+ "ª"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Č",
+ "Ć"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "pt-PT",
+ "name": "Portuguese Portugal"
+} \ No newline at end of file
diff --git a/data/osk-layouts/ro.json b/data/osk-layouts/ro.json
new file mode 100644
index 0000000..c690f4e
--- /dev/null
+++ b/data/osk-layouts/ro.json
@@ -0,0 +1,547 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t",
+ "ț"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u"
+ ],
+ [
+ "i",
+ "î",
+ "ï",
+ "ì",
+ "í",
+ "į",
+ "ī"
+ ],
+ [
+ "o"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "â",
+ "ã",
+ "ă",
+ "à",
+ "á",
+ "ä",
+ "æ",
+ "å",
+ "ā"
+ ],
+ [
+ "s",
+ "ș",
+ "ß",
+ "ś",
+ "š"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T",
+ "Ț"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U"
+ ],
+ [
+ "I",
+ "Î",
+ "Ï",
+ "Ì",
+ "Í",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Â",
+ "Ã",
+ "Ă",
+ "À",
+ "Á",
+ "Ä",
+ "Æ",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S",
+ "Ș",
+ "SS",
+ "Ś",
+ "Š"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "ro",
+ "name": "Romanian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/rs.json b/data/osk-layouts/rs.json
new file mode 100644
index 0000000..7bdab9f
--- /dev/null
+++ b/data/osk-layouts/rs.json
@@ -0,0 +1,541 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "љ"
+ ],
+ [
+ "њ"
+ ],
+ [
+ "е",
+ "ѐ"
+ ],
+ [
+ "р"
+ ],
+ [
+ "т"
+ ],
+ [
+ "з"
+ ],
+ [
+ "у"
+ ],
+ [
+ "и",
+ "ѝ"
+ ],
+ [
+ "о"
+ ],
+ [
+ "п"
+ ],
+ [
+ "ш"
+ ]
+ ],
+ [
+ [
+ "а"
+ ],
+ [
+ "с"
+ ],
+ [
+ "д"
+ ],
+ [
+ "ф"
+ ],
+ [
+ "г"
+ ],
+ [
+ "х"
+ ],
+ [
+ "ј"
+ ],
+ [
+ "к"
+ ],
+ [
+ "л"
+ ],
+ [
+ "ч"
+ ],
+ [
+ "ћ"
+ ]
+ ],
+ [
+ [
+ "ѕ"
+ ],
+ [
+ "џ"
+ ],
+ [
+ "ц"
+ ],
+ [
+ "в"
+ ],
+ [
+ "б"
+ ],
+ [
+ "н"
+ ],
+ [
+ "м"
+ ],
+ [
+ "ђ"
+ ],
+ [
+ "ж"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Љ"
+ ],
+ [
+ "Њ"
+ ],
+ [
+ "Е",
+ "Ѐ"
+ ],
+ [
+ "Р"
+ ],
+ [
+ "Т"
+ ],
+ [
+ "З"
+ ],
+ [
+ "У"
+ ],
+ [
+ "И",
+ "Ѝ"
+ ],
+ [
+ "О"
+ ],
+ [
+ "П"
+ ],
+ [
+ "Ш"
+ ]
+ ],
+ [
+ [
+ "А"
+ ],
+ [
+ "С"
+ ],
+ [
+ "Д"
+ ],
+ [
+ "Ф"
+ ],
+ [
+ "Г"
+ ],
+ [
+ "Х"
+ ],
+ [
+ "Ј"
+ ],
+ [
+ "К"
+ ],
+ [
+ "Л"
+ ],
+ [
+ "Ч"
+ ],
+ [
+ "Ћ"
+ ]
+ ],
+ [
+ [
+ "Ѕ"
+ ],
+ [
+ "Џ"
+ ],
+ [
+ "Ц"
+ ],
+ [
+ "В"
+ ],
+ [
+ "Б"
+ ],
+ [
+ "Н"
+ ],
+ [
+ "М"
+ ],
+ [
+ "Ђ"
+ ],
+ [
+ "Ж"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "sr",
+ "name": "Serbian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/ru.json b/data/osk-layouts/ru.json
new file mode 100644
index 0000000..9126cb0
--- /dev/null
+++ b/data/osk-layouts/ru.json
@@ -0,0 +1,541 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "й"
+ ],
+ [
+ "ц"
+ ],
+ [
+ "у"
+ ],
+ [
+ "к"
+ ],
+ [
+ "е",
+ "ё"
+ ],
+ [
+ "н"
+ ],
+ [
+ "г"
+ ],
+ [
+ "ш"
+ ],
+ [
+ "щ"
+ ],
+ [
+ "з"
+ ],
+ [
+ "х"
+ ]
+ ],
+ [
+ [
+ "ф"
+ ],
+ [
+ "ы"
+ ],
+ [
+ "в"
+ ],
+ [
+ "а"
+ ],
+ [
+ "п"
+ ],
+ [
+ "р"
+ ],
+ [
+ "о"
+ ],
+ [
+ "л"
+ ],
+ [
+ "д"
+ ],
+ [
+ "ж"
+ ],
+ [
+ "э"
+ ]
+ ],
+ [
+ [
+ "я"
+ ],
+ [
+ "ч"
+ ],
+ [
+ "с"
+ ],
+ [
+ "м"
+ ],
+ [
+ "и"
+ ],
+ [
+ "т"
+ ],
+ [
+ "ь",
+ "ъ"
+ ],
+ [
+ "б"
+ ],
+ [
+ "ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Й"
+ ],
+ [
+ "Ц"
+ ],
+ [
+ "У"
+ ],
+ [
+ "К"
+ ],
+ [
+ "Е",
+ "Ё"
+ ],
+ [
+ "Н"
+ ],
+ [
+ "Г"
+ ],
+ [
+ "Ш"
+ ],
+ [
+ "Щ"
+ ],
+ [
+ "З"
+ ],
+ [
+ "Х"
+ ]
+ ],
+ [
+ [
+ "Ф"
+ ],
+ [
+ "Ы"
+ ],
+ [
+ "В"
+ ],
+ [
+ "А"
+ ],
+ [
+ "П"
+ ],
+ [
+ "Р"
+ ],
+ [
+ "О"
+ ],
+ [
+ "Л"
+ ],
+ [
+ "Д"
+ ],
+ [
+ "Ж"
+ ],
+ [
+ "Э"
+ ]
+ ],
+ [
+ [
+ "Я"
+ ],
+ [
+ "Ч"
+ ],
+ [
+ "С"
+ ],
+ [
+ "М"
+ ],
+ [
+ "И"
+ ],
+ [
+ "Т"
+ ],
+ [
+ "Ь",
+ "Ъ"
+ ],
+ [
+ "Б"
+ ],
+ [
+ "Ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "ru",
+ "name": "Russian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/se.json b/data/osk-layouts/se.json
new file mode 100644
index 0000000..513a0b8
--- /dev/null
+++ b/data/osk-layouts/se.json
@@ -0,0 +1,624 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ê",
+ "ë",
+ "ę"
+ ],
+ [
+ "r",
+ "ř"
+ ],
+ [
+ "t",
+ "ť",
+ "þ"
+ ],
+ [
+ "y",
+ "ý",
+ "ÿ",
+ "ü"
+ ],
+ [
+ "u",
+ "ü",
+ "ú",
+ "ù",
+ "û",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ì",
+ "î",
+ "ï"
+ ],
+ [
+ "o",
+ "ó",
+ "ò",
+ "ô",
+ "õ",
+ "ō"
+ ],
+ [
+ "p"
+ ],
+ [
+ "å"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "à",
+ "â",
+ "ą",
+ "ã"
+ ],
+ [
+ "s",
+ "ś",
+ "š",
+ "ş",
+ "ß"
+ ],
+ [
+ "d",
+ "ð",
+ "ď"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l",
+ "ł"
+ ],
+ [
+ "ö",
+ "ø",
+ "œ"
+ ],
+ [
+ "ä",
+ "æ"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ź",
+ "ž",
+ "ż"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "ć",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ń",
+ "ñ",
+ "ň"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ê",
+ "Ë",
+ "Ę"
+ ],
+ [
+ "R",
+ "Ř"
+ ],
+ [
+ "T",
+ "Ť",
+ "Þ"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ÿ",
+ "Ü"
+ ],
+ [
+ "U",
+ "Ü",
+ "Ú",
+ "Ù",
+ "Û",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ì",
+ "Î",
+ "Ï"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ò",
+ "Ô",
+ "Õ",
+ "Ō"
+ ],
+ [
+ "P"
+ ],
+ [
+ "Å"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "À",
+ "Â",
+ "Ą",
+ "Ã"
+ ],
+ [
+ "S",
+ "Ś",
+ "Š",
+ "Ş",
+ "SS"
+ ],
+ [
+ "D",
+ "Ð",
+ "Ď"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L",
+ "Ł"
+ ],
+ [
+ "Ö",
+ "Ø",
+ "Œ"
+ ],
+ [
+ "Ä",
+ "Æ"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ź",
+ "Ž",
+ "Ż"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Ć",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ń",
+ "Ñ",
+ "Ň"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "sv",
+ "name": "Swedish"
+} \ No newline at end of file
diff --git a/data/osk-layouts/si.json b/data/osk-layouts/si.json
new file mode 100644
index 0000000..f5c99c0
--- /dev/null
+++ b/data/osk-layouts/si.json
@@ -0,0 +1,518 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u"
+ ],
+ [
+ "i"
+ ],
+ [
+ "o"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a"
+ ],
+ [
+ "s",
+ "š"
+ ],
+ [
+ "d",
+ "đ"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ž"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "č",
+ "ć"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U"
+ ],
+ [
+ "I"
+ ],
+ [
+ "O"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A"
+ ],
+ [
+ "S",
+ "Š"
+ ],
+ [
+ "D",
+ "Đ"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ž"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Č",
+ "Ć"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "sl",
+ "name": "Slovenian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/sk.json b/data/osk-layouts/sk.json
new file mode 100644
index 0000000..678232b
--- /dev/null
+++ b/data/osk-layouts/sk.json
@@ -0,0 +1,648 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "ě",
+ "ē",
+ "ė",
+ "è",
+ "ê",
+ "ë",
+ "ę"
+ ],
+ [
+ "r",
+ "ŕ",
+ "ř",
+ "ŗ"
+ ],
+ [
+ "t",
+ "ť",
+ "ţ"
+ ],
+ [
+ "y",
+ "ý",
+ "ÿ"
+ ],
+ [
+ "u",
+ "ú",
+ "ů",
+ "ü",
+ "ū",
+ "ų",
+ "ù",
+ "û",
+ "ű"
+ ],
+ [
+ "i",
+ "í",
+ "ī",
+ "į",
+ "ì",
+ "î",
+ "ï",
+ "ı"
+ ],
+ [
+ "o",
+ "ô",
+ "ó",
+ "ö",
+ "ò",
+ "õ",
+ "œ",
+ "ő",
+ "ø"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "ä",
+ "ā",
+ "à",
+ "â",
+ "ã",
+ "å",
+ "æ",
+ "ą"
+ ],
+ [
+ "s",
+ "š",
+ "ß",
+ "ś",
+ "ş"
+ ],
+ [
+ "d",
+ "ď"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g",
+ "ģ",
+ "ğ"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k",
+ "ķ"
+ ],
+ [
+ "l",
+ "ľ",
+ "ĺ",
+ "ļ",
+ "ł"
+ ]
+ ],
+ [
+ [
+ "z",
+ "ž",
+ "ż",
+ "ź"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "č",
+ "ç",
+ "ć"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ň",
+ "ņ",
+ "ñ",
+ "ń",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "Ě",
+ "Ē",
+ "Ė",
+ "È",
+ "Ê",
+ "Ë",
+ "Ę"
+ ],
+ [
+ "R",
+ "Ŕ",
+ "Ř",
+ "Ŗ"
+ ],
+ [
+ "T",
+ "Ť",
+ "Ţ"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ÿ"
+ ],
+ [
+ "U",
+ "Ú",
+ "Ů",
+ "Ü",
+ "Ū",
+ "Ų",
+ "Ù",
+ "Û",
+ "Ű"
+ ],
+ [
+ "I",
+ "Í",
+ "Ī",
+ "Į",
+ "Ì",
+ "Î",
+ "Ï",
+ "I"
+ ],
+ [
+ "O",
+ "Ô",
+ "Ó",
+ "Ö",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ő",
+ "Ø"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "Ä",
+ "Ā",
+ "À",
+ "Â",
+ "Ã",
+ "Å",
+ "Æ",
+ "Ą"
+ ],
+ [
+ "S",
+ "Š",
+ "SS",
+ "Ś",
+ "Ş"
+ ],
+ [
+ "D",
+ "Ď"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G",
+ "Ģ",
+ "Ğ"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K",
+ "Ķ"
+ ],
+ [
+ "L",
+ "Ľ",
+ "Ĺ",
+ "Ļ",
+ "Ł"
+ ]
+ ],
+ [
+ [
+ "Z",
+ "Ž",
+ "Ż",
+ "Ź"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Č",
+ "Ç",
+ "Ć"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ň",
+ "Ņ",
+ "Ñ",
+ "Ń",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "sk",
+ "name": "Slovak"
+} \ No newline at end of file
diff --git a/data/osk-layouts/th.json b/data/osk-layouts/th.json
new file mode 100644
index 0000000..c229a64
--- /dev/null
+++ b/data/osk-layouts/th.json
@@ -0,0 +1,472 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "ๅ"
+ ],
+ [
+ "/",
+ "๑"
+ ],
+ [
+ "_",
+ "๒"
+ ],
+ [
+ "ภ",
+ "๓"
+ ],
+ [
+ "ถ",
+ "๔"
+ ],
+ [
+ "ุ"
+ ],
+ [
+ "ึ"
+ ],
+ [
+ "ค",
+ "๕"
+ ],
+ [
+ "ต",
+ "๖"
+ ],
+ [
+ "จ",
+ "๗"
+ ],
+ [
+ "ข",
+ "๘"
+ ],
+ [
+ "ช",
+ "๙"
+ ]
+ ],
+ [
+ [
+ "ๆ",
+ "๐"
+ ],
+ [
+ "ไ"
+ ],
+ [
+ "ำ"
+ ],
+ [
+ "พ"
+ ],
+ [
+ "ะ"
+ ],
+ [
+ "ั"
+ ],
+ [
+ "ี"
+ ],
+ [
+ "ร"
+ ],
+ [
+ "น"
+ ],
+ [
+ "ย"
+ ],
+ [
+ "บ"
+ ],
+ [
+ "ล"
+ ]
+ ],
+ [
+ [
+ "ฟ"
+ ],
+ [
+ "ห"
+ ],
+ [
+ "ก"
+ ],
+ [
+ "ด"
+ ],
+ [
+ "เ"
+ ],
+ [
+ "้"
+ ],
+ [
+ "่"
+ ],
+ [
+ "า"
+ ],
+ [
+ "ส"
+ ],
+ [
+ "ว"
+ ],
+ [
+ "ง"
+ ],
+ [
+ "ฃ"
+ ]
+ ],
+ [
+ [
+ "ผ"
+ ],
+ [
+ "ป"
+ ],
+ [
+ "แ"
+ ],
+ [
+ "อ"
+ ],
+ [
+ "ิ"
+ ],
+ [
+ "ื"
+ ],
+ [
+ "ท"
+ ],
+ [
+ "ม"
+ ],
+ [
+ "ใ"
+ ],
+ [
+ "ฝ"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "฿",
+ "$",
+ "¢",
+ "€",
+ "£",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "€"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "th",
+ "name": "Thai"
+} \ No newline at end of file
diff --git a/data/osk-layouts/tr.json b/data/osk-layouts/tr.json
new file mode 100644
index 0000000..b3786cc
--- /dev/null
+++ b/data/osk-layouts/tr.json
@@ -0,0 +1,566 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "ü",
+ "û",
+ "ù",
+ "ú",
+ "ū"
+ ],
+ [
+ "i",
+ "ı",
+ "î",
+ "ï",
+ "ì",
+ "í",
+ "į",
+ "ī"
+ ],
+ [
+ "o",
+ "ö",
+ "ô",
+ "œ",
+ "ò",
+ "ó",
+ "õ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "â"
+ ],
+ [
+ "s",
+ "ş",
+ "ß",
+ "ś",
+ "š"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g",
+ "ğ"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç",
+ "ć",
+ "č"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Ü",
+ "Û",
+ "Ù",
+ "Ú",
+ "Ū"
+ ],
+ [
+ "İ",
+ "I",
+ "Î",
+ "Ï",
+ "Ì",
+ "Í",
+ "Į",
+ "Ī"
+ ],
+ [
+ "O",
+ "Ö",
+ "Ô",
+ "Œ",
+ "Ò",
+ "Ó",
+ "Õ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Â"
+ ],
+ [
+ "S",
+ "Ş",
+ "SS",
+ "Ś",
+ "Š"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G",
+ "Ğ"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç",
+ "Ć",
+ "Č"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "€",
+ "¢",
+ "£",
+ "$",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "tr",
+ "name": "Turkish"
+} \ No newline at end of file
diff --git a/data/osk-layouts/ua.json b/data/osk-layouts/ua.json
new file mode 100644
index 0000000..1185687
--- /dev/null
+++ b/data/osk-layouts/ua.json
@@ -0,0 +1,545 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "й"
+ ],
+ [
+ "ц"
+ ],
+ [
+ "у"
+ ],
+ [
+ "к"
+ ],
+ [
+ "е"
+ ],
+ [
+ "н"
+ ],
+ [
+ "г",
+ "ґ"
+ ],
+ [
+ "ш"
+ ],
+ [
+ "щ"
+ ],
+ [
+ "з"
+ ],
+ [
+ "х"
+ ]
+ ],
+ [
+ [
+ "ф"
+ ],
+ [
+ "і",
+ "ї"
+ ],
+ [
+ "в"
+ ],
+ [
+ "а"
+ ],
+ [
+ "п"
+ ],
+ [
+ "р"
+ ],
+ [
+ "о"
+ ],
+ [
+ "л"
+ ],
+ [
+ "д"
+ ],
+ [
+ "ж"
+ ],
+ [
+ "є"
+ ]
+ ],
+ [
+ [
+ "я"
+ ],
+ [
+ "ч"
+ ],
+ [
+ "с"
+ ],
+ [
+ "м"
+ ],
+ [
+ "и"
+ ],
+ [
+ "т"
+ ],
+ [
+ "ь",
+ "ъ"
+ ],
+ [
+ "б"
+ ],
+ [
+ "ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Й"
+ ],
+ [
+ "Ц"
+ ],
+ [
+ "У"
+ ],
+ [
+ "К"
+ ],
+ [
+ "Е"
+ ],
+ [
+ "Н"
+ ],
+ [
+ "Г",
+ "Ґ"
+ ],
+ [
+ "Ш"
+ ],
+ [
+ "Щ"
+ ],
+ [
+ "З"
+ ],
+ [
+ "Х"
+ ]
+ ],
+ [
+ [
+ "Ф"
+ ],
+ [
+ "І",
+ "Ї"
+ ],
+ [
+ "В"
+ ],
+ [
+ "А"
+ ],
+ [
+ "П"
+ ],
+ [
+ "Р"
+ ],
+ [
+ "О"
+ ],
+ [
+ "Л"
+ ],
+ [
+ "Д"
+ ],
+ [
+ "Ж"
+ ],
+ [
+ "Є"
+ ]
+ ],
+ [
+ [
+ "Я"
+ ],
+ [
+ "Ч"
+ ],
+ [
+ "С"
+ ],
+ [
+ "М"
+ ],
+ [
+ "И"
+ ],
+ [
+ "Т"
+ ],
+ [
+ "Ь",
+ "Ъ"
+ ],
+ [
+ "Б"
+ ],
+ [
+ "Ю"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "₴",
+ "$",
+ "¢",
+ "€",
+ "£",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "€"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "uk",
+ "name": "Ukrainian"
+} \ No newline at end of file
diff --git a/data/osk-layouts/uk.json b/data/osk-layouts/uk.json
new file mode 100644
index 0000000..c36a723
--- /dev/null
+++ b/data/osk-layouts/uk.json
@@ -0,0 +1,576 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "è",
+ "é",
+ "ê",
+ "ë",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "û",
+ "ü",
+ "ù",
+ "ú",
+ "ū"
+ ],
+ [
+ "i",
+ "î",
+ "ï",
+ "í",
+ "ī",
+ "ì"
+ ],
+ [
+ "o",
+ "ô",
+ "ö",
+ "ò",
+ "ó",
+ "œ",
+ "ø",
+ "ō",
+ "õ"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "à",
+ "á",
+ "â",
+ "ä",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s",
+ "ß"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "È",
+ "É",
+ "Ê",
+ "Ë",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Û",
+ "Ü",
+ "Ù",
+ "Ú",
+ "Ū"
+ ],
+ [
+ "I",
+ "Î",
+ "Ï",
+ "Í",
+ "Ī",
+ "Ì"
+ ],
+ [
+ "O",
+ "Ô",
+ "Ö",
+ "Ò",
+ "Ó",
+ "Œ",
+ "Ø",
+ "Ō",
+ "Õ"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "À",
+ "Á",
+ "Â",
+ "Ä",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S",
+ "SS"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "£",
+ "¢",
+ "$",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "en-GB",
+ "name": "English Great Britain"
+} \ No newline at end of file
diff --git a/data/osk-layouts/us.json b/data/osk-layouts/us.json
new file mode 100644
index 0000000..94dd6d3
--- /dev/null
+++ b/data/osk-layouts/us.json
@@ -0,0 +1,575 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "è",
+ "é",
+ "ê",
+ "ë",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y"
+ ],
+ [
+ "u",
+ "û",
+ "ü",
+ "ù",
+ "ú",
+ "ū"
+ ],
+ [
+ "i",
+ "î",
+ "ï",
+ "í",
+ "ī",
+ "ì"
+ ],
+ [
+ "o",
+ "ô",
+ "ö",
+ "ò",
+ "ó",
+ "œ",
+ "ø",
+ "ō",
+ "õ"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "à",
+ "á",
+ "â",
+ "ä",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s",
+ "ß"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c",
+ "ç"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "È",
+ "É",
+ "Ê",
+ "Ë",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y"
+ ],
+ [
+ "U",
+ "Û",
+ "Ü",
+ "Ù",
+ "Ú",
+ "Ū"
+ ],
+ [
+ "I",
+ "Î",
+ "Ï",
+ "Í",
+ "Ī",
+ "Ì"
+ ],
+ [
+ "O",
+ "Ô",
+ "Ö",
+ "Ò",
+ "Ó",
+ "Œ",
+ "Ø",
+ "Ō",
+ "Õ"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "À",
+ "Á",
+ "Â",
+ "Ä",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S",
+ "SS"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C",
+ "Ç"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "en",
+ "name": "English United States"
+} \ No newline at end of file
diff --git a/data/osk-layouts/vn.json b/data/osk-layouts/vn.json
new file mode 100644
index 0000000..4c7c9b4
--- /dev/null
+++ b/data/osk-layouts/vn.json
@@ -0,0 +1,643 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "è",
+ "é",
+ "ẻ",
+ "ẽ",
+ "ẹ",
+ "ê",
+ "ề",
+ "ế",
+ "ể",
+ "ễ",
+ "ệ"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "ỳ",
+ "ý",
+ "ỷ",
+ "ỹ",
+ "ỵ"
+ ],
+ [
+ "u",
+ "ù",
+ "ú",
+ "ủ",
+ "ũ",
+ "ụ",
+ "ư",
+ "ừ",
+ "ứ",
+ "ử",
+ "ữ",
+ "ự"
+ ],
+ [
+ "i",
+ "ì",
+ "í",
+ "ỉ",
+ "ĩ",
+ "ị"
+ ],
+ [
+ "o",
+ "ò",
+ "ó",
+ "ỏ",
+ "õ",
+ "ọ",
+ "ô",
+ "ồ",
+ "ố",
+ "ổ",
+ "ỗ",
+ "ộ",
+ "ơ",
+ "ờ",
+ "ớ",
+ "ở",
+ "ỡ",
+ "ợ"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "à",
+ "á",
+ "ả",
+ "ã",
+ "ạ",
+ "ă",
+ "ằ",
+ "ắ",
+ "ẳ",
+ "ẵ",
+ "ặ",
+ "â",
+ "ầ",
+ "ấ",
+ "ẩ",
+ "ẫ",
+ "ậ"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d",
+ "đ"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "È",
+ "É",
+ "Ẻ",
+ "Ẽ",
+ "Ẹ",
+ "Ê",
+ "Ề",
+ "Ế",
+ "Ể",
+ "Ễ",
+ "Ệ"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "Ỳ",
+ "Ý",
+ "Ỷ",
+ "Ỹ",
+ "Ỵ"
+ ],
+ [
+ "U",
+ "Ù",
+ "Ú",
+ "Ủ",
+ "Ũ",
+ "Ụ",
+ "Ư",
+ "Ừ",
+ "Ứ",
+ "Ử",
+ "Ữ",
+ "Ự"
+ ],
+ [
+ "I",
+ "Ì",
+ "Í",
+ "Ỉ",
+ "Ĩ",
+ "Ị"
+ ],
+ [
+ "O",
+ "Ò",
+ "Ó",
+ "Ỏ",
+ "Õ",
+ "Ọ",
+ "Ô",
+ "Ồ",
+ "Ố",
+ "Ổ",
+ "Ỗ",
+ "Ộ",
+ "Ơ",
+ "Ờ",
+ "Ớ",
+ "Ở",
+ "Ỡ",
+ "Ợ"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "À",
+ "Á",
+ "Ả",
+ "Ã",
+ "Ạ",
+ "Ă",
+ "Ằ",
+ "Ắ",
+ "Ẳ",
+ "Ẵ",
+ "Ặ",
+ "Â",
+ "Ầ",
+ "Ấ",
+ "Ẩ",
+ "Ẫ",
+ "Ậ"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D",
+ "Đ"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "₫",
+ "$",
+ "¢",
+ "€",
+ "£",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "€"
+ ],
+ [
+ "$",
+ "¢"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "vi",
+ "name": "Vietnamese"
+} \ No newline at end of file
diff --git a/data/osk-layouts/za.json b/data/osk-layouts/za.json
new file mode 100644
index 0000000..ccd2447
--- /dev/null
+++ b/data/osk-layouts/za.json
@@ -0,0 +1,589 @@
+{
+ "levels": [
+ {
+ "level": "",
+ "mode": "default",
+ "rows": [
+ [
+ [
+ "q"
+ ],
+ [
+ "w"
+ ],
+ [
+ "e",
+ "é",
+ "è",
+ "ê",
+ "ë",
+ "ę",
+ "ė",
+ "ē"
+ ],
+ [
+ "r"
+ ],
+ [
+ "t"
+ ],
+ [
+ "y",
+ "ý",
+ "ŷ",
+ "ÿ",
+ "ij"
+ ],
+ [
+ "u",
+ "ú",
+ "û",
+ "ü",
+ "ù",
+ "ū"
+ ],
+ [
+ "i",
+ "í",
+ "ì",
+ "ï",
+ "î",
+ "į",
+ "ī",
+ "ij"
+ ],
+ [
+ "o",
+ "ó",
+ "ô",
+ "ö",
+ "ò",
+ "õ",
+ "œ",
+ "ø",
+ "ō"
+ ],
+ [
+ "p"
+ ]
+ ],
+ [
+ [
+ "a",
+ "á",
+ "â",
+ "ä",
+ "à",
+ "æ",
+ "ã",
+ "å",
+ "ā"
+ ],
+ [
+ "s"
+ ],
+ [
+ "d"
+ ],
+ [
+ "f"
+ ],
+ [
+ "g"
+ ],
+ [
+ "h"
+ ],
+ [
+ "j"
+ ],
+ [
+ "k"
+ ],
+ [
+ "l"
+ ]
+ ],
+ [
+ [
+ "z"
+ ],
+ [
+ "x"
+ ],
+ [
+ "c"
+ ],
+ [
+ "v"
+ ],
+ [
+ "b"
+ ],
+ [
+ "n",
+ "ñ",
+ "ń"
+ ],
+ [
+ "m"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "shift",
+ "mode": "latched",
+ "rows": [
+ [
+ [
+ "Q"
+ ],
+ [
+ "W"
+ ],
+ [
+ "E",
+ "É",
+ "È",
+ "Ê",
+ "Ë",
+ "Ę",
+ "Ė",
+ "Ē"
+ ],
+ [
+ "R"
+ ],
+ [
+ "T"
+ ],
+ [
+ "Y",
+ "Ý",
+ "Ŷ",
+ "Ÿ",
+ "IJ"
+ ],
+ [
+ "U",
+ "Ú",
+ "Û",
+ "Ü",
+ "Ù",
+ "Ū"
+ ],
+ [
+ "I",
+ "Í",
+ "Ì",
+ "Ï",
+ "Î",
+ "Į",
+ "Ī",
+ "IJ"
+ ],
+ [
+ "O",
+ "Ó",
+ "Ô",
+ "Ö",
+ "Ò",
+ "Õ",
+ "Œ",
+ "Ø",
+ "Ō"
+ ],
+ [
+ "P"
+ ]
+ ],
+ [
+ [
+ "A",
+ "Á",
+ "Â",
+ "Ä",
+ "À",
+ "Æ",
+ "Ã",
+ "Å",
+ "Ā"
+ ],
+ [
+ "S"
+ ],
+ [
+ "D"
+ ],
+ [
+ "F"
+ ],
+ [
+ "G"
+ ],
+ [
+ "H"
+ ],
+ [
+ "J"
+ ],
+ [
+ "K"
+ ],
+ [
+ "L"
+ ]
+ ],
+ [
+ [
+ "Z"
+ ],
+ [
+ "X"
+ ],
+ [
+ "C"
+ ],
+ [
+ "V"
+ ],
+ [
+ "B"
+ ],
+ [
+ "N",
+ "Ñ",
+ "Ń"
+ ],
+ [
+ "M"
+ ]
+ ],
+ [
+ [
+ ","
+ ],
+ [
+ " "
+ ],
+ [
+ ".",
+ "#",
+ "!",
+ ",",
+ "?",
+ "-",
+ ":",
+ "'",
+ "@"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "1",
+ "¹",
+ "½",
+ "⅓",
+ "¼",
+ "⅛"
+ ],
+ [
+ "2",
+ "²",
+ "⅔"
+ ],
+ [
+ "3",
+ "³",
+ "¾",
+ "⅜"
+ ],
+ [
+ "4",
+ "⁴"
+ ],
+ [
+ "5",
+ "⅝"
+ ],
+ [
+ "6"
+ ],
+ [
+ "7",
+ "⅞"
+ ],
+ [
+ "8"
+ ],
+ [
+ "9"
+ ],
+ [
+ "0",
+ "ⁿ",
+ "∅"
+ ]
+ ],
+ [
+ [
+ "@"
+ ],
+ [
+ "#"
+ ],
+ [
+ "$",
+ "¢",
+ "£",
+ "€",
+ "¥",
+ "₱"
+ ],
+ [
+ "%",
+ "‰"
+ ],
+ [
+ "&"
+ ],
+ [
+ "-",
+ "_",
+ "–",
+ "—",
+ "·"
+ ],
+ [
+ "+",
+ "±"
+ ],
+ [
+ "(",
+ "<",
+ "{",
+ "["
+ ],
+ [
+ ")",
+ ">",
+ "}",
+ "]"
+ ]
+ ],
+ [
+ [
+ "*",
+ "†",
+ "‡",
+ "★"
+ ],
+ [
+ "\"",
+ "“",
+ "”",
+ "«",
+ "»"
+ ],
+ [
+ "'",
+ "‘",
+ "’",
+ "‹",
+ "›"
+ ],
+ [
+ ":"
+ ],
+ [
+ ";"
+ ],
+ [
+ "!",
+ "¡"
+ ],
+ [
+ "?",
+ "¿"
+ ]
+ ],
+ [
+ [
+ "_"
+ ],
+ [
+ "/"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ },
+ {
+ "level": "opt+shift",
+ "mode": "locked",
+ "rows": [
+ [
+ [
+ "~"
+ ],
+ [
+ "`"
+ ],
+ [
+ "|"
+ ],
+ [
+ "•",
+ "♪",
+ "♥",
+ "♠",
+ "♦",
+ "♣"
+ ],
+ [
+ "√"
+ ],
+ [
+ "Π",
+ "π"
+ ],
+ [
+ "÷"
+ ],
+ [
+ "×"
+ ],
+ [
+ "¶",
+ "§"
+ ],
+ [
+ "∆"
+ ]
+ ],
+ [
+ [
+ "£"
+ ],
+ [
+ "¢"
+ ],
+ [
+ "€"
+ ],
+ [
+ "¥"
+ ],
+ [
+ "^",
+ "↑",
+ "↓",
+ "←",
+ "→"
+ ],
+ [
+ "°",
+ "′",
+ "″"
+ ],
+ [
+ "=",
+ "≠",
+ "≈",
+ "∞"
+ ],
+ [
+ "{"
+ ],
+ [
+ "}"
+ ]
+ ],
+ [
+ [
+ "\\"
+ ],
+ [
+ "©"
+ ],
+ [
+ "®"
+ ],
+ [
+ "™"
+ ],
+ [
+ "℅"
+ ],
+ [
+ "["
+ ],
+ [
+ "]"
+ ]
+ ],
+ [
+ [
+ "<",
+ "‹",
+ "≤",
+ "«"
+ ],
+ [
+ ">",
+ "›",
+ "≥",
+ "»"
+ ],
+ [
+ " "
+ ],
+ [
+ ","
+ ],
+ [
+ ".",
+ "…"
+ ]
+ ]
+ ]
+ }
+ ],
+ "locale": "af",
+ "name": "Afrikaans"
+} \ No newline at end of file
diff --git a/data/perf-background.xml.in b/data/perf-background.xml.in
new file mode 100644
index 0000000..752a552
--- /dev/null
+++ b/data/perf-background.xml.in
@@ -0,0 +1,31 @@
+<!-- With an animated background, performance will differ depending on whether
+ one layer or two layers are being blended together. This messes up our
+ benchmarks. We could just benchmark a single image, but since blended
+ images are present for much of the day with the GNOME default background,
+ we want to make sure that also performs well; for that reason we ship
+ an "animated" background that animates super-slowly to use during
+ performance tests; it will be in the blended state until 2030. -->
+<background>
+ <starttime>
+ <year>1990</year>
+ <month>1</month>
+ <day>1</day>
+ <hour>0</hour>
+ <minute>00</minute>
+ <second>00</second>
+ </starttime>
+
+<!-- One transition that takes 40 years -->
+<transition type="overlay">
+<duration>1261440000.0</duration>
+<from>@datadir@/backgrounds/gnome/adwaita-morning.jpg</from>
+<to>@datadir@/backgrounds/gnome/adwaita-day.jpg</to>
+</transition>
+
+<!-- A single slide doesn't work, so another slide for 1 minute after 40 years -->
+<static>
+<duration>60</duration>
+<file>/usr/share/backgrounds/gnome/Sandstone.jpg</file>
+</static>
+
+</background>
diff --git a/data/theme/README.md b/data/theme/README.md
new file mode 100644
index 0000000..192dc65
--- /dev/null
+++ b/data/theme/README.md
@@ -0,0 +1,32 @@
+## Summary
+
+Do not edit the CSS directly, edit the source SCSS files and the CSS files
+will be generated automatically when building with meson + ninja and left
+inside the build directory to be incorporated into the gresource XML (you'll
+need to have sassc installed).
+
+## How to tweak the theme
+
+Adwaita is a complex theme, so to keep it maintainable it's written and
+processed in SASS, the generated CSS is then transformed into a gresource
+file during gtk build and used at runtime in a non-legible or editable form.
+
+It is very likely your change will happen in the [_common.scss][common] file.
+That's where all the widget selectors are defined. Here's a rundown of
+the "supporting" stylesheets, that are unlikely to be the right place
+for a drive by stylesheet fix:
+
+| File | Description |
+| ------------------------ | ----------------- |
+| [_colors.scss][colors] | global color definitions. We keep the number of defined colors to a necessary minimum, most colors are derived from a handful of basics. It is an exact copy of the gtk+ counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell default. |
+| [_drawing.scss][drawing] | drawing helper mixings/functions to allow easier definition of widget drawing under specific context. This is why Adwaita isn't 15000 LOC. |
+| [_common.scss][common] | actual definitions of style for each widget. This is where you are likely to add/remove your changes. |
+
+You can read about SASS on its [web page][sass-web]. Once you make your
+changes to the [_common.scss][common] file, you can run ninja to generate the
+final CSS files.
+
+[common]: data/theme/gnome-shell-sass/_common.scss
+[colors]: data/theme/gnome-shell-sass/_colors.scss
+[drawing]: data/theme/gnome-shell-sass/_drawing.scss
+[sass-web]: http://sass-lang.com/documentation/
diff --git a/data/theme/calendar-today.svg b/data/theme/calendar-today.svg
new file mode 100644
index 0000000..5e77084
--- /dev/null
+++ b/data/theme/calendar-today.svg
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="24"
+ id="svg10621"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="calendar-today.svg">
+ <defs
+ id="defs10623">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient34508-1-3"
+ id="radialGradient99561-1"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
+ cx="51"
+ cy="30"
+ fx="51"
+ fy="30"
+ r="42" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient34508-1-3">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop34510-1-9" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop34512-4-5" />
+ </linearGradient>
+ <radialGradient
+ r="42"
+ fy="30"
+ fx="51"
+ cy="30"
+ cx="51"
+ gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient10592"
+ xlink:href="#linearGradient34508-1-3"
+ inkscape:collect="always" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient34508-1-3"
+ id="radialGradient3770"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
+ cx="51"
+ cy="30"
+ fx="51"
+ fy="30"
+ r="42" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient34508-1-3"
+ id="radialGradient3001"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
+ cx="51"
+ cy="30"
+ fx="51"
+ fy="30"
+ r="42" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient34508-1-3"
+ id="radialGradient3007"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
+ cx="51"
+ cy="30"
+ fx="51"
+ fy="30"
+ r="42" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient34508-1-3"
+ id="radialGradient3067"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
+ cx="51"
+ cy="30"
+ fx="51"
+ fy="30"
+ r="42" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient34508-1-3"
+ id="radialGradient3072"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
+ cx="51"
+ cy="30"
+ fx="51"
+ fy="30"
+ r="42" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient34508-1-3"
+ id="radialGradient2997"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
+ cx="51"
+ cy="30"
+ fx="51"
+ fy="30"
+ r="42" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#000000"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="-23.537329"
+ inkscape:cy="-31.442864"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="2133"
+ inkscape:window-height="1241"
+ inkscape:window-x="238"
+ inkscape:window-y="88"
+ inkscape:window-maximized="0"
+ borderlayer="true"
+ inkscape:showpageshadow="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3109"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata10626">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-469.08263,-537.99307)">
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:0.23756906;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="path7305"
+ cx="481.57138"
+ cy="559.4649"
+ r="1.5" />
+ </g>
+</svg>
diff --git a/data/theme/checkbox-focused.svg b/data/theme/checkbox-focused.svg
new file mode 100644
index 0000000..9d15354
--- /dev/null
+++ b/data/theme/checkbox-focused.svg
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="22"
+ id="svg3199"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="checkbox.svg">
+ <defs
+ id="defs3201">
+ <linearGradient
+ id="linearGradient15404"
+ inkscape:collect="always">
+ <stop
+ id="stop15406"
+ offset="0"
+ style="stop-color:#515151;stop-opacity:1" />
+ <stop
+ id="stop15408"
+ offset="1"
+ style="stop-color:#292929;stop-opacity:1" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3207" />
+ <inkscape:perspective
+ id="perspective3187"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5872-5-1"
+ id="linearGradient5891-0-4"
+ gradientUnits="userSpaceOnUse"
+ x1="205.84143"
+ y1="246.7094"
+ x2="206.74803"
+ y2="231.24142" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5872-5-1">
+ <stop
+ style="stop-color:#0b2e52;stop-opacity:1"
+ offset="0"
+ id="stop5874-4-4" />
+ <stop
+ style="stop-color:#1862af;stop-opacity:1"
+ offset="1"
+ id="stop5876-0-5" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5837-4-6"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect14768"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5884-4-7"
+ is_visible="true" />
+ <linearGradient
+ y2="-388.72955"
+ x2="-93.031357"
+ y1="-396.34738"
+ x1="-93.031357"
+ gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.685418)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient14219"
+ xlink:href="#linearGradient15404"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10013-4-63-6">
+ <stop
+ style="stop-color:#333333;stop-opacity:1;"
+ offset="0"
+ id="stop10015-2-76-1" />
+ <stop
+ style="stop-color:#292929;stop-opacity:1"
+ offset="1"
+ id="stop10017-46-15-8" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10597-5">
+ <stop
+ style="stop-color:#16191a;stop-opacity:1;"
+ offset="0"
+ id="stop10599-2" />
+ <stop
+ style="stop-color:#2b3133;stop-opacity:1"
+ offset="1"
+ id="stop10601-5" />
+ </linearGradient>
+ <linearGradient
+ y2="-322.16354"
+ x2="921.22498"
+ y1="-330.05121"
+ x1="921.32812"
+ gradientTransform="matrix(1.5918367,0,0,0.85714285,-1456.5464,275.45191)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient15374"
+ xlink:href="#linearGradient10013-4-63-6"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1199.9852,216.38048)"
+ y2="-227.07961"
+ x2="1203.9177"
+ y1="-217.56708"
+ x1="1203.9177"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient15376"
+ xlink:href="#linearGradient10597-5"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5581-5-2-4-6-8-7-35-8"
+ id="linearGradient11811"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.0317573,0,0,1.0053174,-102.66338,-0.82153381)"
+ x1="63.568954"
+ y1="127.16142"
+ x2="63.568954"
+ y2="152.6618" />
+ <linearGradient
+ id="linearGradient5581-5-2-4-6-8-7-35-8">
+ <stop
+ id="stop5583-0-92-8-0-7-6-5-1"
+ offset="0"
+ style="stop-color:#454c4c;stop-opacity:1;" />
+ <stop
+ style="stop-color:#393f3f;stop-opacity:1;"
+ offset="0.40000001"
+ id="stop5585-4-7-2-7-9-9-92-0" />
+ <stop
+ id="stop5587-6-7-2-0-3-1-21-5"
+ offset="1"
+ style="stop-color:#2d3232;stop-opacity:1;" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#a2a2a2"
+ bordercolor="#2d2d2d"
+ borderopacity="1"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="9.6447897"
+ inkscape:cy="12.591409"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1412"
+ inkscape:window-height="1067"
+ inkscape:window-x="184"
+ inkscape:window-y="233"
+ inkscape:window-maximized="0"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-bbox="true"
+ showborder="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid14843"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3204">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-342.5,-521.36218)">
+ <g
+ style="display:inline"
+ id="use5671"
+ transform="matrix(1.3594109,0,0,1.3564242,319.2059,481.99447)">
+ <rect
+ transform="matrix(0.47304779,0,0,0.4807373,-6.3607039,-29.396216)"
+ rx="4.4136767"
+ y="125.3458"
+ x="50.440369"
+ height="29.154205"
+ width="29.559635"
+ id="rect11803"
+ style="color:#000000;fill:url(#linearGradient11811);fill-opacity:1;stroke:#3465a4;stroke-width:1.54426003000000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ ry="4.4233952" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11809"
+ d="m 17.87105,33.844107 0,-0.773112 c 0,-1.031264 0.807171,-1.836142 1.811982,-1.836142 l 9.612456,0 c 1.004811,0 1.787822,0.804878 1.787822,1.836142 l 0,0.773112 c 0,-1.031264 -0.783011,-1.836142 -1.787822,-1.836142 l -9.612456,0 c -1.004811,0 -1.811982,0.804878 -1.811982,1.836142 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="csssscssc" />
+ <path
+ sodipodi:nodetypes="csssscssc"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 17.87105,41.158551 0,0.773112 c 0,1.031264 0.807171,1.836142 1.811982,1.836142 l 9.612456,0 c 1.004811,0 1.787822,-0.804878 1.787822,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
+ id="path11867"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11869"
+ d="m 17.87105,41.895784 0,0.773112 c 0,1.031264 0.644622,1.836142 1.649433,1.836142 l 10.067593,0 c 1.004811,0 1.495234,-0.804878 1.495234,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#000000;fill-opacity:0.85253451;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="csssscssc" />
+ </g>
+ <rect
+ style="color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect17347"
+ width="21.943846"
+ height="21.943846"
+ x="342.29913"
+ y="521.58435" />
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:0.8;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 359.97505,524.8252 -7.88606,7.71465 -2.57155,-2.57155 -2.91442,-0.0427 0,2.35727 4.02875,3.98587 c 0.80342,0.80309 2.111,0.80309 2.91442,0 l 8.18609,-8.22894 0,-0.38573 c 0,-1.24128 0.19944,-1.76801 -0.82915,-2.29836 z"
+ id="rect5147-9-1-5-7-6-5-8-7"
+ sodipodi:nodetypes="ccccccccscc" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:sans-serif;-inkscape-font-specification:sans-serif"
+ d="m 361.65223,524.52745 -9.5602,9.36735 -2.56345,-2.56344 -2.92846,-0.0214 0.0153,2.32639 4.02203,4.02206 c 0.80341,0.80309 2.10565,0.80309 2.90906,0 l 10.95049,-11.05765 0.003,-2.1502 z"
+ id="path12830-4-17-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ </g>
+</svg>
diff --git a/data/theme/checkbox-off-focused.svg b/data/theme/checkbox-off-focused.svg
new file mode 100644
index 0000000..428bafe
--- /dev/null
+++ b/data/theme/checkbox-off-focused.svg
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="22"
+ id="svg3199"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="checkbox-off.svg">
+ <defs
+ id="defs3201">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3207" />
+ <inkscape:perspective
+ id="perspective3187"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5837-4-6"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect14768"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5884-4-7"
+ is_visible="true" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10013-4-63-6">
+ <stop
+ style="stop-color:#333333;stop-opacity:1;"
+ offset="0"
+ id="stop10015-2-76-1" />
+ <stop
+ style="stop-color:#292929;stop-opacity:1"
+ offset="1"
+ id="stop10017-46-15-8" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10597-5">
+ <stop
+ style="stop-color:#16191a;stop-opacity:1;"
+ offset="0"
+ id="stop10599-2" />
+ <stop
+ style="stop-color:#2b3133;stop-opacity:1"
+ offset="1"
+ id="stop10601-5" />
+ </linearGradient>
+ <linearGradient
+ y2="-322.16354"
+ x2="921.22498"
+ y1="-330.05121"
+ x1="921.32812"
+ gradientTransform="matrix(1.5918367,0,0,0.85714285,-1456.5464,275.45191)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient15374"
+ xlink:href="#linearGradient10013-4-63-6"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1199.9852,216.38048)"
+ y2="-227.07961"
+ x2="1203.9177"
+ y1="-217.56708"
+ x1="1203.9177"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient15376"
+ xlink:href="#linearGradient10597-5"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5581-5-2-4-6-8-7-35-8"
+ id="linearGradient11811"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.0317573,0,0,1.0053174,-102.66338,-0.82153381)"
+ x1="63.568954"
+ y1="127.16142"
+ x2="63.568954"
+ y2="152.6618" />
+ <linearGradient
+ id="linearGradient5581-5-2-4-6-8-7-35-8">
+ <stop
+ id="stop5583-0-92-8-0-7-6-5-1"
+ offset="0"
+ style="stop-color:#454c4c;stop-opacity:1;" />
+ <stop
+ style="stop-color:#393f3f;stop-opacity:1;"
+ offset="0.40000001"
+ id="stop5585-4-7-2-7-9-9-92-0" />
+ <stop
+ id="stop5587-6-7-2-0-3-1-21-5"
+ offset="1"
+ style="stop-color:#2d3232;stop-opacity:1;" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#a2a2a2"
+ bordercolor="#2d2d2d"
+ borderopacity="1"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="19.79113"
+ inkscape:cy="11.232334"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1412"
+ inkscape:window-height="1067"
+ inkscape:window-x="184"
+ inkscape:window-y="233"
+ inkscape:window-maximized="0"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-bbox="true"
+ showborder="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid14843"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3204">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-342.5,-521.36218)">
+ <g
+ style="display:inline"
+ id="use5671"
+ transform="matrix(1.3594109,0,0,1.3564242,319.2059,481.99447)">
+ <rect
+ transform="matrix(0.47304779,0,0,0.4807373,-6.3607039,-29.396216)"
+ rx="4.4136767"
+ y="125.3458"
+ x="50.440369"
+ height="29.154205"
+ width="29.559635"
+ id="rect11803"
+ style="color:#000000;fill:url(#linearGradient11811);fill-opacity:1;stroke:#3465a4;stroke-width:1.54426003000000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ ry="4.4233952" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11809"
+ d="m 17.87105,33.844107 0,-0.773112 c 0,-1.031264 0.807171,-1.836142 1.811982,-1.836142 l 9.612456,0 c 1.004811,0 1.787822,0.804878 1.787822,1.836142 l 0,0.773112 c 0,-1.031264 -0.783011,-1.836142 -1.787822,-1.836142 l -9.612456,0 c -1.004811,0 -1.811982,0.804878 -1.811982,1.836142 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="csssscssc" />
+ <path
+ sodipodi:nodetypes="csssscssc"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 17.87105,41.158551 0,0.773112 c 0,1.031264 0.807171,1.836142 1.811982,1.836142 l 9.612456,0 c 1.004811,0 1.787822,-0.804878 1.787822,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
+ id="path11867"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11869"
+ d="m 17.87105,41.895784 0,0.773112 c 0,1.031264 0.644622,1.836142 1.649433,1.836142 l 10.067593,0 c 1.004811,0 1.495234,-0.804878 1.495234,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#000000;fill-opacity:0.85253451;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="csssscssc" />
+ </g>
+ <rect
+ style="color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect17347"
+ width="21.943846"
+ height="21.943846"
+ x="342.29913"
+ y="521.58435" />
+ </g>
+</svg>
diff --git a/data/theme/checkbox-off.svg b/data/theme/checkbox-off.svg
new file mode 100644
index 0000000..2c7a951
--- /dev/null
+++ b/data/theme/checkbox-off.svg
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="22"
+ id="svg3199"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="checkbox-focused.svg">
+ <defs
+ id="defs3201">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3207" />
+ <inkscape:perspective
+ id="perspective3187"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5837-4-6"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect14768"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5884-4-7"
+ is_visible="true" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10013-4-63-6">
+ <stop
+ style="stop-color:#333333;stop-opacity:1;"
+ offset="0"
+ id="stop10015-2-76-1" />
+ <stop
+ style="stop-color:#292929;stop-opacity:1"
+ offset="1"
+ id="stop10017-46-15-8" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10597-5">
+ <stop
+ style="stop-color:#16191a;stop-opacity:1;"
+ offset="0"
+ id="stop10599-2" />
+ <stop
+ style="stop-color:#2b3133;stop-opacity:1"
+ offset="1"
+ id="stop10601-5" />
+ </linearGradient>
+ <linearGradient
+ y2="-322.16354"
+ x2="921.22498"
+ y1="-330.05121"
+ x1="921.32812"
+ gradientTransform="matrix(1.5918367,0,0,0.85714285,-1456.5464,275.45191)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient15374"
+ xlink:href="#linearGradient10013-4-63-6"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1199.9852,216.38048)"
+ y2="-227.07961"
+ x2="1203.9177"
+ y1="-217.56708"
+ x1="1203.9177"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient15376"
+ xlink:href="#linearGradient10597-5"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5581-5-2-4-6-8-7-35-8"
+ id="linearGradient11811"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.0317573,0,0,1.0053174,-102.66338,-0.82153381)"
+ x1="63.568954"
+ y1="127.16142"
+ x2="63.568954"
+ y2="152.6618" />
+ <linearGradient
+ id="linearGradient5581-5-2-4-6-8-7-35-8">
+ <stop
+ id="stop5583-0-92-8-0-7-6-5-1"
+ offset="0"
+ style="stop-color:#454c4c;stop-opacity:1;" />
+ <stop
+ style="stop-color:#393f3f;stop-opacity:1;"
+ offset="0.40000001"
+ id="stop5585-4-7-2-7-9-9-92-0" />
+ <stop
+ id="stop5587-6-7-2-0-3-1-21-5"
+ offset="1"
+ style="stop-color:#2d3232;stop-opacity:1;" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#a2a2a2"
+ bordercolor="#2d2d2d"
+ borderopacity="1"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="9.6447897"
+ inkscape:cy="12.591409"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1412"
+ inkscape:window-height="1067"
+ inkscape:window-x="184"
+ inkscape:window-y="233"
+ inkscape:window-maximized="0"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-bbox="true"
+ showborder="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid14843"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3204">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-342.5,-521.36218)">
+ <g
+ style="display:inline"
+ id="use5671"
+ transform="matrix(1.3594109,0,0,1.3564242,319.2059,481.99447)">
+ <rect
+ transform="matrix(0.47304779,0,0,0.4807373,-6.3607039,-29.396216)"
+ rx="4.4136767"
+ y="125.3458"
+ x="50.440369"
+ height="29.154205"
+ width="29.559635"
+ id="rect11803"
+ style="color:#000000;fill:url(#linearGradient11811);fill-opacity:1;stroke:#1c1f1f;stroke-width:1.54426003;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ ry="4.4233952" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11809"
+ d="m 17.87105,33.844107 0,-0.773112 c 0,-1.031264 0.807171,-1.836142 1.811982,-1.836142 l 9.612456,0 c 1.004811,0 1.787822,0.804878 1.787822,1.836142 l 0,0.773112 c 0,-1.031264 -0.783011,-1.836142 -1.787822,-1.836142 l -9.612456,0 c -1.004811,0 -1.811982,0.804878 -1.811982,1.836142 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="csssscssc" />
+ <path
+ sodipodi:nodetypes="csssscssc"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 17.87105,41.158551 0,0.773112 c 0,1.031264 0.807171,1.836142 1.811982,1.836142 l 9.612456,0 c 1.004811,0 1.787822,-0.804878 1.787822,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
+ id="path11867"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11869"
+ d="m 17.87105,41.895784 0,0.773112 c 0,1.031264 0.644622,1.836142 1.649433,1.836142 l 10.067593,0 c 1.004811,0 1.495234,-0.804878 1.495234,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#000000;fill-opacity:0.85253451;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="csssscssc" />
+ </g>
+ <rect
+ style="color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect17347"
+ width="21.943846"
+ height="21.943846"
+ x="342.29913"
+ y="521.58435" />
+ </g>
+</svg>
diff --git a/data/theme/checkbox.svg b/data/theme/checkbox.svg
new file mode 100644
index 0000000..ec66846
--- /dev/null
+++ b/data/theme/checkbox.svg
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="22"
+ id="svg3199"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="checkbox.svg">
+ <defs
+ id="defs3201">
+ <linearGradient
+ id="linearGradient15404"
+ inkscape:collect="always">
+ <stop
+ id="stop15406"
+ offset="0"
+ style="stop-color:#515151;stop-opacity:1" />
+ <stop
+ id="stop15408"
+ offset="1"
+ style="stop-color:#292929;stop-opacity:1" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3207" />
+ <inkscape:perspective
+ id="perspective3187"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5872-5-1"
+ id="linearGradient5891-0-4"
+ gradientUnits="userSpaceOnUse"
+ x1="205.84143"
+ y1="246.7094"
+ x2="206.74803"
+ y2="231.24142" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5872-5-1">
+ <stop
+ style="stop-color:#0b2e52;stop-opacity:1"
+ offset="0"
+ id="stop5874-4-4" />
+ <stop
+ style="stop-color:#1862af;stop-opacity:1"
+ offset="1"
+ id="stop5876-0-5" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5837-4-6"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect14768"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5884-4-7"
+ is_visible="true" />
+ <linearGradient
+ y2="-388.72955"
+ x2="-93.031357"
+ y1="-396.34738"
+ x1="-93.031357"
+ gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.685418)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient14219"
+ xlink:href="#linearGradient15404"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10013-4-63-6">
+ <stop
+ style="stop-color:#333333;stop-opacity:1;"
+ offset="0"
+ id="stop10015-2-76-1" />
+ <stop
+ style="stop-color:#292929;stop-opacity:1"
+ offset="1"
+ id="stop10017-46-15-8" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10597-5">
+ <stop
+ style="stop-color:#16191a;stop-opacity:1;"
+ offset="0"
+ id="stop10599-2" />
+ <stop
+ style="stop-color:#2b3133;stop-opacity:1"
+ offset="1"
+ id="stop10601-5" />
+ </linearGradient>
+ <linearGradient
+ y2="-322.16354"
+ x2="921.22498"
+ y1="-330.05121"
+ x1="921.32812"
+ gradientTransform="matrix(1.5918367,0,0,0.85714285,-1456.5464,275.45191)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient15374"
+ xlink:href="#linearGradient10013-4-63-6"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1199.9852,216.38048)"
+ y2="-227.07961"
+ x2="1203.9177"
+ y1="-217.56708"
+ x1="1203.9177"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient15376"
+ xlink:href="#linearGradient10597-5"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5581-5-2-4-6-8-7-35-8"
+ id="linearGradient11811"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.0317573,0,0,1.0053174,-102.66338,-0.82153381)"
+ x1="63.568954"
+ y1="127.16142"
+ x2="63.568954"
+ y2="152.6618" />
+ <linearGradient
+ id="linearGradient5581-5-2-4-6-8-7-35-8">
+ <stop
+ id="stop5583-0-92-8-0-7-6-5-1"
+ offset="0"
+ style="stop-color:#454c4c;stop-opacity:1;" />
+ <stop
+ style="stop-color:#393f3f;stop-opacity:1;"
+ offset="0.40000001"
+ id="stop5585-4-7-2-7-9-9-92-0" />
+ <stop
+ id="stop5587-6-7-2-0-3-1-21-5"
+ offset="1"
+ style="stop-color:#2d3232;stop-opacity:1;" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#a2a2a2"
+ bordercolor="#2d2d2d"
+ borderopacity="1"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-0.17876005"
+ inkscape:cy="11.944326"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1375"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-bbox="true"
+ showborder="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid14843"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3204">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-342.5,-521.36218)">
+ <g
+ style="display:inline"
+ id="use5671"
+ transform="matrix(1.3594109,0,0,1.3564242,319.2059,481.99447)">
+ <rect
+ transform="matrix(0.47304779,0,0,0.4807373,-6.3607039,-29.396216)"
+ rx="4.4136767"
+ y="125.3458"
+ x="50.440369"
+ height="29.154205"
+ width="29.559635"
+ id="rect11803"
+ style="color:#000000;fill:url(#linearGradient11811);fill-opacity:1;stroke:#1c1f1f;stroke-width:1.54426003;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ ry="4.4233952" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11809"
+ d="m 17.87105,33.844107 0,-0.773112 c 0,-1.031264 0.807171,-1.836142 1.811982,-1.836142 l 9.612456,0 c 1.004811,0 1.787822,0.804878 1.787822,1.836142 l 0,0.773112 c 0,-1.031264 -0.783011,-1.836142 -1.787822,-1.836142 l -9.612456,0 c -1.004811,0 -1.811982,0.804878 -1.811982,1.836142 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="csssscssc" />
+ <path
+ sodipodi:nodetypes="csssscssc"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 17.87105,41.158551 0,0.773112 c 0,1.031264 0.807171,1.836142 1.811982,1.836142 l 9.612456,0 c 1.004811,0 1.787822,-0.804878 1.787822,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
+ id="path11867"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11869"
+ d="m 17.87105,41.895784 0,0.773112 c 0,1.031264 0.644622,1.836142 1.649433,1.836142 l 10.067593,0 c 1.004811,0 1.495234,-0.804878 1.495234,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#000000;fill-opacity:0.85253451;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="csssscssc" />
+ </g>
+ <rect
+ style="color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect17347"
+ width="21.943846"
+ height="21.943846"
+ x="342.29913"
+ y="521.58435" />
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:0.8;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 359.97505,524.8252 -7.88606,7.71465 -2.57155,-2.57155 -2.91442,-0.0427 0,2.35727 4.02875,3.98587 c 0.80342,0.80309 2.111,0.80309 2.91442,0 l 8.18609,-8.22894 0,-0.38573 c 0,-1.24128 0.19944,-1.76801 -0.82915,-2.29836 z"
+ id="rect5147-9-1-5-7-6-5-8-7"
+ sodipodi:nodetypes="ccccccccscc" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:sans-serif;-inkscape-font-specification:sans-serif"
+ d="m 361.65223,524.52745 -9.5602,9.36735 -2.56345,-2.56344 -2.92846,-0.0214 0.0153,2.32639 4.02203,4.02206 c 0.80341,0.80309 2.10565,0.80309 2.90906,0 l 10.95049,-11.05765 0.003,-2.1502 z"
+ id="path12830-4-17-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ </g>
+</svg>
diff --git a/data/theme/color-pick.svg b/data/theme/color-pick.svg
new file mode 100644
index 0000000..d9af690
--- /dev/null
+++ b/data/theme/color-pick.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="5.4116011mm"
+ height="5.1374583mm"
+ viewBox="0 0 5.4116011 5.1374583"
+ version="1.1"
+ id="svg5595"
+ inkscape:version="0.92.4 (unknown)"
+ sodipodi:docname="color-pick.svg">
+ <defs
+ id="defs5589">
+ <filter
+ inkscape:collect="always"
+ x="-0.10291173"
+ width="1.2058235"
+ y="-0.065432459"
+ height="1.1308649"
+ id="filter5601"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.610872"
+ id="feGaussianBlur5603" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.839192"
+ inkscape:cx="39.387731"
+ inkscape:cy="12.554326"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <metadata
+ id="metadata5592">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-103.12753,-146.26461)">
+ <circle
+ r="8.4810486"
+ cy="9.82623"
+ cx="10.226647"
+ id="circle7584"
+ style="color:#000000;display:inline;overflow:visible;opacity:0.6;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter:url(#filter5601)"
+ transform="matrix(0.26458333,0,0,0.26458333,103.12753,146.26461)" />
+ <path
+ style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.26399338;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 108.07728,148.64122 c 0,1.2393 -1.00465,2.24394 -2.24395,2.24394 -1.23929,0 -2.24716,-1.00465 -2.25221,-2.24394 l -0.009,-2.24458 2.26136,6.4e-4 c 1.2393,3.4e-4 2.24395,1.00464 2.24395,2.24394 z"
+ id="path7523-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssscss" />
+ <circle
+ style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#50dbb5;fill-opacity:1;stroke:none;stroke-width:0.36885914;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="path7482-1"
+ cx="105.83707"
+ cy="148.64352"
+ r="1.844296" />
+ </g>
+</svg>
diff --git a/data/theme/dash-placeholder.svg b/data/theme/dash-placeholder.svg
new file mode 100644
index 0000000..cbae148
--- /dev/null
+++ b/data/theme/dash-placeholder.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="76"
+ height="27"
+ id="svg11252"
+ version="1.1">
+ <defs
+ id="defs11254">
+ <radialGradient
+ xlink:href="#linearGradient39563-4-2"
+ id="radialGradient68155-2-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.3486842,0,317.8421)"
+ cx="49"
+ cy="488"
+ fx="49"
+ fy="488"
+ r="38" />
+ <linearGradient
+ id="linearGradient39563-4-2">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop39565-1-4" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop39567-7-9" />
+ </linearGradient>
+ <radialGradient
+ xlink:href="#linearGradient39573-6-1"
+ id="radialGradient68157-0-8"
+ gradientUnits="userSpaceOnUse"
+ cx="50.5"
+ cy="487.5"
+ fx="50.5"
+ fy="487.5"
+ r="10.5" />
+ <linearGradient
+ id="linearGradient39573-6-1">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop39575-5-6" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop39577-1-2" />
+ </linearGradient>
+ </defs>
+ <g
+ id="layer1"
+ transform="translate(-337,-518.86218)">
+ <g
+ id="g99967"
+ style="display:inline"
+ transform="translate(326,44.862171)">
+ <rect
+ style="opacity:0.49375;color:#000000;fill:url(#radialGradient68155-2-3);fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect99969"
+ width="76"
+ height="2"
+ x="11"
+ y="487"
+ rx="0"
+ ry="0" />
+ <path
+ style="opacity:0.43125;color:#000000;fill:url(#radialGradient68157-0-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path99971"
+ d="M 61,487.5 C 61,493.29899 56.29899,498 50.5,498 44.70101,498 40,493.29899 40,487.5 40,481.70101 44.70101,477 50.5,477 c 5.79899,0 10.5,4.70101 10.5,10.5 z"
+ transform="matrix(1.2857143,0,0,1.2857143,-14.428572,-139.28571)" />
+ <path
+ transform="matrix(0.43589747,0,0,0.43589747,28.487179,275)"
+ d="M 61,487.5 C 61,493.29899 56.29899,498 50.5,498 44.70101,498 40,493.29899 40,487.5 40,481.70101 44.70101,477 50.5,477 c 5.79899,0 10.5,4.70101 10.5,10.5 z"
+ id="path99973"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+</svg>
diff --git a/data/theme/eye-not-looking-symbolic.svg b/data/theme/eye-not-looking-symbolic.svg
new file mode 100644
index 0000000..a168c87
--- /dev/null
+++ b/data/theme/eye-not-looking-symbolic.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <path d="M13.98 1.99a1 1 0 0 0-.687.303l-.984.984A8 8 0 0 0 8 2 8 8 0 0 0 .262 8.01a8 8 0 0 0 2.943 4.37l-.912.913a1 1 0 1 0 1.414 1.414l11-11a1 1 0 0 0-.727-1.717zM8 4a4 4 0 0 1 2.611.974l-1.42 1.42A2 2 0 0 0 8 6a2 2 0 0 0-2 2 2 2 0 0 0 .396 1.19l-1.42 1.42A4 4 0 0 1 4 8a4 4 0 0 1 4-4zm7.03 2.209l-3.344 3.343a4 4 0 0 1-2.127 2.127l-2.28 2.28a8 8 0 0 0 .721.04 8 8 0 0 0 7.738-6.01 8 8 0 0 0-.709-1.78zm-7.53.79a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#2e3436"/>
+</svg>
+
diff --git a/data/theme/eye-open-negative-filled-symbolic.svg b/data/theme/eye-open-negative-filled-symbolic.svg
new file mode 100644
index 0000000..1e5351c
--- /dev/null
+++ b/data/theme/eye-open-negative-filled-symbolic.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="16" viewBox="0 0 16 16" version="1.1" id="svg7384" height="16">
+ <metadata id="metadata90">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <title id="title9167">Gnome Symbolic Icon Theme</title>
+ <defs id="defs7386">
+ <linearGradient osb:paint="solid" id="linearGradient7212">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop7214"/>
+ </linearGradient>
+ </defs>
+ <g transform="translate(-341.0002,-13.000323)" style="display:inline" id="layer9"/>
+ <g transform="translate(-100,-380.00032)" id="layer1"/>
+ <g transform="translate(-100,-380.00032)" style="display:inline" id="layer10">
+ <path d="m 108,382 a 8,8 0 0 0 -7.73828,6.00977 A 8,8 0 0 0 108,394 8,8 0 0 0 115.73828,387.99023 8,8 0 0 0 108,382 Z m 0,2 a 4,4 0 0 1 4,4 4,4 0 0 1 -4,4 4,4 0 0 1 -4,-4 4,4 0 0 1 4,-4 z" id="path2314" style="opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"/>
+ <path id="path2318" d="m 110,388.00003 a 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 2,2 0 0 1 2,-2 2,2 0 0 1 2,2 z" style="vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ </g>
+ <g transform="translate(-100,-380.00032)" id="g6387"/>
+ <g transform="translate(-100,-380.00032)" id="layer11"/>
+</svg>
+
diff --git a/data/theme/gnome-shell-high-contrast.scss b/data/theme/gnome-shell-high-contrast.scss
new file mode 100644
index 0000000..ed52bbb
--- /dev/null
+++ b/data/theme/gnome-shell-high-contrast.scss
@@ -0,0 +1,17 @@
+$variant: 'dark';
+
+@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
+@import "gnome-shell-sass/_drawing";
+@import "gnome-shell-sass/_common";
+@import "gnome-shell-sass/_widgets";
+
+//force symbolic icons
+stage {
+ -st-icon-style: symbolic;
+}
+
+.toggle-switch { width: 48px; }
+.toggle-switch-us, .toggle-switch-intl {
+ background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg");
+ &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); }
+}
diff --git a/data/theme/gnome-shell-sass/COPYING b/data/theme/gnome-shell-sass/COPYING
new file mode 100644
index 0000000..e55e5b8
--- /dev/null
+++ b/data/theme/gnome-shell-sass/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/data/theme/gnome-shell-sass/NEWS b/data/theme/gnome-shell-sass/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/theme/gnome-shell-sass/NEWS
diff --git a/data/theme/gnome-shell-sass/README.md b/data/theme/gnome-shell-sass/README.md
new file mode 100644
index 0000000..a5f219a
--- /dev/null
+++ b/data/theme/gnome-shell-sass/README.md
@@ -0,0 +1,16 @@
+# GNOME Shell Sass
+GNOME Shell Sass is a project intended to allow the sharing of the
+theme sources in sass between gnome-shell and other projects like
+gnome-shell-extensions.
+
+Any changes should be done in the [GNOME Shell subtree][shell-subtree]
+and not the stand-alone [gnome-shell-sass repository][sass-repo]. They
+will then be synchronized periodically before releases.
+
+## License
+GNOME Shell Sass is distributed under the terms of the GNU General Public
+License, version 2 or later. See the [COPYING][license] file for details.
+
+[shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass
+[sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass
+[license]: COPYING
diff --git a/data/theme/gnome-shell-sass/_colors.scss b/data/theme/gnome-shell-sass/_colors.scss
new file mode 100644
index 0000000..882c25b
--- /dev/null
+++ b/data/theme/gnome-shell-sass/_colors.scss
@@ -0,0 +1,43 @@
+// When color definition differs for dark and light variant,
+// it gets @if ed depending on $variant
+
+$base_color: if($variant == 'light', #fff, lighten(desaturate(#241f31, 20%), 2%));
+$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%));
+$fg_color: if($variant == 'light', #2e3436, #eeeeec);
+
+$selected_fg_color: #fff;
+$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%));
+$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
+$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 8%));
+$borders_edge: if($variant == 'light', rgba(255,255,255,0.8), transparentize($fg_color, 0.93));
+$link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%));
+$link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%));
+$top_hilight: $borders_edge;
+
+$warning_color: #f57900;
+$error_color: #ff8080;
+$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
+$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
+
+$osd_fg_color: #eeeeec;
+$osd_text_color: white;
+$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04);
+$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
+$osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%);
+$osd_borders_color: transparentize(black, 0.3);
+$osd_outer_borders_color: transparentize(white, 0.84);
+
+$shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2));
+
+//insensitive state derived colors
+$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
+$insensitive_bg_color: mix($bg_color, $base_color, 60%);
+$insensitive_borders_color: mix($borders_color, $base_color, 60%);
+
+//colors for the backdrop state, derived from the main colors.
+$backdrop_base_color: if($variant =='light', darken($base_color,1%), lighten($base_color,1%));
+$backdrop_bg_color: $bg_color;
+$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
+$backdrop_insensitive_color: if($variant =='light', darken($backdrop_bg_color,15%), lighten($backdrop_bg_color,15%));
+$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
+$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
new file mode 100644
index 0000000..d648097
--- /dev/null
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -0,0 +1,177 @@
+//This is the RIGHT PLACE to edit the stylesheet
+
+//let's start by telling people not to edit the generated CSS:
+$cakeisalie: "This stylesheet is generated, DO NOT EDIT";
+/* #{$cakeisalie} */
+
+/* Copyright 2009, 2015 Red Hat, Inc.
+ *
+ * Portions adapted from Mx's data/style/default.css
+ * Copyright 2009 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Global Values */
+
+// padding, margin and spacing
+$base_padding: 6px;
+$base_margin: 4px;
+$base_spacing: 6px;
+
+// border radii
+$base_border_radius: 5px;
+
+$modal_radius:$base_border_radius * 2;
+
+// non-standard colors
+$bubble_borders_color: lighten($borders_color, if($variant=='light', 0%, 5%));
+// $bubble_borders_color: if($variant == 'light', rgba(255,255,255,0.1), rgba(0,0,0,0.3));
+
+// hover
+$hover_bg_color: if($variant=='light', darken($bg_color, 3%), lighten($bg_color, 5%));
+$hover_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 5%));
+$hover_borders_color: lighten($borders_color,if($variant=='light', 5%, 3%));
+
+// active
+$active_bg_color: if($variant == 'light', darken($bg_color, 7%), darken($bg_color, 9%));
+$active_fg_color: darken($fg_color,if($variant=='light', 5%, 3%));
+$active_borders_color: darken($borders_color,if($variant=='light', 5%, 3%));
+
+// fonts
+$base_font_size: 11;
+$text_shadow_color: if($variant == 'light', rgba(255,255,255,0.3), rgba(0,0,0,0.2));
+
+// icons
+$base_icon_size: 1.09em;
+// $base_icon_size: 16px;
+
+// Stage
+stage {
+ @include fontsize($base_font_size);
+ color: $fg_color;
+}
+
+/* Common Stylings */
+
+// Text
+%status_text {
+ font-size: 2em;
+ font-weight: bold;
+ color: $osd_fg_color;
+}
+
+// osd panels
+%osd_panel {
+ color: $osd_fg_color;
+ background-color: $osd_bg_color;
+ border: 1px solid $osd_outer_borders_color;
+ border-radius: $base_border_radius * 2 + 4px;
+ padding: $base_padding * 2;
+}
+
+// Overview panels
+// for the dash and workspace switcher
+%overview_panel {
+ color: $osd_fg_color;
+ background-color: transparentize($osd_bg_color, 0.2);
+ border: 1px solid $osd_outer_borders_color;
+}
+
+// icon tiles
+%icon_tile {
+ border-radius: $base_border_radius + 4px;
+ padding: $base_padding;
+ border: 2px solid transparent;
+ transition-duration: 100ms;
+ text-align: center;
+}
+
+// dialogs
+%bubble_panel {
+ color: $fg_color;
+ background-color: $bg_color;
+ border: 1px solid if($variant=='light', rgba(0,0,0, 0.6), $borders_color);
+}
+
+// button styling
+%button {
+ border-radius: $base_border_radius;
+ border-style: solid;
+ border-width: 1px;
+ min-height: 22px;
+ padding: $base_padding * 0.5 $base_padding * 4;
+
+ @include button(normal);
+ &:focus { @include button(focus);}
+ &:hover { @include button(hover);}
+ &:insensitive { @include button(insensitive);}
+ &:active { @include button(active);}
+}
+
+// buttons in dialogs
+%bubble_button {
+ @include button(normal, $shadow: none);
+ padding: $base_padding * 2;
+ border-style: solid;
+ border-width: 1px;
+ border-left-width: 0;
+ border-bottom-width: 0;
+
+ &:insensitive { @include button(insensitive, $shadow: none); }
+ &:hover { @include button(hover, $shadow: none); }
+ &:focus { @include button(focus, $shadow: none); }
+ &:active { @include button(active, $shadow: none); }
+
+ // radius is 2 pixel less to fit in bubble
+ &:first-child {
+ border-radius: 0 0 0 $modal_radius - 2px;
+ }
+
+ &:last-child {
+ border-right-width: 0;
+ border-radius: 0 0 $modal_radius - 2px 0;
+ }
+
+ &:first-child:last-child {
+ border-radius: 0 0 $modal_radius - 2px $modal_radius - 2px;
+ }
+}
+
+
+// notification styling
+@mixin notification_bubble($flat: false) {
+ border-width: 1px;
+ border-style: solid;
+ border-radius: $base_border_radius + 2px;
+ margin: $base_margin;
+
+ @if $flat {
+ @include button(undecorated);
+ } @else {
+ @include button(normal);
+ }
+
+ &:focus {
+ @include button(focus);
+ }
+
+ &:hover {
+ @include button(hover);
+ }
+
+ &:active {
+ @include button(active);
+ }
+}
diff --git a/data/theme/gnome-shell-sass/_drawing.scss b/data/theme/gnome-shell-sass/_drawing.scss
new file mode 100644
index 0000000..54ff9d4
--- /dev/null
+++ b/data/theme/gnome-shell-sass/_drawing.scss
@@ -0,0 +1,231 @@
+// Drawing mixins
+
+// generic drawing of more complex things
+
+@function draw_widget_edge($c:$borders_edge) {
+// outer highlight "used" on most widgets
+ @return 0 1px $c;
+}
+
+// provide font size in rem, with px fallback
+@mixin fontsize($size: 24, $base: 16) {
+ font-size: round($size) + pt;
+ //font-size: ($size / $base) * 1rem;
+}
+
+@mixin draw_shadows($shadow1, $shadow2:none, $shadow3:none, $shadow4:none) {
+//
+// Helper function to stack up to 4 box-shadows;
+//
+ @if $shadow4!=none { box-shadow: $shadow1, $shadow2, $shadow3, $shadow4; }
+ @else if $shadow3!=none { box-shadow: $shadow1, $shadow2, $shadow3; }
+ @else if $shadow2!=none { box-shadow: $shadow1, $shadow2; }
+ @else { box-shadow: $shadow1; }
+}
+
+// entries
+
+@mixin entry($t, $fc:$selected_bg_color, $edge: $borders_edge) {
+//
+// Entries drawing function
+//
+// $t: entry type
+// $fc: focus color
+// $edge: set to none to not draw the bottom edge or specify a color to not use the default one
+//
+// possible $t values:
+// normal, focus, insensitive
+//
+
+ @if $t==normal {
+ background-color: $base_color;
+ border-color: $borders_color;
+
+ }
+ @if $t==focus {
+ border-color: if($fc==$selected_bg_color,
+ $selected_borders_color,
+ darken($fc,35%));
+ box-shadow: inset 0 0 0 1px $fc;
+ }
+ @if $t==hover { }
+ @if $t==insensitive {
+ color: $insensitive_fg_color;
+ border-color: $insensitive_bg_color;
+ box-shadow: none;
+ }
+}
+
+// buttons
+
+@function draw_border_color ($c) {
+ //
+ // colored buttons want the border form the base color
+ //
+ @return if($variant == 'light', darken($c, 18%), darken($c, 4%));
+}
+
+@function draw_text_shadow_color ($tc:$fg_color, $bg:$bg_color) {
+//
+// calculate the color of text shadows
+//
+// $tc is the text color
+// $bg is the background color
+//
+ $lbg: lightness($bg)/100%;
+ @if lightness($tc)<50% { @return rgba(255,255,255,$lbg/($lbg*1.3)); }
+ @else { @return rgba(0,0,0,1-$lbg*0.8); }
+}
+
+@function draw_button_hilight_color($c) {
+//
+// calculate the right top highlight color for buttons
+//
+// $c: base color;
+//
+ @if lightness($c)>90% { @return white; }
+ @else if lightness($c)>80% { @return rgba(255,255,255, 0.7); }
+ @else if lightness($c)>50% { @return rgba(255,255,255, 0.5); }
+ @else if lightness($c)>40% { @return rgba(255,255,255, 0.3); }
+ @else { @return rgba(255,255,255, 0.1); }
+}
+
+@mixin draw_button_text_shadow ($tc:$fg_color, $bg:$bg_color) {
+//
+// helper function for the text emboss effect
+//
+// $tc is the optional text color, not the shadow color
+//
+// TODO: this functions needs a way to deal with special cases
+//
+
+ $shadow: draw_text_shadow_color($tc, $bg);
+
+ @if lightness($tc)<50% {
+ text-shadow: 0 1px $shadow;
+ icon-shadow: 0 1px $shadow;
+ }
+ @else {
+ text-shadow: 0 -1px $shadow;
+ icon-shadow: 0 -1px $shadow;
+ }
+}
+
+@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge, $shadow: $shadow_color) {
+//
+// Button drawing function
+//
+// $t: button type,
+// $c: base button color for colored* types
+// $tc: optional text color for colored* types
+// $edge: set to none to not draw the bottom edge or specify a color to not
+// use the default one
+// $shadow: set to none to not draw the drop shadow or specify a color to not
+// use the default one
+//
+// possible $t values:
+// normal, hover, active, insensitive, insensitive-active,
+// backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active,
+// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
+//
+
+ $hilight_color: draw_button_hilight_color($c);
+ $button_edge: if($edge == none, none, draw_widget_edge($edge));
+ $blank_edge: if($edge == none, none, draw_widget_edge(transparentize($edge,1)));
+ $button_shadow: if($shadow == none, none, 0 1px 1px 0 $shadow);
+
+ // normal button
+ @if $t==normal {
+ color: $tc;
+ background-color: lighten($c, 3%);
+ border-color: draw_border_color($c);
+ @include draw_shadows($button_shadow);
+ // box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
+ text-shadow: 0 1px $text_shadow_color;
+ icon-shadow: 0 1px $text_shadow_color;
+ }
+
+ // focused button
+ @if $t==focus {
+ color: $tc;
+ text-shadow: 0 1px $text_shadow_color;
+ icon-shadow: 0 1px $text_shadow_color;
+ box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4);
+ //border-color: $selected_bg_color;
+ }
+
+ // hover button
+ @else if $t==hover {
+ color: $tc;
+ background-color: lighten($c, if($variant == 'light', 8%, 5%));
+ border-color: if($variant == 'light', draw_border_color(lighten($c, 7%)), draw_border_color($c));
+ @include draw_shadows($button_shadow);
+ text-shadow: 0 1px $text_shadow_color;
+ icon-shadow: 0 1px $text_shadow_color;
+ }
+
+ // active button
+ @else if $t==active {
+ color: $tc;
+ background-color: darken($c,3%);
+ border-color: draw_border_color(if($variant == 'light', $c, darken($c,7%)));
+ text-shadow: none;
+ icon-shadow: none;
+ box-shadow: none;
+ }
+
+ // insensitive button
+ @else if $t==insensitive {
+ color: $insensitive_fg_color;
+ border-color: $insensitive_borders_color;
+ background-color: $insensitive_bg_color;
+ box-shadow: none;
+ text-shadow: none;
+ icon-shadow: none;
+ }
+
+ // reset
+ @else if $t==undecorated {
+ border-color: transparent;
+ background-color: transparent;
+ background-image: none;
+ @include draw_shadows(inset 0 1px rgba(255,255,255,0),$blank_edge);
+ text-shadow: none;
+ icon-shadow: none;
+ }
+}
+
+// overview icons
+@mixin overview-icon($color) {
+ .overview-icon {
+ @extend %icon_tile;
+ color: $color;
+ }
+
+ &:hover,
+ &:selected {
+ .overview-icon {
+ background-color: transparentize($color, .9);
+ }
+ }
+
+ &:focus {
+ .overview-icon {
+ background-color: transparentize($color, .7);
+ // border-color: $selected_bg_color;
+ }
+ }
+
+ &:drop {
+ .overview-icon {
+ background-color: transparentize($selected_bg_color, .15);
+ }
+ }
+
+ &:active,
+ &:checked {
+ .overview-icon {
+ background-color: transparentize(darken($osd_bg_color, 10%), .5);
+ }
+ }
+}
diff --git a/data/theme/gnome-shell-sass/_high-contrast-colors.scss b/data/theme/gnome-shell-sass/_high-contrast-colors.scss
new file mode 100644
index 0000000..7101793
--- /dev/null
+++ b/data/theme/gnome-shell-sass/_high-contrast-colors.scss
@@ -0,0 +1,41 @@
+// When color definition differs for dark and light variant,
+// it gets @if ed depending on $variant
+
+
+$base_color: #222;
+$bg_color: #000;
+$fg_color: #fff;
+
+$selected_fg_color: #ffffff;
+$selected_bg_color: darken(#4a90d9,20%);
+$selected_borders_color: darken($selected_bg_color, 20%);
+$borders_color: darken($bg_color,12%);
+$borders_edge: transparentize($fg_color, 0.9);
+$link_color: lighten($selected_bg_color,20%);
+$link_visited_color: lighten($selected_bg_color,10%);
+$top_hilight: $borders_edge;
+
+$warning_color: #f57900;
+$error_color: #cc0000;
+$success_color: darken(#73d216,10%);
+$destructive_color: darken(#ef2929,10%);
+
+$osd_fg_color: #eeeeec;
+$osd_bg_color: #2e3436;
+$osd_borders_color: rgba(0,0,0, 0.7);
+$osd_outer_borders_color: rgba(255,255,255, 0.1);
+
+$shadow_color: rgba(0,0,0, 0.1);
+
+//insensitive state derived colors
+$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
+$insensitive_bg_color: mix($bg_color, $base_color, 60%);
+$insensitive_borders_color: $borders_color;
+
+//colors for the backdrop state, derived from the main colors.
+$backdrop_base_color: lighten($base_color,1%);
+$backdrop_bg_color: $bg_color;
+$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
+$backdrop_insensitive_color: lighten($backdrop_bg_color,15%);
+$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
+$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
diff --git a/data/theme/gnome-shell-sass/_widgets.scss b/data/theme/gnome-shell-sass/_widgets.scss
new file mode 100644
index 0000000..87dab2a
--- /dev/null
+++ b/data/theme/gnome-shell-sass/_widgets.scss
@@ -0,0 +1,51 @@
+//
+// Shell widgets stylesheets are placed in separate .scss files
+// in 'widgets' and imported into the main stylesheet in this file.
+// To create or update a widget for the shell modify the list below.
+//
+
+/* WIDGETS */
+
+// Primary widgets
+@import 'widgets/base';
+@import 'widgets/entries';
+@import 'widgets/buttons';
+@import 'widgets/check-box';
+@import 'widgets/switches';
+@import 'widgets/slider';
+@import 'widgets/scrollbars';
+// Popovers
+@import 'widgets/popovers';
+@import 'widgets/calendar';
+@import 'widgets/message-list';
+@import 'widgets/ibus-popup';
+// Notifications
+@import 'widgets/notifications';
+@import 'widgets/hotplug';
+// Dialogs
+@import 'widgets/dialogs';
+@import 'widgets/network-dialog';
+// OSDs
+@import 'widgets/osd';
+@import 'widgets/switcher-popup';
+@import 'widgets/workspace-switcher';
+// Panel
+@import 'widgets/panel';
+@import 'widgets/corner-ripple';
+// Overview
+@import 'widgets/overview';
+@import 'widgets/window-picker';
+@import 'widgets/search-entry';
+@import 'widgets/search-results';
+@import 'widgets/app-grid';
+@import 'widgets/dash';
+@import 'widgets/workspace-thumbnails';
+// A11y / misc
+@import 'widgets/a11y';
+@import 'widgets/misc';
+@import 'widgets/tiled-previews';
+@import 'widgets/keyboard';
+@import 'widgets/looking-glass';
+// Lock / login screens
+@import 'widgets/login-dialog';
+@import 'widgets/screen-shield';
diff --git a/data/theme/gnome-shell-sass/gnome-shell-sass.doap b/data/theme/gnome-shell-sass/gnome-shell-sass.doap
new file mode 100644
index 0000000..f18ec1b
--- /dev/null
+++ b/data/theme/gnome-shell-sass/gnome-shell-sass.doap
@@ -0,0 +1,37 @@
+<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:gnome="http://api.gnome.org/doap-extensions#"
+ xmlns="http://usefulinc.com/ns/doap#">
+
+ <name xml:lang="en">GNOME Shell Sass</name>
+ <shortdesc xml:lang="en">Sass sources of GNOME Shell</shortdesc>
+ <description>GNOME Shell Sass is a project intended to allow the sharing of the
+ sass theme sources between gnome-shell and other projects like gnome-shell-extensions.</description>
+
+ <category rdf:resource="http://api.gnome.org/doap-extensions#core" />
+ <programming-language>sass</programming-language>
+ <programming-language>css</programming-language>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Carlos Soriano</foaf:name>
+ <foaf:mbox rdf:resource="mailto:csoriano@gnome.org" />
+ <gnome:userid>csoriano</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Florian Müllner</foaf:name>
+ <foaf:mbox rdf:resource="mailto:fmuellner@gnome.org" />
+ <gnome:userid>fmuellner</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Jakub Steiner</foaf:name>
+ <foaf:mbox rdf:resource="mailto:jimmac@gmail.com" />
+ <gnome:userid>jimmac</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+</Project>
diff --git a/data/theme/gnome-shell-sass/widgets/_a11y.scss b/data/theme/gnome-shell-sass/widgets/_a11y.scss
new file mode 100644
index 0000000..31b5c4b
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_a11y.scss
@@ -0,0 +1,24 @@
+// Pointer location
+.ripple-pointer-location {
+ width: $ripple_size;
+ height: $ripple_size;
+ border-radius: $ripple_size * 0.5; // radius equals the size of the box to give us the curve
+ background-color: lighten(transparentize($selected_bg_color, 0.7), 30%);
+ box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%);
+}
+
+// Pointer accessibility notifications
+.pie-timer {
+ width: 60px;
+ height: 60px;
+ -pie-border-width: 3px;
+ -pie-border-color: $selected_bg_color;
+ -pie-background-color: lighten(transparentize($selected_bg_color, 0.7), 40%);
+}
+
+// Screen zoom/Magnifier
+.magnifier-zoom-region {
+ border: 2px solid $selected_bg_color;
+
+ &.full-screen { border-width: 0; }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_app-grid.scss b/data/theme/gnome-shell-sass/widgets/_app-grid.scss
new file mode 100644
index 0000000..c183cfe
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_app-grid.scss
@@ -0,0 +1,144 @@
+/* App Grid */
+
+$app_icon_size: 96px;
+
+// app icons
+.icon-grid {
+ row-spacing: $base_spacing * 6;
+ column-spacing: $base_spacing * 6;
+ max-row-spacing: $base_spacing * 12;
+ max-column-spacing: $base_spacing * 12;
+}
+
+/* App Icons */
+
+$app_grid_fg_color: #fff;
+
+// Icon tiles in the app grid
+.app-well-app,
+%app-well-app {
+ @include overview-icon($app_grid_fg_color);
+
+ .overview-icon.overview-icon-with-label {
+ padding: 10px 8px 5px 8px;
+
+ > StBoxLayout {
+ spacing: $base_spacing;
+ }
+ }
+}
+
+/* App Folders */
+.app-well-app.app-folder {
+ background-color: transparentize($osd_bg_color, 0.8);
+ border-radius: $base_border_radius + 4px; // same as %icon_tile
+}
+
+// expanded folder
+.app-folder-dialog {
+ border-radius: $modal_radius * 1.5;
+ border: 1px solid $osd_outer_borders_color;
+ background-color: transparentize(darken($osd_bg_color,10%), 0.05);
+ padding: 12px;
+
+ & .folder-name-container {
+ padding: 24px 36px 0;
+ spacing: 12px;
+
+ & .folder-name-label,
+ & .folder-name-entry {
+ font-size: 18pt;
+ font-weight: 800;
+ }
+
+ & .folder-name-entry { width: 300px }
+
+ /* FIXME: this is to keep the label in sync with the entry */
+ & .folder-name-label { padding: 5px 7px; color: $osd_fg_color; }
+
+ & .edit-folder-button {
+ @extend %button;
+
+ padding: 0;
+ width: 36px;
+ height: 36px;
+ border-radius: 18px;
+
+ & > StIcon { icon-size: 16px }
+ }
+ }
+
+ & .icon-grid {
+ row-spacing: $base_spacing * 2;
+ column-spacing: $base_spacing * 5;
+ }
+
+ & .page-indicators {
+ margin-bottom: 18px;
+
+ .page-indicator {
+ padding: 15px 12px;
+ }
+ }
+}
+.app-folder-dialog-container {
+ padding: 12px;
+ width: 620px;
+ height: 620px;
+}
+
+.app-folder-icon {
+ padding: $base_padding;
+ spacing-rows: $base_spacing;
+ spacing-columns: $base_spacing;
+}
+
+
+// Running app indicator (also shown in dash)
+.app-well-app-running-dot {
+ height: 5px;
+ width: 5px;
+ border-radius:5px;
+ background-color: $osd_fg_color;
+ margin-bottom: 1px;
+}
+
+// Rename popup for app folders
+.rename-folder-popup {
+ .rename-folder-popup-item {
+ spacing: $base_spacing;
+ &:ltr, &:rtl { padding: 0 $base_padding * 2; }
+ }
+}
+
+// right-click app menu
+.app-menu,
+.app-well-menu {
+ max-width: 27.25em;
+}
+
+// App Grid pagination indicators
+.page-indicator {
+ padding: 15px 20px;
+
+ .page-indicator-icon {
+ width: 10px;
+ height: 10px;
+ border-radius: 10px; // the same as height&width
+ background-color: white;
+ }
+}
+
+// Some hacks I don't even know
+.all-apps {
+ // horizontal padding to make sure scrollbars or dash don't overlap content
+ padding: 0px 88px 10px 88px;
+}
+
+// shutdown and other actions in the grid
+.system-action-icon {
+ background-color: rgba(0,0,0,0.8);
+ color: #fff;
+ border-radius: 99px;
+ icon-size: $app_icon_size * 0.5;
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_base.scss b/data/theme/gnome-shell-sass/widgets/_base.scss
new file mode 100644
index 0000000..914dd59
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_base.scss
@@ -0,0 +1,18 @@
+// Links
+.shell-link {
+ color: $link_color;
+
+ &:hover {
+ color: lighten($link_color, 10%);
+ }
+}
+
+// Outline for low res icons
+.lowres-icon {
+ icon-shadow: 0 1px 2px rgba(black, 0.3);
+}
+
+// Dropshadow for large icons
+.icon-dropshadow {
+ icon-shadow: 0 1px 2px rgba(black, 0.4);
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_buttons.scss b/data/theme/gnome-shell-sass/widgets/_buttons.scss
new file mode 100644
index 0000000..709ac46
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_buttons.scss
@@ -0,0 +1,5 @@
+/* Buttons */
+
+.button {
+ @extend %button; // that's it
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_calendar.scss b/data/theme/gnome-shell-sass/widgets/_calendar.scss
new file mode 100644
index 0000000..16391a1
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_calendar.scss
@@ -0,0 +1,291 @@
+/* Date/Time Menu */
+
+.clock-display-box {
+ spacing: $base_spacing / 2;
+
+ .clock {
+ padding-left: $base_padding;
+ padding-right: $base_padding;
+ }
+}
+
+// overall menu
+#calendarArea {
+ padding:0;
+}
+
+// Calendar menu side column
+.datemenu-calendar-column {
+ spacing: $base_spacing;
+ border: 0 solid $bubble_borders_color;
+ padding: 0 $base_padding * 2;
+
+ &:ltr {margin-right: $base_margin * 2; border-left-width: 1px; }
+ &:rtl {margin-left: $base_margin * 2; border-right-width: 1px; }
+
+ .datemenu-displays-section {
+ }
+
+ .datemenu-displays-box {
+ spacing: $base_spacing;
+ }
+}
+
+.events-section-title {
+ @include notification_bubble($flat: true);
+ color: desaturate(darken($fg_color,40%), 10%);
+ font-weight: bold;
+ padding: .4em;
+}
+
+/* today button (the date) */
+.datemenu-today-button {
+ @include notification_bubble($flat: true);
+ padding: $base_padding * 1.5;
+
+ // weekday label
+ .day-label {
+ @include fontsize($base_font_size+1);
+ font-weight: bold;
+ }
+
+ // date label
+ .date-label {
+ @include fontsize($base_font_size+7);
+ font-weight: 1000;
+ }
+}
+
+/* Calendar */
+.calendar {
+ @include notification_bubble;
+ padding: $base_padding;
+
+ // month
+ .calendar-month-label {
+ color: lighten($fg_color,5%);
+ font-weight: bold;
+ padding: 8px 0;
+ &:focus {}
+ }
+
+ // prev/next month icons
+ .calendar-change-month-back StIcon,
+ .calendar-change-month-forward StIcon {
+ icon-size: $base_icon_size;
+ }
+
+ .pager-button {
+ background-color: transparent;
+ height: 32px;
+ width: 32px;
+ border-radius: $base_border_radius;
+ &:hover, &:focus { background-color: lighten($hover_bg_color, 5%); }
+ &:active { background-color: $active_bg_color; }
+ }
+
+
+ $calendar_day_size: 32px;
+
+ .calendar-day-base {
+ @include fontsize($base_font_size - 3);
+ text-align: center;
+ width: $calendar_day_size;
+ height: $calendar_day_size;
+ padding: 0;
+ margin: 2px;
+ border-radius: $calendar_day_size * 0.5 + 2px;
+ border: 1px solid transparent; //avoid jumparound due to today
+ font-feature-settings: "tnum";
+ &:hover, &:focus { background-color: $hover_bg_color; }
+ &:active,&:selected {
+ color: lighten($fg_color,10%);
+ background-color: darken($bg_color,5%);
+ }
+
+ // day of week heading
+ &.calendar-day-heading {
+ color: lighten($fg_color,10%);
+ margin-top: 1em;
+ @include fontsize($base_font_size - 4);
+ }
+ }
+
+ .calendar-day { //border collapse hack - see calendar.js
+ border-width: 0;
+ }
+
+ .calendar-day-top {
+ border-top-width: 1px;
+ }
+
+ .calendar-day-left {
+ border-left-width: 1px;
+ }
+
+ .calendar-work-day {}
+
+ .calendar-nonwork-day {
+ color: $insensitive_fg_color;
+ }
+
+ // Today
+ .calendar-today {
+ font-weight: bold;
+ border: 1px solid transparent;
+ background-color: $selected_bg_color;
+ color: $selected_fg_color;
+
+ &:hover,&:focus {
+ background-color:lighten($selected_bg_color, 3%);
+ color: $selected_fg_color;
+ }
+
+ &:active,&:selected {
+ background-color: $selected_bg_color;
+ color: $selected_fg_color;
+
+ &:hover,&:focus {
+ background-color:lighten($selected_bg_color, 3%);
+ color: $selected_fg_color;
+ }
+ }
+ }
+
+ .calendar-day-with-events {
+ background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
+ &.calendar-work-day {
+ color: lighten($fg_color,10%);
+ font-weight: bold;
+ }
+ }
+
+ .calendar-other-month-day {
+ color: transparentize($fg_color ,0.5);
+ }
+
+ .calendar-week-number {
+ @include fontsize($base_font_size - 4);
+ font-weight: bold;
+ height: 1.8em;
+ width: 2.3em;
+ border-radius: 2px;
+ margin: 6px;
+ background-color: darken($bg_color, 2%);
+ color: lighten($fg_color, 5%);
+ }
+}
+
+/* Events */
+.events-button {
+ @include notification_bubble;
+ padding: $base_padding * 2;
+
+ .events-box {
+ spacing: $base_spacing;
+ }
+
+ .events-list {
+ spacing: 2 * $base_spacing;
+ }
+
+ .events-title {
+ color: desaturate(darken($fg_color,40%), 10%);
+ font-weight: bold;
+ margin-bottom: $base_margin;
+ }
+
+ .event-time {
+ color: darken($fg_color,20%);
+ font-feature-settings: "tnum";
+ @include fontsize($base_font_size - 1);
+ }
+}
+
+/* World clocks */
+.world-clocks-button {
+ @include notification_bubble;
+ padding: $base_padding * 2;
+
+ .world-clocks-grid {
+ spacing-rows: $base_spacing;
+ spacing-columns: $base_spacing * 2;
+ }
+
+ // title
+ .world-clocks-header {
+ color: desaturate(darken($fg_color,40%), 10%);
+ font-weight: bold;
+ }
+
+ // city label
+ .world-clocks-city {
+ color: $fg_color;
+ @include fontsize($base_font_size);
+ font-weight: normal;
+ }
+
+ // timezone time
+ .world-clocks-time {
+ font-weight: bold;
+ color: $fg_color;
+ font-feature-settings: "tnum";
+ @include fontsize($base_font_size);
+
+ &:ltr { text-align: right; }
+ &:rtl { text-align: left; }
+ }
+
+ // timezone offset label
+ .world-clocks-timezone {
+ color: darken($fg_color,20%);
+ font-feature-settings: "tnum";
+ @include fontsize($base_font_size - 1);
+ }
+}
+
+/* Weather */
+.weather-button {
+ @include notification_bubble;
+ padding: $base_padding * 2;
+
+ .weather-box {
+ spacing: $base_spacing + $base_margin;
+ }
+
+ .weather-header-box {
+ spacing: $base_spacing;
+ }
+
+ .weather-header {
+ color: desaturate(darken($fg_color,40%), 10%);
+ font-weight: bold;
+
+ &.location {
+ font-weight: normal;
+ @include fontsize($base_font_size - 1);
+ }
+ }
+
+ .weather-grid {
+ spacing-rows: $base_spacing;
+ spacing-columns: $base_spacing * 2;
+ }
+
+ .weather-forecast-time {
+ color: darken($fg_color,30%);
+ font-feature-settings: "tnum";
+ @include fontsize($base_font_size - 2);
+ font-weight: normal;
+ padding-top: 0.2em;
+ padding-bottom: 0.4em;
+ }
+
+ .weather-forecast-icon {
+ icon-size: $base_icon_size * 2;
+ }
+
+ .weather-forecast-temp {
+ font-weight: bold;
+ }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_check-box.scss b/data/theme/gnome-shell-sass/widgets/_check-box.scss
new file mode 100644
index 0000000..fc71467
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_check-box.scss
@@ -0,0 +1,18 @@
+/* Check Boxes */
+
+// these are equal to the size of the SVG assets
+$check_height: 22px;
+$check_width: 24px;
+
+
+.check-box {
+ StBoxLayout { spacing: .8em; }
+ StBin {
+ width: $check_width;
+ height: $check_height;
+ background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg");
+ }
+ &:focus StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
+ &:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
+ &:focus:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_corner-ripple.scss b/data/theme/gnome-shell-sass/widgets/_corner-ripple.scss
new file mode 100644
index 0000000..9137b67
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_corner-ripple.scss
@@ -0,0 +1,15 @@
+/* Activities Ripple */
+
+$ripple_size: 50px;
+
+.ripple-box {
+ background-color: lighten(transparentize($selected_bg_color, 0.7), 40%);
+ box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%);
+ // plus + 2px for the border (box-shadow)
+ width: $ripple_size + 2px;
+ height: $ripple_size + 2px;
+ border-radius: 0 0 $ripple_size + 2px 0; // radius equals the size of the box to give us the curve
+
+ // just a simple change to the border radius position
+ &:rtl { border-radius: 0 0 0 $ripple_size + 2px; }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_dash.scss b/data/theme/gnome-shell-sass/widgets/_dash.scss
new file mode 100644
index 0000000..c639fad
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_dash.scss
@@ -0,0 +1,61 @@
+/* Dash */
+
+$dash_placeholder_size: 32px;
+$dash_spacing: $base_padding + 4px;
+$dash_border_radius: $modal_radius * 1.5;
+
+#dash {
+ @extend %overview_panel;
+ @include fontsize($base_font_size - 2);
+ padding: ($dash_spacing / 2) 0;
+
+ border-radius: 0 $dash_border_radius $dash_border_radius 0;
+ border-left-width: 0;
+ &:rtl {
+ border-radius: $dash_border_radius 0 0 $dash_border_radius;
+ border-right-width: 0;
+ }
+
+ .placeholder {
+ // background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
+ background-image:none;
+ background-size: contain;
+ height: $dash_placeholder_size;
+ }
+
+ .empty-dash-drop-target {
+ width: $dash_placeholder_size;
+ height: $dash_placeholder_size;
+ }
+}
+
+// Dash Items
+.dash-item-container > StWidget {
+ padding: ($dash_spacing / 2) $dash_spacing;
+}
+
+// OSD Tooltip
+.dash-label {
+ background-color: transparentize($osd_bg_color,0.05);
+ border-radius: $base_border_radius + 2px;
+ border:none;
+ box-shadow:0 0 0 1px $osd_outer_borders_color;
+ color: $osd_fg_color;
+ padding: $base_padding $base_padding + 2px;
+ text-align: center;
+ -x-offset: $base_margin * 2; // distance from the dash edge
+}
+
+// Show apps button
+.show-apps {
+ @include overview-icon($osd_fg_color);
+
+ &:focus,
+ &:checked {
+ .overview-icon {
+ background-color: darken($osd_bg_color,10%);
+ color: $fg_color;
+ }
+ }
+}
+
diff --git a/data/theme/gnome-shell-sass/widgets/_dialogs.scss b/data/theme/gnome-shell-sass/widgets/_dialogs.scss
new file mode 100644
index 0000000..0f568b7
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_dialogs.scss
@@ -0,0 +1,164 @@
+/* Modal Dialogs */
+
+.headline {
+ @include fontsize($base_font_size + 1);
+}
+
+.modal-dialog {
+ border-radius: $modal_radius;
+ @extend %bubble_panel;
+
+ .modal-dialog-content-box {
+ margin: 32px 40px;
+ spacing: 32px;
+ max-width: 28em;
+ }
+
+ .modal-dialog-linked-button {
+ @extend %bubble_button;
+ }
+}
+
+/* End Session Dialog */
+.end-session-dialog {
+ width: 30em;
+
+ .end-session-dialog-battery-warning,
+ .dialog-list-title {
+ color: $warning_color;
+ }
+}
+
+/* Message Dialog */
+.message-dialog-content {
+ spacing: 18px;
+
+ .message-dialog-title {
+ text-align: center;
+ font-size: 18pt;
+ font-weight: 800;
+
+ &.lightweight {
+ font-size: 13pt;
+ font-weight: 800;
+ }
+ }
+ .message-dialog-description { text-align: center; }
+}
+
+/* Dialog List */
+.dialog-list {
+ spacing: 18px;
+
+ .dialog-list-title {
+ text-align: center;
+ font-weight: bold;
+ }
+
+ .dialog-list-scrollview { max-height: 200px; }
+ .dialog-list-box {
+ spacing: 1em;
+
+ .dialog-list-item {
+ spacing: 1em;
+
+ .dialog-list-item-title { font-weight: bold; }
+ .dialog-list-item-description {
+ color: darken($fg_color,5%);
+ @include fontsize($base_font_size - 1);
+ }
+ }
+ }
+}
+
+/* Run Dialog */
+.run-dialog {
+ .modal-dialog-content-box {
+ margin-top: 24px;
+ margin-bottom: 14px;
+ }
+ .run-dialog-entry { width: 20em; }
+ .run-dialog-description {
+ @include fontsize($base_font_size - 1);
+ text-align: center;
+ color: darken($fg_color, 20%);
+ }
+}
+
+/* Password or Authentication Dialog */
+
+.prompt-dialog {
+ width: 28em;
+
+ .modal-dialog-content-box {
+ margin-bottom: 24px;
+ }
+}
+
+.prompt-dialog-password-grid {
+ spacing-rows: 8px;
+ spacing-columns: 4px;
+
+ .prompt-dialog-password-entry {
+ width: auto;
+
+ // 4px (spacing) + 16px (spinner-width)
+ &:ltr { margin-left: 20px; }
+ &:rtl { margin-right: 20px; }
+ }
+}
+
+.prompt-dialog-password-layout {
+ spacing: 8px;
+}
+
+.prompt-dialog-password-entry {
+ width: 20em;
+}
+
+.prompt-dialog-error-label,
+.prompt-dialog-info-label,
+.prompt-dialog-null-label {
+ text-align: center;
+ @include fontsize($base_font_size - 1);
+}
+
+.prompt-dialog-error-label {
+ color: $warning_color;
+}
+
+
+/* Polkit Dialog */
+
+.polkit-dialog-user-layout {
+ text-align: center;
+ spacing: 8px;
+ margin-bottom: 6px;
+
+ .polkit-dialog-user-root-label { color: $warning_color; }
+}
+
+/* Audio selection dialog */
+.audio-device-selection-dialog {
+ .modal-dialog-content-box { margin-bottom: 28px; }
+ .audio-selection-box { spacing: 20px; }
+}
+
+.audio-selection-device {
+ border: 1px solid $bubble_borders_color;
+ border-radius: 12px;
+ &:hover,&:focus { background-color: $hover_bg_color; }
+ &:active {
+ background-color: $selected_bg_color;
+ color: $selected_fg_color;
+ }
+}
+
+.audio-selection-device-box {
+ padding: 20px;
+ spacing: 20px;
+}
+
+.audio-selection-device-icon {
+ icon-size: $base_icon_size * 4;
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_entries.scss b/data/theme/gnome-shell-sass/widgets/_entries.scss
new file mode 100644
index 0000000..0a43e86
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_entries.scss
@@ -0,0 +1,27 @@
+/* Entries */
+
+StEntry {
+ border-radius: $base_border_radius;
+ padding: 8px;
+ border-width: 1px;
+ color: $fg_color;
+ @include entry(normal);
+ //&:hover { @include entry(hover);}
+ &:focus { @include entry(focus);}
+ &:insensitive { @include entry(insensitive);}
+ selection-background-color: $selected_bg_color;
+ selected-color: $selected_fg_color;
+ StIcon.capslock-warning {
+ icon-size: 16px;
+ warning-color: $warning_color;
+ padding: 0 4px;
+ }
+ StIcon.peek-password {
+ icon-size: $base_icon_size;
+ padding: 0 4px;
+ }
+ StLabel.hint-text {
+ margin-left: 2px;
+ color: transparentize($fg_color, 0.3);
+ }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_hotplug.scss b/data/theme/gnome-shell-sass/widgets/_hotplug.scss
new file mode 100644
index 0000000..acd0265
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_hotplug.scss
@@ -0,0 +1,10 @@
+// hotplug
+
+.hotplug-notification-item {
+ @extend %bubble_button;
+}
+
+.hotplug-notification-item-icon {
+ icon-size: 24px;
+ padding: 0 4px;
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_ibus-popup.scss b/data/theme/gnome-shell-sass/widgets/_ibus-popup.scss
new file mode 100644
index 0000000..eead703
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_ibus-popup.scss
@@ -0,0 +1,35 @@
+// IBus Candidate Popup
+
+.candidate-popup-boxpointer {
+ @extend .popup-menu-boxpointer;
+}
+
+.candidate-popup-content {
+ padding: 0.5em;
+ spacing: 0.3em;
+}
+
+.candidate-index {
+ padding: 0 0.5em 0 0;
+ color: darken($fg_color,10%);
+}
+
+.candidate-box {
+ padding: 0.3em 0.5em 0.3em 0.5em;
+ border-radius: $base_border_radius;
+ &:selected,&:hover { background-color: $selected_bg_color; color: $selected_fg_color; }
+}
+
+.candidate-page-button-box {
+ height: 2em;
+ .vertical & { padding-top: 0.5em; }
+ .horizontal & { padding-left: 0.5em; }
+}
+
+.candidate-page-button {
+ padding: 4px;
+}
+
+.candidate-page-button-previous { border-radius: $base_border_radius 0px 0px $base_border_radius; border-right-width: 0; }
+.candidate-page-button-next { border-radius: 0px $base_border_radius $base_border_radius 0px; }
+.candidate-page-button-icon { icon-size: 1em; } \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_keyboard.scss b/data/theme/gnome-shell-sass/widgets/_keyboard.scss
new file mode 100644
index 0000000..f866d77
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_keyboard.scss
@@ -0,0 +1,115 @@
+/* On-screen Keyboard */
+
+$key_size: 1.2em;
+$key_border_radius: $base_border_radius + 3px;
+$key_bg_color: $bg_color;
+// $default_key_bg_color: darken($key_bg_color, 4%);
+$default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten($osd_bg_color, 2%));
+
+
+// draw keys using button function
+#keyboard {
+ background-color: transparentize(if($variant=='light', darken($bg_color, 5%), darken($bg_color, 8%)), 0.1);
+ box-shadow: inset 0 1px 0 0 $osd_outer_borders_color;
+
+ .page-indicator {
+ padding: $base_padding;
+
+ .page-indicator-icon {
+ width: 8px;
+ height: 8px;
+ }
+ }
+}
+
+// the container for individual keys
+.key-container {
+ padding: $base_margin;
+ spacing: $base_margin;
+}
+
+// the keys
+.keyboard-key {
+
+ @include button(normal, $c:$key_bg_color);
+
+ &:focus { @include button(focus);}
+ &:hover, &:checked { @include button(hover, $c: $key_bg_color);}
+ &:active { @include button(active, $c: $key_bg_color); }
+
+ @include fontsize($base_font_size + 5);
+ min-height: $key_size;
+ min-width: $key_size;
+ border-width: 1px;
+ border-style: solid;
+ border-radius: $key_border_radius;
+
+ &:grayed { //FIXMEy
+ background-color: darken($bg_color, 3%);
+ color: $osd_fg_color;
+ border-color: $osd_borders_color;
+ }
+
+ // non-character keys
+ &.default-key {
+ @include button(normal, $c:$default_key_bg_color);
+ &:hover, &:checked {@include button(hover, $c: $default_key_bg_color);}
+ &:active { @include button(active, $c: $default_key_bg_color);}
+ }
+
+ // enter key is suggested-action
+ &.enter-key {
+ @include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color);
+ &:hover, &:checked { @include button(hover, $c: lighten($selected_bg_color, 3%));}
+ &:active {@include button(active, $c: darken($selected_bg_color, 2%));}
+ }
+
+ &.shift-key-uppercase { color: $selected_bg_color }
+
+ StIcon { icon-size: 1.125em; }
+}
+
+// long press on a key popup
+.keyboard-subkeys {
+ color: $osd_fg_color;
+ -arrow-border-radius: $modal_radius;
+ -arrow-background-color: $osd_bg_color;
+ -arrow-border-width: 1px;
+ -arrow-border-color: lighten($osd_bg_color, 9%);
+ -arrow-base: 20px;
+ -arrow-rise: 10px;
+ -boxpointer-gap: $base_spacing;
+
+ .keyboard-key {
+ @include button(normal, $c:$key_bg_color);
+
+ &:focus { @include button(focus);}
+ &:hover, &:checked { @include button(hover, $c: $key_bg_color);}
+ &:active { @include button(active, $c: $key_bg_color); }
+
+ border-radius:$base_border_radius;
+ }
+}
+
+// emoji
+.emoji-page {
+ .keyboard-key {
+ background-color: transparent;
+ border: none;
+ color: initial;
+ }
+}
+
+.emoji-panel {
+ .keyboard-key:latched {
+ border-color: lighten($selected_bg_color, 5%);
+ background-color: $selected_bg_color;
+ }
+}
+
+// suggestions
+.word-suggestions {
+ @include fontsize($base_font_size + 3);
+ spacing: 12px;
+ min-height: 20pt;
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
new file mode 100644
index 0000000..06fdcf2
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
@@ -0,0 +1,169 @@
+/* Login Dialog */
+
+.login-dialog-banner-view {
+ padding-top: 24px;
+ max-width: 23em;
+}
+
+.login-dialog {
+ //reset
+ border: none;
+ background-color: transparent;
+
+ $_gdm_bg: lighten(#2e3436, 19%);
+
+ StEntry {
+ @if $variant=='dark' {
+ $_gdm_entry_bg: transparentize(lighten(desaturate(#241f31, 20%), 2%), 0.5);
+ background-color: $_gdm_entry_bg;
+ color: $osd_fg_color;
+ }
+ }
+
+ .modal-dialog-button-box { spacing: 3px; }
+ .modal-dialog-button {
+ padding: 4px 18px;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.2);
+ background-color: $_gdm_bg;
+ border-color: $_gdm_bg;
+ color: $fg_color;
+
+ $_hover_c: lighten($_gdm_bg, 5%);
+ &:hover, &:focus {
+ background-color: $_hover_c;
+ border-color: $_hover_c;
+ }
+ &:active {
+ $_active_c: darken($_gdm_bg, 5%);
+ box-shadow: none;
+ background-color: $_active_c;
+ border-color: $_active_c;
+ }
+ &:insensitive {
+ @include button(insensitive);
+ border-color: darken($_gdm_bg, 5%);
+ background-color: darken($_gdm_bg, 5%);
+ color: transparentize($fg_color, 0.3);
+ }
+ &:default {
+ @include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color);
+ border-color: $selected_bg_color;
+ &:hover, &:focus {
+ @include button(hover,$c:$selected_bg_color, $tc:$selected_fg_color);
+ $_def_hover_c: lighten($selected_bg_color, 5%);
+ background-color: $_def_hover_c;
+ border-color: $_def_hover_c;
+ }
+ &:active {
+ @include button(active,$c:$selected_bg_color, $tc:$selected_fg_color);
+ $_def_active_c: darken($selected_bg_color, 5%);
+ background-color: $_def_active_c;
+ border-color: $_def_active_c;
+ }
+ &:insensitive {
+ @include button(insensitive);
+ border-color: darken($selected_bg_color, 10%);
+ background-color: darken($selected_bg_color, 10%);
+ color: transparentize($selected_fg_color, 0.3);
+ }
+ }
+ }
+
+ .cancel-button,
+ .switch-user-button,
+ .login-dialog-session-list-button {
+ padding: 0;
+ border-radius: 99px;
+ width: $base_icon_size * 2;
+ height: $base_icon_size * 2;
+ border-color: transparentize($bg_color,0.7);
+ background-color: transparentize($bg_color,0.7);
+
+ StIcon { icon-size: $base_icon_size; }
+ }
+
+ .caps-lock-warning-label,
+ .login-dialog-message-warning {
+ color: $osd_fg_color;
+ }
+}
+
+.login-dialog-logo-bin { padding: 24px 0px; }
+.login-dialog-banner { color: darken($osd_fg_color,10%); }
+.login-dialog-button-box { width: 23em; spacing: 5px; }
+.login-dialog-message { text-align: center; }
+.login-dialog-message-hint { padding-top: 0; padding-bottom: 20px; }
+.login-dialog-user-selection-box { padding: 100px 0px; }
+.login-dialog-not-listed-label {
+ padding-left: 2px;
+ .login-dialog-not-listed-button:focus &,
+ .login-dialog-not-listed-button:hover & {
+ color: $osd_fg_color;
+ }
+}
+
+.login-dialog-not-listed-label {
+ @include fontsize($base_font_size - 1);
+ font-weight: bold;
+ color: darken($osd_fg_color,30%);
+ padding-top: 1em;
+}
+
+.login-dialog-user-list-view { -st-vfade-offset: 1em; }
+.login-dialog-user-list {
+ spacing: 12px;
+ width: 23em;
+ &:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
+ &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
+}
+
+.login-dialog-user-list-item {
+ border-radius: $base_border_radius + 4px;
+ padding: 6px;
+ color: darken($osd_fg_color,30%);
+ &:ltr .user-widget { padding-right: 1em; }
+ &:rtl .user-widget { padding-left: 1em; }
+ .login-dialog-timed-login-indicator {
+ height: 2px;
+ margin-top: 6px;
+ background-color: $osd_fg_color;
+ }
+ &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
+}
+
+.user-widget-label {
+ color: $osd_fg_color;
+}
+
+.user-widget.horizontal .user-widget-label {
+ @include fontsize($base_font_size + 2);
+ font-weight: bold;
+ padding-left: 15px;
+
+ &:ltr { padding-left: 14px; text-align: left; }
+ &:rtl { padding-right: 14px; text-align: right; }
+}
+
+.user-widget.vertical .user-widget-label {
+ @include fontsize($base_font_size + 5);
+ text-align: center;
+ font-weight: normal;
+ padding-top: 16px;
+}
+
+.login-dialog-prompt-layout {
+ padding-top: 24px;
+ padding-bottom: 12px;
+ spacing: $base_spacing * 2;
+ width: 23em;
+}
+
+.login-dialog-prompt-entry {
+ height: 1.5em;
+}
+
+.login-dialog-prompt-label {
+ color: darken($osd_fg_color, 20%);
+ @include fontsize($base_font_size + 1);
+ padding-top: 1em;
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_looking-glass.scss b/data/theme/gnome-shell-sass/widgets/_looking-glass.scss
new file mode 100644
index 0000000..006c2ef
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_looking-glass.scss
@@ -0,0 +1,109 @@
+/* Looking Glass */
+
+$text_fg_color: #ccc;
+
+// Dialog
+#LookingGlassDialog {
+ background-color: $osd_bg_color;
+ spacing: $base_spacing;
+ padding: 4px;
+ border: 1px solid transparentize($osd_fg_color, 0.8);
+ border-radius: $base_border_radius;
+ color: $osd_fg_color;
+
+ & > #Toolbar {
+ border: none;
+ border-radius: $base_border_radius;
+ background-color: $osd_bg_color;
+ }
+
+ .labels { spacing: $base_spacing; }
+ .notebook-tab {
+ -natural-hpadding: $base_padding * 2;
+ -minimum-hpadding: 6px;
+ font-weight: bold;
+ color: darken($osd_fg_color, 15%);
+ transition-duration: 100ms;
+ padding-left: .3em;
+ padding-right: .3em;
+ border-bottom-width: 2px;
+ &:hover {
+ color: $osd_fg_color;
+ }
+ &:selected {
+ border-bottom-width: 2px;
+ box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color, 5%);
+ color: $osd_fg_color;
+ }
+ }
+ StBoxLayout#EvalBox { padding: 4px; spacing: $base_spacing; }
+ StBoxLayout#ResultsArea { spacing: $base_spacing; }
+}
+
+.lg-dialog {
+ StEntry {
+ background-color: transparentize(lighten($osd_bg_color, 5%), 0.4);
+ color: $osd_fg_color;
+ border-color: transparentize($osd_fg_color, 0.8);
+ min-height: 22px;
+ selection-background-color: $selected_bg_color;
+ selected-color: $selected_fg_color;
+ }
+ .shell-link {
+ color: $link_color;
+ &:hover { color: lighten($link_color, 10%); }
+ &:active { color: darken($link_color, 10%); }
+ }
+ .actor-link {
+ color: $text_fg_color;
+ &:hover { color: lighten($text_fg_color, 20%); }
+ &:active { color: darken($text_fg_color, 20%); }
+ }
+}
+
+.lg-completions-text {
+ font-size: .9em;
+ font-style: italic;
+}
+
+.lg-obj-inspector-title {
+ spacing: $base_spacing;
+}
+
+.lg-obj-inspector-button {
+ border: 1px solid $osd_borders_color;
+ padding: 4px;
+ border-radius: $base_border_radius;
+ &:hover { border: 1px solid #ffffff; }
+}
+
+// Extensions
+#lookingGlassExtensions { padding: 4px; }
+
+.lg-extensions-list {
+ padding: 4px;
+ spacing: 6px;
+}
+
+.lg-extension {
+ border: 1px solid lighten($osd_borders_color, 5%);
+ background-color: lighten($osd_bg_color, 5%);
+ border-radius: $base_border_radius;
+ padding: 4px;
+}
+
+.lg-extension-name {
+ font-weight: bold;
+}
+
+.lg-extension-meta {
+ spacing: 6px;
+}
+
+// Inspector
+#LookingGlassPropertyInspector {
+ background: $osd_bg_color;
+ border: 1px solid $osd_borders_color;
+ border-radius: $base_border_radius;
+ padding: 6px;
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_message-list.scss b/data/theme/gnome-shell-sass/widgets/_message-list.scss
new file mode 100644
index 0000000..45edb26
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_message-list.scss
@@ -0,0 +1,136 @@
+/* Message List */
+// a.k.a. notifications in the menu
+
+// main list
+.message-list {
+ width: 31.5em;
+ padding: 0 $base_padding * 2;
+
+ .message-list-placeholder { spacing: 12px; }
+}
+
+.message-list-sections {
+ spacing: $base_spacing;
+ margin: 0 $base_margin * 4; // to account for scrollbar
+}
+
+.message-list-section,
+.message-list-section-list {
+ spacing: $base_spacing;
+}
+
+// do-not-disturb + clear button
+.message-list-controls {
+ margin: ($base_margin * 2) ($base_margin * 4) 0;
+ // NOTE: remove the padding if notification_bubble could remove margin for drop shadow
+ padding: $base_margin;
+ spacing: $base_spacing * 2;
+}
+
+// message bubbles
+.message {
+ @include notification_bubble;
+
+ // icon container
+ .message-icon-bin {
+ padding: ($base_padding * 3) 0 ($base_padding * 3) ($base_padding * 2);
+
+ &:rtl {
+ padding: ($base_padding * 3) ($base_padding * 2) ($base_padding * 3) 0;
+ }
+
+ // icon size and color
+ > StIcon {
+ icon-size: $base_icon_size*2; // 32px
+ -st-icon-style: symbolic;
+ }
+
+ // fallback
+ > .fallback-app-icon {
+ width: $base_icon_size;
+ height: $base_icon_size;
+ }
+ }
+
+ // content
+ .message-content {
+ padding: $base_padding + $base_margin * 2;
+ spacing: 4px;
+ }
+
+ // title
+ .message-title {
+ font-weight: bold;
+ }
+
+ // secondary container in title box
+ .message-secondary-bin {
+ padding: 0 $base_margin * 2;
+
+ // notification time stamp
+ > .event-time {
+ color: transparentize($fg_color, 0.5);
+ @include fontsize($base_font_size - 2);
+ /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
+ padding-bottom: 0.13em;
+
+ &:ltr { text-align: right };
+ &:rtl { text-align: left };
+ }
+ }
+
+ // close button
+ .message-close-button {
+ color: lighten($fg_color, 15%);
+ &:hover { color: if($variant=='light', lighten($fg_color, 30%), darken($fg_color, 10%)); }
+ &:active { color: if($variant=='light', lighten($fg_color, 40%), darken($fg_color, 20%)); }
+ }
+
+ // body
+ .message-body {
+ color: darken($fg_color, 10%);
+ }
+}
+
+// URLs in messages
+.url-highlighter {
+ link-color: $link_color;
+}
+
+/* Media Controls */
+.message-media-control {
+ padding: $base_padding * 2 $base_padding * 4;
+ color: darken($fg_color, 15%);
+
+ // uses $hover_bg_color since the media controls are in a notification_bubble
+ &:hover {
+ background-color: lighten($hover_bg_color, 5%);
+ color: $fg_color;
+ }
+
+ &:active {
+ background-color: darken($hover_bg_color, 2%);
+ color: $fg_color;
+ }
+
+ &:insensitive { color: darken($fg_color,40%); }
+
+ // fix border-radius for last button
+ &:last-child:ltr { border-radius: 0 $base_border_radius+2 $base_border_radius+2 0; }
+ &:last-child:rtl { border-radius: $base_border_radius+2 0 0 $base_border_radius+2; }
+}
+
+// album-art
+.media-message-cover-icon {
+ icon-size: $base_icon_size*2 !important; // 48px
+ border-radius: $base_border_radius;
+
+ // when there is no artwork
+ &.fallback {
+ color: darken($fg_color, 17%);
+ background-color: $bg_color;
+ border: 1px solid transparent;
+ border-radius: $base_border_radius;
+ icon-size: $base_icon_size * 2 !important;
+ }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_misc.scss b/data/theme/gnome-shell-sass/widgets/_misc.scss
new file mode 100644
index 0000000..96dd4d1
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_misc.scss
@@ -0,0 +1,56 @@
+// Rubberband for select-area screenshots
+.select-area-rubberband {
+ background-color: transparentize($selected_bg_color,0.7);
+ border: 1px solid $selected_bg_color;
+}
+
+// User icon
+.user-icon {
+ background-size: contain;
+ color: $osd_fg_color;
+ border-radius: 99px;
+ border: 2px $osd_fg_color;
+ &:hover {
+ color: lighten($osd_fg_color,30%);
+ }
+
+ & StIcon {
+ background-color: transparentize($osd_fg_color,0.95);
+ border-radius: 99px;
+ }
+}
+
+.user-widget.vertical .user-icon {
+ icon-size: $base_icon_size * 6; // 128px
+
+ & StIcon {
+ padding: $base_padding * 3 + 2px; // 20px
+ padding-top: $base_padding * 3; // 18 px
+ padding-bottom: $base_padding * 3 + 4px; // 22px
+ width: $base_icon_size * 5.5; height: $base_icon_size * 5.5; // 88px;
+ }
+}
+
+.user-widget.horizontal .user-icon {
+ icon-size: $base_icon_size * 4; // 64px
+
+ & StIcon {
+ padding: $base_padding * 2 ; // 12px
+ width: $base_icon_size * 2.5; height: $base_icon_size * 2.5; // 40px;
+ }
+}
+
+.lightbox { background-color: black; }
+.flashspot { background-color: white; }
+
+
+// Hidden
+.hidden { color: rgba(0,0,0,0);}
+
+// Caps-lock warning
+.caps-lock-warning-label {
+ text-align: center;
+ padding-bottom: 8px;
+ @include fontsize($base_font_size - 1);
+ color: $warning_color;
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_network-dialog.scss b/data/theme/gnome-shell-sass/widgets/_network-dialog.scss
new file mode 100644
index 0000000..7973d22
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_network-dialog.scss
@@ -0,0 +1,56 @@
+/* Network Dialogs */
+.nm-dialog {
+ max-height: 34em;
+ min-height: 31em;
+ min-width: 32em;
+}
+
+.nm-dialog-content {
+ spacing: 20px;
+ padding: 24px;
+}
+
+.nm-dialog-airplane-box { spacing: 12px; }
+
+.nm-dialog-airplane-headline {
+ font-weight: bold;
+ text-align: center;
+}
+
+.nm-dialog-airplane-text { color: $fg_color; }
+
+// header
+.nm-dialog-header {
+ font-weight: bold;
+}
+.nm-dialog-header-icon {
+ icon-size: $base_icon_size * 2;
+}
+.nm-dialog-header-hbox { spacing: 10px; }
+
+// list of networks
+.nm-dialog-scroll-view {
+ border: 1px solid $borders_color;
+ padding:0;
+ background-color: darken($bg_color, 3%);
+}
+
+// list item
+.nm-dialog-item {
+ @include fontsize($base_font_size);
+ border-bottom: 1px solid $borders_color;
+ padding: $base_padding * 2;
+ spacing: 0px;
+ &:selected {
+ background-color: $selected_bg_color;
+ color: $selected_fg_color;
+ }
+}
+
+// icons in list
+.nm-dialog-icon { icon-size: $base_icon_size; }
+.nm-dialog-icons { spacing: $base_spacing * 2; }
+
+// no networks
+.no-networks-label { color: $insensitive_fg_color; }
+.no-networks-box { spacing: $base_padding; } \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_notifications.scss b/data/theme/gnome-shell-sass/widgets/_notifications.scss
new file mode 100644
index 0000000..5ff46a0
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_notifications.scss
@@ -0,0 +1,57 @@
+/* Notifications & Message Tray */
+
+$notification_banner_height: 64px;
+$notification_banner_width: 34em;
+
+// Banner notifications
+.notification-banner {
+ min-height: $notification_banner_height;
+ width: $notification_banner_width;
+
+ .notification-actions {
+ spacing: 0;
+ }
+
+ .notification-button {
+ @extend %bubble_button;
+ }
+}
+
+// counter
+.summary-source-counter {
+ font-size: $base_font_size - 1pt;
+ font-weight: bold;
+ height: 1.6em;
+ width: 1.6em;
+ -shell-counter-overlap-x: 3px;
+ -shell-counter-overlap-y: 3px;
+ background-color: $selected_bg_color;
+ color: $selected_fg_color;
+ border: 2px solid $fg_color;
+ box-shadow: 0 2px 2px rgba(0,0,0,0.5);
+ border-radius: 0.9em; // should be 0.8 but whatever; wish I could do 50%;
+}
+
+// chat bubbles
+.chat-body { spacing: 5px; }
+.chat-response { margin: 5px; }
+.chat-log-message { color: darken($fg_color,10%); }
+.chat-new-group { padding-top: 1em; }
+.chat-received {
+ padding-left: 4px;
+ &:rtl { padding-left: 0px; padding-right: 4px; }
+}
+
+.chat-sent {
+ padding-left: 18pt;
+ color: lighten($fg_color, 15%);
+ &:rtl { padding-left: 0; padding-right: 18pt; }
+}
+
+.chat-meta-message {
+ padding-left: 4px;
+ @include fontsize($base_font_size - 2);
+ font-weight: bold;
+ color: lighten($fg_color,18%);
+ &:rtl { padding-left: 0; padding-right: 4px; }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_osd.scss b/data/theme/gnome-shell-sass/widgets/_osd.scss
new file mode 100644
index 0000000..f85124c
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_osd.scss
@@ -0,0 +1,45 @@
+/* OSD */
+
+$osd_levelbar_height:8px;
+
+.osd-window {
+ @extend %osd_panel;
+ text-align: center;
+ font-weight: bold;
+ spacing: $base_spacing * 2; // 12px
+ margin: $base_margin * 8; // 32px
+ min-width: 64px;
+ min-height: 64px;
+
+ StIcon {
+ icon-size:$base_icon_size * 6;
+ }
+
+ .osd-monitor-label { font-size: 3em; }
+
+ .level {
+ height: $osd_levelbar_height;
+ -barlevel-height: $osd_levelbar_height;
+ -barlevel-background-color: transparentize($osd_fg_color, if($variant=='light', 0.7, 0.9));
+ -barlevel-active-background-color: $osd_fg_color;
+ -barlevel-overdrive-color: $destructive_color;
+ -barlevel-overdrive-separator-width: 3px;
+ }
+}
+
+/* Pad OSD */
+.pad-osd-window {
+ padding: 32px;
+ background-color: transparentize(#000, 0.2);
+
+ .pad-osd-title-box { spacing: 12px; }
+ .pad-osd-title-menu-box { spacing: 6px; }
+}
+
+.combo-box-label {
+ width: 15em;
+}
+
+.resize-popup {
+ @extend %osd_panel;
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_overview.scss b/data/theme/gnome-shell-sass/widgets/_overview.scss
new file mode 100644
index 0000000..18497de
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_overview.scss
@@ -0,0 +1,10 @@
+/* OVERVIEW */
+
+#overview {
+ spacing: 24px;
+ background-color: transparent;
+}
+
+.overview-controls {
+ padding-bottom: 32px;
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_panel.scss b/data/theme/gnome-shell-sass/widgets/_panel.scss
new file mode 100644
index 0000000..56c445a
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_panel.scss
@@ -0,0 +1,121 @@
+/* Top Bar */
+// a.k.a. the panel
+
+$panel_corner_radius: $base_border_radius+1;
+$panel_bg_color: #000;
+$panel_fg_color: #ccc;
+$panel_height: 1.86em;
+
+
+#panel {
+ background-color: $panel_bg_color;
+ font-weight: bold;
+ height: $panel_height;
+ font-feature-settings: "tnum";
+
+ // transparent panel on lock & login screens
+ &.unlock-screen,
+ &.login-screen {
+ background-color: transparent;
+
+ .panel-corner {
+ -panel-corner-radius: 0;
+ -panel-corner-background-color: transparent;
+ -panel-corner-border-color: transparent;
+ }
+ }
+
+ // spacing between activities, app menu and such
+ #panelLeft, #panelCenter {
+ spacing: $base_spacing;
+ }
+
+ // the rounded outset corners
+ .panel-corner {
+ -panel-corner-radius: $panel_corner_radius;
+ -panel-corner-background-color: $panel_bg_color;
+ -panel-corner-border-width: 2px;
+ -panel-corner-border-color: transparent;
+
+ &:active, &:overview, &:focus {
+ -panel-corner-border-color: lighten($selected_bg_color,5%);
+ }
+ }
+
+ // panel menus
+ .panel-button {
+ font-weight: bold;
+ color: $panel_fg_color;
+ -natural-hpadding: $base_padding * 2;
+ -minimum-hpadding: $base_padding;
+
+ &:hover {
+ color: lighten($panel_fg_color, 20%);
+ }
+
+ &:active, &:overview, &:focus, &:checked {
+ color: lighten($panel_fg_color, 20%);
+ }
+
+ // status area icons
+ .system-status-icon {
+ icon-size: $base_icon_size;
+ padding: $base_padding - 1px;
+ }
+
+ // app menu icon
+ .app-menu-icon {
+ margin-left: $base_margin;
+ margin-right: $base_margin;
+ -st-icon-style: symbolic;
+ // dimensions of the icon are hardcoded
+ }
+
+ // lock & login screen styles
+ .unlock-screen &,
+ .login-screen & {
+ color: lighten($fg_color, 10%);
+ &:focus, &:hover, &:active { color: lighten($fg_color, 10%); }
+ }
+ }
+
+ .panel-button {
+ &:active, &:overview, &:focus, &:checked {
+ // Trick due to St limitations. It needs a background to draw a box-shadow
+ background-color: rgba(0, 0, 0, 0.01);
+ box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color,5%);
+ }
+ }
+
+ .panel-button.clock-display {
+ // Move highlight from .panel-button to .clock
+ &:active, &:overview, &:focus, &:checked {
+ box-shadow: none;
+
+ .clock {
+ background-color: rgba(0, 0, 0, 0.01);
+ box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color,5%);
+ }
+ }
+ }
+
+ .panel-status-indicators-box,
+ .panel-status-menu-box {
+ spacing: 2px;
+ }
+
+ // spacing between power icon and (optional) percentage label
+ .power-status.panel-status-indicators-box {
+ spacing: 0;
+ }
+
+ // indicator for active
+ .screencast-indicator,
+ .remote-access-indicator { color: $warning_color; }
+}
+
+// App Menu
+#appMenu {
+ spacing: $base_spacing;
+ .label-shadow { color: transparent; }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_popovers.scss b/data/theme/gnome-shell-sass/widgets/_popovers.scss
new file mode 100644
index 0000000..db9df9a
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_popovers.scss
@@ -0,0 +1,131 @@
+/* Popovers/Menus */
+
+$popover_arrow_height: 12px;
+
+//.the popover itself
+.popup-menu-boxpointer {
+ -arrow-border-radius: $base_border_radius+4;
+ -arrow-background-color: $bg_color;
+ -arrow-border-width: 1px;
+ -arrow-border-color: $borders_color;
+ -arrow-base: $popover_arrow_height * 2;
+ -arrow-rise: $popover_arrow_height;
+ -arrow-box-shadow: 0 1px 3px rgba(0,0,0,0.5); // dreaming bugzilla #689995
+}
+
+// container of the popover menu
+.popup-menu {
+ min-width: 15em;
+ color: $fg_color;
+
+ //.popup-status-menu-item { font-weight: normal; color: pink; } //dunno what that is
+ &.panel-menu {
+ -boxpointer-gap: $base_margin; // distance from the panel
+ margin-bottom: 1.75em;
+ }
+}
+
+.popup-menu-content {
+ padding: $base_padding * 2 + $base_margin 0;
+}
+
+// menu items
+.popup-menu-item {
+ spacing: $base_padding;
+ padding: $base_padding;
+
+ &:ltr { padding-right:1.75em; padding-left: 0; }
+ &:rtl { padding-right: 0; padding-left:1.75em; }
+
+ &:checked {
+ background-color: lighten($bg_color, 2%);
+ box-shadow: none;
+ }
+
+ &.selected {
+ background-color: transparentize(white, if($variant=='light', 0.2, 0.9));
+ color: $fg_color;
+ }
+
+ &:active {
+ background-color: $selected_bg_color;
+ color: $selected_fg_color;
+ }
+
+ &:insensitive { color: transparentize($fg_color,0.5);}
+}
+
+// all icons and other graphical elements
+.popup-inactive-menu-item {
+ color: $fg_color;
+
+ &:insensitive { color: transparentize($fg_color,0.5); }
+}
+
+// symbolic icons in popover
+.popup-menu-arrow,
+.popup-menu-icon { icon-size: $base_icon_size; }
+
+// popover submenus
+.popup-sub-menu {
+ background-color: darken($bg_color, 3%);
+ box-shadow: none;
+ border-top: 1px solid transparentize($borders_color, 0.2);
+ border-bottom: 1px solid transparentize($borders_color, 0.2);
+}
+
+// container for radio and check boxes
+.popup-menu-ornament {
+ width: 1.2em;
+
+ &:ltr { text-align: right };
+ &:rtl { text-align: left };
+}
+
+// separator
+.popup-separator-menu-item {
+ padding: 0;
+
+ .popup-separator-menu-item-separator {
+ //-margin-horizontal: 24px;
+ height: 1px; //not really the whole box
+ margin: 6px 64px;
+ background-color: lighten($borders_color, 2%);
+ .popup-sub-menu & { //submenu separators
+ margin: 0 64px 0 32px;
+ @if $variant == 'dark' {
+ background-color: lighten($bg_color,10%);
+ }
+ }
+ }
+}
+
+// desktop background menu
+.background-menu {
+ -boxpointer-gap: $base_margin;
+ -arrow-rise: 0px; // hide the beak on the menu
+}
+
+// system status menu
+.aggregate-menu {
+ min-width: 21em;
+
+ // lock screen, shutdown, etc. buttons
+ .popup-menu-icon {
+ padding:0;
+ margin: 0 $base_margin;
+ -st-icon-style: symbolic;
+ }
+
+ .popup-sub-menu .popup-menu-item > :first-child {
+ // account for icons in submenus with padding
+ &:ltr {
+ padding-left: $base_padding + $base_margin * 2;
+ margin-left: $base_icon_size;
+ }
+ &:rtl {
+ padding-right: $base_padding + $base_margin * 2; ;
+ margin-right: $base_icon_size;
+ }
+ }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_screen-shield.scss b/data/theme/gnome-shell-sass/widgets/_screen-shield.scss
new file mode 100644
index 0000000..00c549a
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_screen-shield.scss
@@ -0,0 +1,78 @@
+/* Screen Shield */
+
+.unlock-dialog-clock {
+ color: white;
+ font-weight: 300;
+ text-align: center;
+ spacing: 24px;
+ padding-bottom: 2.5em;
+}
+
+.unlock-dialog-clock-time {
+ font-size: 64pt;
+ padding-top: 42px;
+ font-feature-settings: "tnum";
+}
+
+.unlock-dialog-clock-date {
+ font-size: 16pt;
+ font-weight: normal;
+}
+
+.unlock-dialog-clock-hint {
+ font-weight: normal;
+ padding-top: 48px;
+}
+
+.unlock-dialog-notifications-container {
+ margin: 12px 0;
+ spacing: 6px;
+ width: 23em;
+ background-color: transparent;
+ .summary-notification-stack-scrollview {
+ padding-top: 0;
+ padding-bottom: 0;
+ }
+
+ .notification,
+ .unlock-dialog-notification-source {
+ padding: 12px 6px;
+ border: none;
+ background-color: transparentize($osd_bg_color,0.7);
+ color: $osd_fg_color;
+ border-radius: $modal_radius;
+
+ &.critical { background-color: transparentize($osd_bg_color,0.1) }
+ }
+}
+
+.unlock-dialog-notification-label {
+ padding: 0px 0px 0px 12px;
+}
+
+.unlock-dialog-notification-count-text {
+ weight: bold;
+ padding: 0 6px;
+ color: $osd_bg_color;
+ background-color: transparentize($osd_fg_color, 0.7);
+ border-radius: 99px;
+ margin-right: 12px;
+
+}
+
+.screen-shield-background { //just the shadow, really
+ background: black;
+ box-shadow: 0px 2px 4px rgba(0,0,0,0.6);
+}
+
+#lockDialogGroup {
+ background-color: lighten(#2e3436, 8%);
+}
+
+#unlockDialogNotifications {
+ StButton#vhandle, StButton#hhandle {
+ background-color: transparentize($bg_color,0.7);
+ &:hover, &:focus { background-color: transparentize($bg_color,0.5); }
+ &:active { background-color: transparentize($selected_bg_color,0.5); }
+ }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_scrollbars.scss b/data/theme/gnome-shell-sass/widgets/_scrollbars.scss
new file mode 100644
index 0000000..5d50994
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_scrollbars.scss
@@ -0,0 +1,29 @@
+/* Scrollbars */
+
+StScrollView {
+ &.vfade { -st-vfade-offset: 68px; }
+ &.hfade { -st-hfade-offset: 68px; }
+}
+
+StScrollBar {
+ padding: 0;
+
+ StScrollView & {
+ min-width: 14px;
+ min-height: 14px;
+ }
+
+ StBin#trough {
+ border-radius: 0;
+ background-color: transparent;
+ }
+
+ StButton#vhandle, StButton#hhandle {
+ border-radius: 8px;
+ background-color: mix($fg_color, $bg_color, 60%);
+ //border: 3px solid transparent; //would be nice to margin or at least to transparent
+ margin: 3px;
+ &:hover { background-color: mix($fg_color, $bg_color, 80%); }
+ &:active { background-color: $selected_bg_color; }
+ }
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_search-entry.scss b/data/theme/gnome-shell-sass/widgets/_search-entry.scss
new file mode 100644
index 0000000..329dbc7
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_search-entry.scss
@@ -0,0 +1,35 @@
+// Search entry
+
+$search_entry_width: 320px;
+$search_entry_height: 36px;
+
+%search_entry,
+.search-entry {
+ width: $search_entry_width;
+ padding: $base_padding+1 $base_padding+3;
+ border-radius: $search_entry_height * 0.5; // half the height
+ color: transparentize($fg_color,0.3);
+ background-color: $bg_color;
+ border-color: $borders_color;
+
+ &:hover {
+ background-color: $hover_bg_color;
+ border-color: $hover_borders_color;
+ color: $hover_fg_color;
+ }
+
+ &:focus {
+ padding: $base_padding $base_padding+2; // 1px less to account for wider border
+ border-width: 2px;
+ border-style: solid;
+ border-color: $selected_bg_color;
+ color: $fg_color;
+ box-shadow: inset 0 1px 2px 1px rgba(0,0,0,0.2);
+ }
+
+ .search-entry-icon {
+ icon-size: $base_icon_size;
+ padding: 0 4px;
+ color: inherit;
+ }
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_search-results.scss b/data/theme/gnome-shell-sass/widgets/_search-results.scss
new file mode 100644
index 0000000..0d81c97
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_search-results.scss
@@ -0,0 +1,108 @@
+/* Search */
+
+// search overview container
+#searchResultsContent {
+ max-width: 1024px;
+ spacing: $base_margin * 2;
+}
+
+// search results sections "the boxes"
+.search-section {
+ // This should be equal to #searchResultsContent spacing
+ spacing: $base_margin * 2;
+
+ // separator
+ .search-section-separator {
+ // height: 1px;
+ // background-color: $osd_outer_borders_color;
+ height: 0;
+ background-color: transparent;
+ }
+}
+
+// content
+.search-section-content {
+ background-color: transparentize(lighten($osd_bg_color, 5%), 0.2);
+ border-radius: $modal_radius+3;
+ border: 1px solid $osd_outer_borders_color;
+ box-shadow: 0 2px 4px 0 $shadow_color;
+ text-shadow: 0 1px if($variant == 'light', rgba(255,255,255,0.2), rgba(0,0,0,0.2));
+ color: $osd_fg_color;
+ padding: $base_padding * 3;
+ // This is the space between the provider icon and the results container
+ spacing: $base_margin * 2;
+}
+
+%search-section-content-item {
+ @extend %icon_tile;
+
+ &:focus,
+ &:hover,
+ &:selected {
+ background-color: transparentize($osd_fg_color, .9);
+ transition-duration: 200ms;
+ }
+
+ &:active,
+ &:checked {
+ background-color: transparentize(darken($osd_bg_color, 10%), .1);
+ }
+}
+
+// "no results" text
+.search-statustext {
+ @extend %status_text;
+}
+
+.grid-search-results {
+ spacing: $base_spacing * 6;
+}
+
+// Search results with icons
+.grid-search-result {
+ @extend %app-well-app;
+}
+
+// search result provider
+.search-provider-icon {
+ @extend %search-section-content-item;
+
+ // content
+ .list-search-provider-content {
+ spacing: $base_spacing * 2;
+
+ // provider labels
+ .list-search-provider-details {
+ width: 120px;
+ margin-top: 0;
+ color: darken($osd_fg_color, 8%);
+ // font-weight: bold;
+ }
+ }
+}
+
+// search results list
+.list-search-results {
+ spacing: $base_spacing;
+}
+
+// search result listitem
+.list-search-result {
+ @extend %search-section-content-item;
+
+ // content
+ .list-search-result-content {
+ spacing: $base_padding;
+ }
+
+ // list item title (with leading icon)
+ .list-search-result-title {
+ spacing: $base_spacing * 2;
+ // font-weight: bold;
+ }
+
+ // list item description
+ .list-search-result-description {
+ color: darken($osd_fg_color, 30%);
+ }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_slider.scss b/data/theme/gnome-shell-sass/widgets/_slider.scss
new file mode 100644
index 0000000..f21d62e
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_slider.scss
@@ -0,0 +1,27 @@
+/* Slider */
+
+$slider_size: 15px;
+
+.slider {
+ height: $slider_size;
+ // slider trough
+ -barlevel-height: 3px; // has to be an odd number
+ -barlevel-background-color: $borders_color; //background of the trough
+ -barlevel-border-width: 1px;
+ -barlevel-border-color: $borders_color; // trough border color
+ // fill style
+ -barlevel-active-background-color: $selected_bg_color; //active trough fill
+ -barlevel-active-border-color: if($variant == 'light', darken($selected_bg_color, 4%), lighten($selected_bg_color, 2%)); //active trough border
+ // overfill style (red in this case)
+ -barlevel-overdrive-color: $destructive_color;
+ -barlevel-overdrive-border-color: if($variant == 'light', darken($destructive_color, 4%), lighten($destructive_color, 2%)); //trough border when red;
+ -barlevel-overdrive-separator-width:1px;
+ // slider handler
+ -slider-handle-radius: $slider_size * 0.5; // half the size of the size
+ -slider-handle-border-width: 1px;
+ -slider-handle-border-color: if($variant == 'light', $borders_color, $fg_color);
+
+ color: if($variant == 'light', lighten($bg_color, 10%), $fg_color);
+ &:hover { color: $hover_bg_color; }
+ &:active { color: $active_bg_color; }
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_switcher-popup.scss b/data/theme/gnome-shell-sass/widgets/_switcher-popup.scss
new file mode 100644
index 0000000..32cbbe5
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_switcher-popup.scss
@@ -0,0 +1,65 @@
+/* App Switcher */
+
+.switcher-popup {
+ padding: 8px;
+ spacing: $base_spacing * 4;
+}
+
+// switcher onscreen panel
+.switcher-list {
+ @extend %osd_panel;
+
+ .item-box {
+ padding: 8px;
+ border-radius: $base_border_radius + 1px;
+ border: 1px solid transparent;
+
+ &:outlined {
+ background-color: transparentize($osd_fg_color, 0.7);
+ }
+
+ &:selected {
+ background-color: transparentize($osd_fg_color, 0.7);
+ color: $osd_fg_color;
+ }
+ }
+
+ // window thumbnails
+ .thumbnail-box {
+ padding: 2px;
+ spacing: $base_spacing;
+ }
+
+ .thumbnail {
+ width: 256px;
+ }
+
+ .separator {
+ width: 1px;
+ background: $borders_color;
+ }
+
+ .switcher-list-item-container {
+ spacing: $base_spacing * 2;
+ }
+}
+
+.switcher-arrow {
+ border-color: rgba(0,0,0,0);
+ color: transparentize($fg_color,0.2);
+ &:highlighted {
+ color: $fg_color;
+ }
+}
+
+// Input Source Switcher
+.input-source-switcher-symbol {
+ font-size: 34pt;
+ width: 96px;
+ height: 96px;
+}
+
+// Window cycler highlight
+.cycler-highlight {
+ border: 5px solid $selected_bg_color;
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_switches.scss b/data/theme/gnome-shell-sass/widgets/_switches.scss
new file mode 100644
index 0000000..fd7472e
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_switches.scss
@@ -0,0 +1,16 @@
+/* Switches */
+
+// these are equal to the size of the SVG assets
+$switch_height: 22px;
+$switch_width: 46px;
+
+.toggle-switch {
+ color: $fg_color;
+ height: $switch_height;
+ width: $switch_width;
+ background-size: contain;
+ background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-off.svg"),url("resource:///org/gnome/shell/theme/toggle-off-dark.svg"));
+ &:checked {
+ background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-on.svg"),url("resource:///org/gnome/shell/theme/toggle-on-dark.svg"));
+ }
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_tiled-previews.scss b/data/theme/gnome-shell-sass/widgets/_tiled-previews.scss
new file mode 100644
index 0000000..a9d000f
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_tiled-previews.scss
@@ -0,0 +1,19 @@
+
+/* Tiled window previews */
+$tile_corner_radius: $base_border_radius + 1px;
+.tile-preview {
+ background-color: transparentize($selected_bg_color,0.5);
+ border: 1px solid $selected_bg_color;
+}
+
+.tile-preview-left.on-primary {
+ border-radius: $tile_corner_radius 0 0 0;
+}
+
+.tile-preview-right.on-primary {
+ border-radius: 0 $tile_corner_radius 0 0;
+}
+
+.tile-preview-left.tile-preview-right.on-primary {
+ border-radius: $tile_corner_radius $tile_corner_radius 0 0;
+} \ No newline at end of file
diff --git a/data/theme/gnome-shell-sass/widgets/_window-picker.scss b/data/theme/gnome-shell-sass/widgets/_window-picker.scss
new file mode 100644
index 0000000..1b93218
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_window-picker.scss
@@ -0,0 +1,65 @@
+/* Window Picker */
+
+$window_picker_spacing: $base_spacing; // 6px
+$window_picker_padding: $base_padding * 2; // 12px
+
+$window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
+
+$window_close_button_size: 24px;
+$window_close_button_padding: 3px;
+
+$window_clone_border_size: 6px;
+
+// Window picker
+.window-picker {
+ // Space between window thumbnails
+ spacing: $window_picker_spacing;
+
+ // Padding for container around window thumbnails
+ padding: $window_picker_padding;
+
+ &.external-monitor { padding: $window_picker_padding; }
+}
+
+// Borders on window thumbnails
+.window-clone-border {
+ border-width: $window_clone_border_size;
+ border-style: solid;
+ border-color: $window_thumbnail_border_color;
+ border-radius: $base_border_radius + 2;
+ // For window decorations with round corners we can't match
+ // the exact shape when the window is scaled. So apply a shadow
+ // to fix that case
+ box-shadow: inset 0 0 0 1px transparentize($borders_color, 0.8);
+}
+
+// Window titles
+.window-caption {
+ color: $osd_fg_color;
+ background-color: $osd_bg_color;
+ border:1px solid $osd_outer_borders_color;
+ border-radius: $base_border_radius + 1;
+ padding: $base_padding $base_padding * 2;
+ font-weight: bold;
+ @include fontsize($base_font_size + 1);
+}
+
+// Close button
+.window-close {
+ background-color: $selected_bg_color;
+ color: $selected_fg_color;
+ border: none;
+ border-radius: $window_close_button_size * 0.5 + $window_close_button_padding * 2;
+ padding: $window_close_button_padding;
+ height: $window_close_button_size;
+ width: $window_close_button_size;
+ box-shadow: -1px 1px 5px 0px rgba(0,0,0,0.5);
+
+ &:hover {
+ background-color: lighten($selected_bg_color, 5%);
+ }
+
+ &:active {
+ background-color: darken($selected_bg_color, 5%);
+ }
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_workspace-switcher.scss b/data/theme/gnome-shell-sass/widgets/_workspace-switcher.scss
new file mode 100644
index 0000000..5b15a30
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_workspace-switcher.scss
@@ -0,0 +1,36 @@
+/* Workspace Switcher */
+.workspace-switcher-group {
+ padding: $base_padding * 2;
+}
+
+.workspace-switcher-container {
+ @extend %osd_panel;
+}
+
+.workspace-switcher {
+ background: transparent;
+ border: none;
+ border-radius: 0;
+ padding: 0;
+ spacing: $base_spacing * 2;
+}
+
+.ws-switcher-box {
+ background: transparent;
+ height: 50px;
+ background-size: 32px;
+ border: 1px solid transparentize($osd_fg_color,0.9);
+ border-radius: $base_border_radius + 3px;
+}
+
+// active workspace in the switcher
+.ws-switcher-active-up,
+.ws-switcher-active-down,
+.ws-switcher-active-left,
+.ws-switcher-active-right {
+ height: 52px;
+ background-color: $selected_bg_color;
+ border: 1px solid if($variant=='light', darken($selected_bg_color, 8%), lighten($selected_bg_color, 5%));
+ border-radius: $base_border_radius + 3px;
+ color: $selected_fg_color;
+}
diff --git a/data/theme/gnome-shell-sass/widgets/_workspace-thumbnails.scss b/data/theme/gnome-shell-sass/widgets/_workspace-thumbnails.scss
new file mode 100644
index 0000000..da76381
--- /dev/null
+++ b/data/theme/gnome-shell-sass/widgets/_workspace-thumbnails.scss
@@ -0,0 +1,32 @@
+/* Workspace pager */
+
+// thumbnails in overview
+.workspace-thumbnails {
+ @extend %overview_panel;
+ visible-width: 32px; //amount visible before hover
+ spacing: $base_spacing;
+ padding: $base_padding;
+
+ border-radius: $modal_radius 0 0 $modal_radius;
+ border-right-width: 0;
+
+ &:rtl {
+ border-radius: 0 $modal_radius $modal_radius 0;
+ border-left-width: 0;
+ }
+
+ // drag and drop indicator
+ .placeholder {
+ background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
+ background-size: contain;
+ height: 24px;
+ }
+}
+
+// selected indicator
+.workspace-thumbnail-indicator {
+ border: 3px solid $selected_bg_color;
+ border-radius: 3px;
+ padding: 0px;
+ // background-color: transparentize($selected_bg_color, 0.9);
+}
diff --git a/data/theme/gnome-shell.scss b/data/theme/gnome-shell.scss
new file mode 100644
index 0000000..8ee4999
--- /dev/null
+++ b/data/theme/gnome-shell.scss
@@ -0,0 +1,6 @@
+$variant: 'dark';
+
+@import "gnome-shell-sass/_colors"; //use gtk colors
+@import "gnome-shell-sass/_drawing";
+@import "gnome-shell-sass/_common";
+@import "gnome-shell-sass/_widgets";
diff --git a/data/theme/keyboard-caps-lock-filled-symbolic.svg b/data/theme/keyboard-caps-lock-filled-symbolic.svg
new file mode 100644
index 0000000..45985b7
--- /dev/null
+++ b/data/theme/keyboard-caps-lock-filled-symbolic.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <g fill="#2e3436">
+ <path d="M6 8H2.937l5.126-5.781L13.186 8H10v2H6z" style="marker:none" color="#000" overflow="visible"/>
+ <path d="M6 11h4v2H6z" style="marker:none"/>
+ </g>
+</svg>
diff --git a/data/theme/keyboard-enter-symbolic.svg b/data/theme/keyboard-enter-symbolic.svg
new file mode 100644
index 0000000..de68b71
--- /dev/null
+++ b/data/theme/keyboard-enter-symbolic.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <g font-weight="400" fill="#2e3436">
+ <path d="M11.994 3v4.004c.002.666-.183.72-.445.852-.262.13-.555.144-.555.144H4v2h6.994s.71.014 1.45-.355c.738-.37 1.552-1.313 1.55-2.645V3z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1;marker:none" color="#000" font-family="sans-serif" overflow="visible"/>
+ <path d="M6 12v-1c0-.257-.13-.528-.313-.719l-1.28-1.303 1.28-1.26C5.87 7.529 6 7.258 6 7V6H5c-.31 0-.552.09-.75.281L1.594 8.978l2.656 2.74c.198.192.44.282.75.282z" style="line-height:normal;-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none" color="#bebebe" font-family="Bitstream Vera Sans" overflow="visible"/>
+ </g>
+</svg>
diff --git a/data/theme/keyboard-hide-symbolic.svg b/data/theme/keyboard-hide-symbolic.svg
new file mode 100644
index 0000000..4212707
--- /dev/null
+++ b/data/theme/keyboard-hide-symbolic.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <g color="#000" fill="#2e3436">
+ <path d="M4.707 5.293L3.293 6.707 8 11.414l4.707-4.707-1.414-1.414L8 8.586z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1;marker:none" font-weight="400" font-family="sans-serif" overflow="visible"/>
+ <path d="M12 6V5h1v1zM3 6V5h1v1z" style="marker:none" overflow="visible"/>
+ <path d="M3 6c0-.554.446-1 1-1s1 .446 1 1-.446 1-1 1-1-.446-1-1zM11 6c0-.554.446-1 1-1s1 .446 1 1-.446 1-1 1-1-.446-1-1z" style="marker:none" overflow="visible"/>
+ </g>
+</svg>
diff --git a/data/theme/keyboard-layout-filled-symbolic.svg b/data/theme/keyboard-layout-filled-symbolic.svg
new file mode 100644
index 0000000..7c9b955
--- /dev/null
+++ b/data/theme/keyboard-layout-filled-symbolic.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <g fill="#2e3436" fill-rule="evenodd">
+ <path d="M2 1v14h2V1z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" color="#000" font-weight="400" font-family="sans-serif" overflow="visible"/>
+ <path d="M3 1a1 1 0 00-1 1v6a1 1 0 001 1h3.383l.722 1.447A1 1 0 008 11h5a1 1 0 001-1V4a1 1 0 00-1-1H9.617l-.722-1.447A1 1 0 008 1zm1 2h3.383l.722 1.447A1 1 0 009 5h3v4H8.617l-.722-1.447A1 1 0 007 7H4z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" color="#000" font-weight="400" font-family="sans-serif" overflow="visible"/>
+ <path d="M3 8h4l1 2h5V4H9L8 2H3z"/>
+ </g>
+</svg>
diff --git a/data/theme/keyboard-shift-filled-symbolic.svg b/data/theme/keyboard-shift-filled-symbolic.svg
new file mode 100644
index 0000000..04069e8
--- /dev/null
+++ b/data/theme/keyboard-shift-filled-symbolic.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <path d="M6 13V9H2.937l5.126-5.781L13.186 9H10v4z" style="marker:none" color="#000" overflow="visible" fill="#2e3436"/>
+</svg>
diff --git a/data/theme/meson.build b/data/theme/meson.build
new file mode 100644
index 0000000..b0e0812
--- /dev/null
+++ b/data/theme/meson.build
@@ -0,0 +1,61 @@
+theme_sources = files([
+ 'gnome-shell-high-contrast.scss',
+ 'gnome-shell.scss',
+ 'gnome-shell-sass/_colors.scss',
+ 'gnome-shell-sass/_common.scss',
+ 'gnome-shell-sass/_drawing.scss',
+ 'gnome-shell-sass/_high-contrast-colors.scss',
+ 'gnome-shell-sass/_widgets.scss',
+ 'gnome-shell-sass/widgets/_a11y.scss',
+ 'gnome-shell-sass/widgets/_app-grid.scss',
+ 'gnome-shell-sass/widgets/_base.scss',
+ 'gnome-shell-sass/widgets/_buttons.scss',
+ 'gnome-shell-sass/widgets/_calendar.scss',
+ 'gnome-shell-sass/widgets/_check-box.scss',
+ 'gnome-shell-sass/widgets/_corner-ripple.scss',
+ 'gnome-shell-sass/widgets/_dash.scss',
+ 'gnome-shell-sass/widgets/_dialogs.scss',
+ 'gnome-shell-sass/widgets/_entries.scss',
+ 'gnome-shell-sass/widgets/_hotplug.scss',
+ 'gnome-shell-sass/widgets/_ibus-popup.scss',
+ 'gnome-shell-sass/widgets/_keyboard.scss',
+ 'gnome-shell-sass/widgets/_login-dialog.scss',
+ 'gnome-shell-sass/widgets/_looking-glass.scss',
+ 'gnome-shell-sass/widgets/_message-list.scss',
+ 'gnome-shell-sass/widgets/_misc.scss',
+ 'gnome-shell-sass/widgets/_network-dialog.scss',
+ 'gnome-shell-sass/widgets/_notifications.scss',
+ 'gnome-shell-sass/widgets/_osd.scss',
+ 'gnome-shell-sass/widgets/_overview.scss',
+ 'gnome-shell-sass/widgets/_panel.scss',
+ 'gnome-shell-sass/widgets/_popovers.scss',
+ 'gnome-shell-sass/widgets/_screen-shield.scss',
+ 'gnome-shell-sass/widgets/_scrollbars.scss',
+ 'gnome-shell-sass/widgets/_search-entry.scss',
+ 'gnome-shell-sass/widgets/_search-results.scss',
+ 'gnome-shell-sass/widgets/_slider.scss',
+ 'gnome-shell-sass/widgets/_switcher-popup.scss',
+ 'gnome-shell-sass/widgets/_switches.scss',
+ 'gnome-shell-sass/widgets/_tiled-previews.scss',
+ 'gnome-shell-sass/widgets/_window-picker.scss',
+ 'gnome-shell-sass/widgets/_workspace-switcher.scss',
+ 'gnome-shell-sass/widgets/_workspace-thumbnails.scss'
+])
+
+styles = [
+ 'gnome-shell-high-contrast',
+ 'gnome-shell'
+]
+
+theme_deps = []
+
+foreach style: styles
+ theme_deps += custom_target('style-' + style,
+ input: '@0@.scss'.format(style),
+ output: '@0@.css'.format(style),
+ command: [
+ sassc, '-a', '@INPUT@', '@OUTPUT@'
+ ],
+ depend_files: theme_sources)
+endforeach
+
diff --git a/data/theme/message-indicator-symbolic.svg b/data/theme/message-indicator-symbolic.svg
new file mode 100644
index 0000000..257a984
--- /dev/null
+++ b/data/theme/message-indicator-symbolic.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 4.2333333 4.2333333"
+ version="1.1"
+ id="svg8">
+ <defs
+ id="defs2" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ style="display:inline"
+ transform="translate(0,-292.76667)">
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.17969394"
+ d="m 3.1749998,294.88333 a 1.0583333,1.0583333 0 0 1 -1.0583332,1.05833 1.0583333,1.0583333 0 0 1 -1.0583333,-1.05833 1.0583333,1.0583333 0 0 1 1.0583333,-1.05833 1.0583333,1.0583333 0 0 1 1.0583332,1.05833 z"
+ id="path4485" />
+ </g>
+</svg>
diff --git a/data/theme/no-events.svg b/data/theme/no-events.svg
new file mode 100644
index 0000000..8ab08a9
--- /dev/null
+++ b/data/theme/no-events.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3471"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="New document 5">
+ <defs
+ id="defs3473" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.5"
+ inkscape:cx="32"
+ inkscape:cy="32"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1461"
+ inkscape:window-height="772"
+ inkscape:window-x="37"
+ inkscape:window-y="64"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3476">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ transform="matrix(4,0,0,4,1.9999997,2.3636364)"
+ id="g19145"
+ style="fill:#bebebe;fill-opacity:1;display:inline">
+ <g
+ id="g19147"
+ inkscape:label="status"
+ style="fill:#bebebe;fill-opacity:1;display:inline"
+ transform="translate(-541.0002,-301)" />
+ <g
+ style="fill:#bebebe;fill-opacity:1"
+ id="g19149"
+ inkscape:label="devices"
+ transform="translate(-541.0002,-301)" />
+ <g
+ style="fill:#bebebe;fill-opacity:1"
+ id="g19151"
+ inkscape:label="apps"
+ transform="translate(-541.0002,-301)" />
+ <g
+ style="fill:#bebebe;fill-opacity:1"
+ id="g19153"
+ inkscape:label="places"
+ transform="translate(-541.0002,-301)" />
+ <g
+ style="fill:#bebebe;fill-opacity:1"
+ id="g19155"
+ inkscape:label="mimetypes"
+ transform="translate(-541.0002,-301)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 543.0002,301 c -1.05237,0 -2,0.84508 -2,1.9375 l 0,11.125 c 0,1.09242 0.94763,1.9375 2,1.9375 l 11,0 c 1.05237,0 2,-0.84508 2,-1.9375 l 0,-11.125 c 0,-1.09242 -0.94763,-1.9375 -2,-1.9375 l -11,0 z m 0,5 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z m -8,3 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z m -8,3 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z"
+ id="path19157"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans" />
+ <rect
+ height="1.9999993"
+ id="rect19159"
+ style="opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ width="2.9999993"
+ x="551.00018"
+ y="309" />
+ </g>
+ <g
+ id="g19161"
+ inkscape:label="emblems"
+ style="fill:#bebebe;fill-opacity:1;display:inline"
+ transform="translate(-541.0002,-301)" />
+ <g
+ id="g19163"
+ inkscape:label="emotes"
+ style="fill:#bebebe;fill-opacity:1;display:inline"
+ transform="translate(-541.0002,-301)" />
+ <g
+ id="g19165"
+ inkscape:label="categories"
+ style="fill:#bebebe;fill-opacity:1;display:inline"
+ transform="translate(-541.0002,-301)" />
+ <g
+ id="g19167"
+ inkscape:label="actions"
+ style="fill:#bebebe;fill-opacity:1;display:inline"
+ transform="translate(-541.0002,-301)" />
+ </g>
+ </g>
+</svg>
diff --git a/data/theme/no-notifications.svg b/data/theme/no-notifications.svg
new file mode 100644
index 0000000..862e2d1
--- /dev/null
+++ b/data/theme/no-notifications.svg
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3393"
+ version="1.1"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="no-notifications.svg">
+ <defs
+ id="defs3395">
+ <clipPath
+ id="clipPath6262-0"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none"
+ id="rect6264-6"
+ width="3.8250003"
+ height="6.3750005"
+ x="26.849981"
+ y="220.75" />
+ </clipPath>
+ <clipPath
+ id="clipPath6258-0"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none"
+ id="rect6260-6"
+ width="2.8977275"
+ height="5.3129687"
+ x="26.965673"
+ y="221.28162" />
+ </clipPath>
+ <clipPath
+ id="clipPath6254-6"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none"
+ id="rect6256-6"
+ width="1.876245"
+ height="4.8783236"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <clipPath
+ id="clipPath8028-3"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -73,-30 -7,-7 v -4.5 h 16.5 v 4.5 l -7.5,7 z"
+ id="path8030-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6810-7-87-7">
+ <rect
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
+ id="rect6812-2-4-5"
+ width="14"
+ height="11"
+ x="21"
+ y="281" />
+ </clipPath>
+ <clipPath
+ id="clipPath6262"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none"
+ id="rect6264"
+ width="3.8250003"
+ height="6.3750005"
+ x="26.849981"
+ y="220.75" />
+ </clipPath>
+ <clipPath
+ id="clipPath6258"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none"
+ id="rect6260"
+ width="2.8977275"
+ height="5.3129687"
+ x="26.965673"
+ y="221.28162" />
+ </clipPath>
+ <clipPath
+ id="clipPath6254"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none"
+ id="rect6256"
+ width="1.876245"
+ height="4.8783236"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect3951"
+ is_visible="true" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="125.08157"
+ inkscape:cy="-13.805087"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1664"
+ inkscape:window-height="1034"
+ inkscape:window-x="1479"
+ inkscape:window-y="252"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3398">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ transform="matrix(4,0,0,4,-79.702662,-0.35415646)"
+ id="g19245">
+ <g
+ id="g19247"
+ inkscape:label="status"
+ style="display:inline"
+ transform="translate(-323.02908,-649.02581)" />
+ <g
+ id="g19249"
+ inkscape:label="devices"
+ transform="translate(-323.02908,-649.02581)" />
+ <g
+ id="g19251"
+ inkscape:label="apps"
+ transform="translate(-323.02908,-649.02581)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 331.9377,653 c 0.0187,0.16677 0.0625,0.32822 0.0625,0.5 0,2.48528 -2.01472,4.5 -4.5,4.5 -0.11769,0 -0.22834,-0.0224 -0.34375,-0.0312 v 2.21875 c 0,1.00412 0.80838,1.8125 1.8125,1.8125 l 1.54511,-5e-5 2,2.04688 2.0625,-2.04688 h 1.61114 c 1.00413,0 1.8125,-0.80838 1.8125,-1.8125 v -5.375 c 0,-1.00412 -0.80837,-1.8125 -1.8125,-1.8125 z"
+ id="path19253"
+ sodipodi:nodetypes="csscsscccssssc"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#c3c3c3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 327.5002,650 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.53125,1 h 1.03125 l -0.0625,1.375 a 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.125,0.125 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 l 1.15625,-0.75 0.5,0.90625 -1.21875,0.625 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0.0937 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0625 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0312 l 1.25,0.625 -0.53125,0.90625 -1.15625,-0.781 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,0 0.19951718,0.19951718 0 0 0 -0.125,0.0937 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0,0.0625 L 328.0002,656 h -1.03125 l 0.0937,-1.375 a 0.19951718,0.19951718 0 0 0 -0.0312,-0.0937 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0937,0.0312 l -1.1875,0.78125 -0.5,-0.90625 1.25,-0.625 a 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0312,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 l -1.25,-0.625 0.5,-0.90625 1.1875,0.75 a 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 z"
+ id="path19255"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate" />
+ </g>
+ <g
+ id="g19257"
+ inkscape:label="places"
+ transform="translate(-323.02908,-649.02581)" />
+ <g
+ id="g19259"
+ inkscape:label="mimetypes"
+ transform="translate(-323.02908,-649.02581)" />
+ <g
+ id="g19261"
+ inkscape:label="emblems"
+ style="display:inline"
+ transform="translate(-323.02908,-649.02581)" />
+ <g
+ id="g19263"
+ inkscape:label="emotes"
+ style="display:inline"
+ transform="translate(-323.02908,-649.02581)" />
+ <g
+ id="g19265"
+ inkscape:label="categories"
+ style="display:inline"
+ transform="translate(-323.02908,-649.02581)" />
+ <g
+ id="g19267"
+ inkscape:label="actions"
+ style="display:inline"
+ transform="translate(-323.02908,-649.02581)" />
+ </g>
+ <g
+ style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
+ inkscape:label="preferences-system-notifications"
+ id="g13967"
+ transform="matrix(4,0,0,4,-1044.0008,-2172)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 268.94244,544.94838 c -2.20914,0 -3.33013,1.5 -4,4 l -1,5 c -0.10831,0.54156 -0.44772,1 -1,1 v 1 h 12 v -1 c -0.55229,0 -0.89169,-0.45844 -1,-1 l -1,-5 c -0.53033,-2.5 -1.79086,-4 -4,-4 z"
+ id="path40220"
+ sodipodi:nodetypes="ccsccccscc"
+ style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 269.11822,556.94838 a 1.5,1.5 0 0 0 1.41211,1 1.5,1.5 0 0 0 1.41211,-1 z"
+ id="path40774"
+ style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal" />
+ </g>
+ </g>
+</svg>
diff --git a/data/theme/pad-osd.css b/data/theme/pad-osd.css
new file mode 100644
index 0000000..31c2377
--- /dev/null
+++ b/data/theme/pad-osd.css
@@ -0,0 +1,30 @@
+.Leader {
+ stroke-width: .5 !important;
+ stroke: #535353;
+ fill: none !important;
+}
+
+.Button {
+ stroke-width: .25;
+ stroke: #ededed;
+ fill: #ededed;
+}
+
+.Ring {
+ stroke-width: .5 !important;
+ stroke: #535353 !important;
+ fill: none !important;
+}
+
+.Label {
+ stroke: none !important;
+ stroke-width: .1 !important;
+ font-size: .1 !important;
+ fill: transparent !important;
+}
+
+.TouchStrip, .TouchRing {
+ stroke-width: .1 !important;
+ stroke: #ededed !important;
+ fill: #535353 !important;
+}
diff --git a/data/theme/pointer-double-click-symbolic.svg b/data/theme/pointer-double-click-symbolic.svg
new file mode 100644
index 0000000..5267834
--- /dev/null
+++ b/data/theme/pointer-double-click-symbolic.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="20"
+ id="svg2">
+ <g
+ id="layer1"
+ style="display:inline">
+ <g
+ id="id1"
+ transform="translate(-19,-0.75)">
+ <path
+ style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ d="m 19.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.38151 2.829427,-2.763021 4.24414,-4.144531 0.5882,1.18866 1.158389,2.386561 1.758464,3.569127 1.108631,1.640259 4.157538,0.465128 3.89799,-1.495859 0.01057,-0.470226 -0.405577,-0.908445 -0.434651,-1.313638 0.259401,-0.25321 0.518802,-0.50642 0.778203,-0.75963 0.5882,1.18866 1.158389,2.386561 1.758464,3.569127 1.108631,1.640259 4.157538,0.465128 3.89799,-1.495859 -0.192325,-0.904303 -0.717854,-1.698026 -1.068629,-2.548967 -0.238908,-0.512658 -0.477817,-1.025315 -0.716725,-1.537973 1.755859,0 3.511719,0 5.267578,0 C 34.777352,9.738932 30.31641,5.0970051 25.855469,0.45507812 c 0,2.08138018 0,4.16276048 0,6.24414068 -2,-2.0813802 -4,-4.1627605 -6,-6.24414068 z m 1.5,3.72656248 c 2,2.0813801 4,4.1627603 6,6.2441404 0,-2.0813801 0,-4.1627603 0,-6.2441404 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.366537,0 -2.733073,0 -4.09961,0 0.883468,1.903435 1.781983,3.800273 2.656081,5.707817 0.0065,0.622781 -1.227555,0.980575 -1.325116,0.207118 -0.80433,-1.640251 -1.608661,-3.280501 -2.412991,-4.920752 -1.020182,0.995443 -2.040365,1.990885 -3.060547,2.986328 0.263642,0.608048 0.596803,1.192457 0.814693,1.816134 -0.182662,0.601037 -1.26833,0.8373 -1.365856,0.06795 -0.796094,-1.623456 -1.592189,-3.246912 -2.388284,-4.870368 -1.059245,1.033854 -2.118489,2.067708 -3.177734,3.101562 -4e-6,-4.265002 -7e-6,-8.5300036 -1.1e-5,-12.7950054 z"
+ id="path5565" />
+ </g>
+ <g
+ id="id2"
+ transform="translate(-25,-0.75)" />
+ </g>
+</svg>
diff --git a/data/theme/pointer-drag-symbolic.svg b/data/theme/pointer-drag-symbolic.svg
new file mode 100644
index 0000000..be37e6f
--- /dev/null
+++ b/data/theme/pointer-drag-symbolic.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="20"
+ id="svg2">
+ <g
+ id="g835">
+ <path
+ style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ d="M 10.705078 1.671875 C 9.8685536 1.7465699 8.886927 1.5353073 8.2578125 2.2480469 C 8.0785627 2.7511513 7.8667422 2.9777446 7.3125 2.8652344 C 6.5186841 2.8141575 5.6105879 2.9190179 5.125 3.6386719 C 4.5700923 4.4696324 4.8113194 5.4949043 4.7578125 6.4316406 L 4.7578125 7.9335938 C 4.2480917 7.6156216 3.6258927 7.8015358 3.0585938 7.7519531 C 2.6157606 7.7312277 2.1774807 7.7771069 1.7402344 7.84375 C 1.7971654 10.529678 1.813967 13.217089 1.8613281 15.902344 C 1.9550191 17.204635 3.0933719 18.307155 4.40625 18.326172 C 5.0391993 18.341272 5.8885801 18.332951 6.6308594 18.337891 C 9.8526764 18.325821 13.076973 18.38774 16.296875 18.28125 C 17.459088 18.161027 18.510143 17.092798 18.367188 15.884766 L 18.367188 6.4042969 C 17.660379 5.4636119 16.551912 4.623434 15.308594 4.8339844 C 15.009045 4.3804158 14.822476 3.3608651 14.082031 3.0351562 C 13.727176 2.744118 13.242443 2.9253873 12.822266 2.8730469 C 12.524824 2.8003648 11.966366 3.0655864 11.953125 2.6210938 C 11.795774 2.0995736 11.23789 1.7125276 10.705078 1.671875 z M 10.599609 3.1757812 C 10.764131 3.4472414 10.782382 3.9294982 10.818359 4.3007812 C 10.824915 4.3076775 10.838155 4.3066925 10.845703 4.3125 C 10.836598 4.3123268 10.827465 4.3126732 10.818359 4.3125 L 11.3125 10.212891 L 11.976562 4.3710938 L 13.322266 4.375 C 13.858345 4.7645492 13.735252 5.5154752 13.876953 6.0976562 C 13.865826 6.1651282 13.88335 6.1937019 13.892578 6.234375 C 13.891928 6.2343667 13.891276 6.2343833 13.890625 6.234375 L 13.902344 6.3203125 L 14.384766 10.185547 L 15.048828 6.265625 C 15.622863 6.228498 16.206517 6.3041365 16.607422 6.7675781 C 17.017062 6.9844433 16.823063 7.4565491 16.867188 7.8261719 L 16.867188 16.167969 C 16.530129 17.131654 15.267211 16.71624 14.492188 16.828125 C 11.121671 16.841205 7.7500508 16.861953 4.3808594 16.814453 C 3.4051926 16.786173 3.2389196 15.744474 3.3398438 14.972656 C 3.3282027 13.065594 3.2950998 11.158732 3.2617188 9.2519531 C 3.5880829 9.2584131 3.9376766 9.2391948 4.25 9.2617188 C 4.7438842 10.17694 4.7346154 11.262903 4.7578125 12.277344 C 5.2504494 12.270544 5.8011939 12.317174 6.2578125 12.277344 C 6.2669593 9.7577406 6.2393741 7.2373172 6.2714844 4.71875 C 6.3763823 4.198849 7.0022289 4.409587 7.3828125 4.3652344 L 8.0585938 4.3652344 L 8.546875 10.212891 L 9.2167969 4.3359375 L 9.2128906 4.3359375 C 9.2438386 3.9531035 9.0622615 3.4401006 9.4609375 3.2167969 L 10.599609 3.1757812 z "
+ id="path5630" />
+ </g>
+</svg>
diff --git a/data/theme/pointer-primary-click-symbolic.svg b/data/theme/pointer-primary-click-symbolic.svg
new file mode 100644
index 0000000..f447991
--- /dev/null
+++ b/data/theme/pointer-primary-click-symbolic.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="20"
+ id="svg2"
+ version="1.1">
+ <g
+ id="layer1"
+ style="display:inline">
+ <g
+ id="id1"
+ transform="translate(-22.25,-0.75)">
+ <path
+ style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ d="m 25.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.380859 2.829427,-2.761719 4.24414,-4.142578 0.612408,1.215372 1.173049,2.460221 1.819709,3.656095 1.141947,1.476279 3.975266,0.389006 3.846009,-1.473608 -0.09413,-0.822519 -0.594755,-1.521423 -0.899969,-2.277599 -0.298869,-0.640171 -0.597739,-1.280342 -0.896608,-1.920513 1.75651,0 3.513021,0 5.269531,0 C 34.777344,9.738932 30.316406,5.0970051 25.855469,0.45507812 Z m 1.5,3.72656248 c 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.367188,0 -2.734375,0 -4.101563,0 0.885072,1.903196 1.781799,3.80152 2.659622,5.707744 0.0349,0.566084 -1.149057,0.988823 -1.282093,0.297971 -0.818567,-1.671162 -1.637133,-3.342323 -2.455699,-5.013485 -1.059896,1.034505 -2.119791,2.06901 -3.179687,3.103515 1.5e-5,-4.264988 3e-5,-8.5299756 4.5e-5,-12.7949634 z"
+ id="path5565" />
+ </g>
+ </g>
+</svg>
diff --git a/data/theme/pointer-secondary-click-symbolic.svg b/data/theme/pointer-secondary-click-symbolic.svg
new file mode 100644
index 0000000..b72e178
--- /dev/null
+++ b/data/theme/pointer-secondary-click-symbolic.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="20"
+ id="svg2">
+ <g
+ id="layer1"
+ style="display:inline;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1">
+ <g
+ transform="matrix(-1,0,0,1,42,-0.75)"
+ id="g5847"
+ style="stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1">
+ <path
+ style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ d="m 25.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.380859 2.829427,-2.761719 4.24414,-4.142578 0.612408,1.215372 1.173049,2.460221 1.819709,3.656095 1.141947,1.476279 3.975266,0.389006 3.846009,-1.473608 -0.09413,-0.822519 -0.594755,-1.521423 -0.899969,-2.277599 -0.298869,-0.640171 -0.597739,-1.280342 -0.896608,-1.920513 1.75651,0 3.513021,0 5.269531,0 C 34.777344,9.738932 30.316406,5.0970051 25.855469,0.45507812 Z m 1.5,3.72656248 c 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.367188,0 -2.734375,0 -4.101563,0 0.885072,1.903196 1.781799,3.80152 2.659622,5.707744 0.0349,0.566084 -1.149057,0.988823 -1.282093,0.297971 -0.818567,-1.671162 -1.637133,-3.342323 -2.455699,-5.013485 -1.059896,1.034505 -2.119791,2.06901 -3.179687,3.103515 1.5e-5,-4.264988 3e-5,-8.5299756 4.5e-5,-12.7949634 z"
+ id="path5851" />
+ </g>
+ </g>
+</svg>
diff --git a/data/theme/process-working.svg b/data/theme/process-working.svg
new file mode 100644
index 0000000..920a67d
--- /dev/null
+++ b/data/theme/process-working.svg
@@ -0,0 +1,3084 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg5369"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ width="512"
+ height="32"
+ sodipodi:docname="process-working.svg"
+ style="display:inline">
+ <metadata
+ id="metadata5375">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs5373">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient35326"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient8231-1-4-4-1">
+ <stop
+ id="stop8233-28-5-27-1"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop8235-7-3-94-3" />
+ <stop
+ id="stop8237-7-8-20-2"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop8239-2-9-1-9"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient35230"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient5767-6">
+ <stop
+ id="stop5769-0"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop5771-1" />
+ <stop
+ id="stop5773-7"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop5775-8"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10255"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10257">
+ <stop
+ id="stop10259"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop10261" />
+ <stop
+ id="stop10263"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop10265"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10269">
+ <stop
+ id="stop10271"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop10273" />
+ <stop
+ id="stop10275"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop10277"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10281">
+ <stop
+ id="stop10283"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop10285" />
+ <stop
+ id="stop10287"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop10289"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10291"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10293">
+ <stop
+ id="stop10295"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop10297" />
+ <stop
+ id="stop10299"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop10301"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10303"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10305">
+ <stop
+ id="stop10307"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop10309" />
+ <stop
+ id="stop10311"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop10313"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10315"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10317">
+ <stop
+ id="stop10319"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop10321" />
+ <stop
+ id="stop10323"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop10325"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10327"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10329">
+ <stop
+ id="stop10331"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop10333" />
+ <stop
+ id="stop10335"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop10337"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10341">
+ <stop
+ id="stop10343"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop10345" />
+ <stop
+ id="stop10347"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop10349"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10351"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10353">
+ <stop
+ id="stop10355"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop10357" />
+ <stop
+ id="stop10359"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop10361"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10363"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10365">
+ <stop
+ id="stop10367"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop10369" />
+ <stop
+ id="stop10371"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop10373"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10375"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10377">
+ <stop
+ id="stop10379"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop10381" />
+ <stop
+ id="stop10383"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop10385"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10387"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10389">
+ <stop
+ id="stop10391"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop10393" />
+ <stop
+ id="stop10395"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop10397"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10399"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10401">
+ <stop
+ id="stop10403"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop10405" />
+ <stop
+ id="stop10407"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop10409"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10411"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10413">
+ <stop
+ id="stop10415"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop10417" />
+ <stop
+ id="stop10419"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop10421"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10423"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10425">
+ <stop
+ id="stop10427"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15428571"
+ offset="0.31861392"
+ id="stop10429" />
+ <stop
+ id="stop10431"
+ offset="0.54270232"
+ style="stop-color:#ffffff;stop-opacity:0.33714285" />
+ <stop
+ id="stop10433"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10435"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <linearGradient
+ id="linearGradient10437">
+ <stop
+ id="stop10439"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0.31861392"
+ id="stop10441" />
+ <stop
+ id="stop10443"
+ offset="0.75051737"
+ style="stop-color:#ffffff;stop-opacity:0.42857143" />
+ <stop
+ id="stop10445"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient10709"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient10711"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient11663"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient11665"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14128"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14140"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14152"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14164"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14176"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14188"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14200"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14212"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14224"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14236"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14248"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14260"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14284"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14296"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14308"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14320"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14332"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14344"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14404"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14416"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14452"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14464"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14476"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14488"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14500"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14512"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14524"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14536"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14548"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14560"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14572"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14584"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14596"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14608"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14620"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14632"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14644"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14656"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14680"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14692"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14704"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14716"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14728"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14740"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14752"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14764"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14776"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14788"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14800"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14812"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14824"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14836"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14848"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14860"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14872"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14884"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14896"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14908"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14920"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14932"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14944"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14956"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14968"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient14980"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient14992"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15004"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15016"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15028"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15040"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15052"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15064"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15076"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15088"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15100"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15112"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15124"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15136"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15148"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15160"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15172"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15184"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15208"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15220"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15232"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15244"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15256"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15268"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15280"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15292"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15304"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15316"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15328"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15340"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15388"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15400"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15412"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15424"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15484"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15496"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15508"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient15520"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient15532"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8231-1-4-4-1"
+ id="radialGradient18026"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.229454,-1.2865389,1.2087442,2.0939897,-228.90301,-208.08725)"
+ cx="-0.067823187"
+ cy="188.51917"
+ fx="-0.067823187"
+ fy="188.51917"
+ r="27.330345" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5767-6"
+ id="radialGradient18028"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1252013,-0.60470548,0.56813832,1.0568583,-107.67128,-11.948108)"
+ cx="0.053942412"
+ cy="189.15244"
+ fx="0.053942412"
+ fy="189.15244"
+ r="27.330345" />
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#808080"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1975"
+ inkscape:window-height="1098"
+ id="namedview5371"
+ showgrid="false"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:zoom="1"
+ inkscape:cx="346.23664"
+ inkscape:cy="-6.4057938"
+ inkscape:window-x="139"
+ inkscape:window-y="73"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer2"
+ inkscape:snap-bbox="true"
+ inkscape:snap-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid11933"
+ empspacing="16"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ empcolor="#0000ff"
+ empopacity="0.47843137" />
+ </sodipodi:namedview>
+ <g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="tiles"
+ style="display:none"
+ transform="translate(0,-16)">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
+ id="rect12451"
+ width="24"
+ height="24"
+ x="0"
+ y="0" />
+ <rect
+ y="24"
+ x="0"
+ height="24"
+ width="24"
+ id="rect12453"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="0"
+ x="24"
+ height="24"
+ width="24"
+ id="rect12455"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
+ id="rect12457"
+ width="24"
+ height="24"
+ x="24"
+ y="24" />
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
+ id="rect12459"
+ width="24"
+ height="24"
+ x="48"
+ y="0" />
+ <rect
+ y="24"
+ x="48"
+ height="24"
+ width="24"
+ id="rect12461"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="0"
+ x="72"
+ height="24"
+ width="24"
+ id="rect12463"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
+ id="rect12465"
+ width="24"
+ height="24"
+ x="72"
+ y="24" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="spinner"
+ transform="translate(0,-16)">
+ <g
+ style="display:inline"
+ id="g12246"
+ transform="matrix(0.29521872,0,0,0.2952381,149.03971,-388.51498)">
+ <path
+ transform="matrix(-0.16397381,0.61157081,-0.61162275,-0.16377992,-372.32298,1442.5061)"
+ d="m -3.4436513,184.72075 a 22.98097,22.98097 0 0 1 -25.9046347,17.42496 22.98097,22.98097 0 0 1 -19.37345,-24.4816 22.98097,22.98097 0 0 1 22.91234,-21.20622"
+ sodipodi:ry="22.98097"
+ sodipodi:rx="22.98097"
+ sodipodi:cy="179.43886"
+ sodipodi:cx="-25.809397"
+ id="path12248"
+ style="display:inline;fill:none;stroke:url(#radialGradient11663);stroke-width:17.83196449;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc"
+ sodipodi:start="0.23191105"
+ sodipodi:end="4.712389"
+ sodipodi:open="true"
+ inkscape:export-filename="/home/hbons/Moblin/git/carrick-ng/data/icons/network-connecting.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/hbons/Moblin/git/carrick-ng/data/icons/network-connecting.png"
+ sodipodi:open="true"
+ sodipodi:end="4.712389"
+ sodipodi:start="0.23191105"
+ sodipodi:type="arc"
+ style="display:inline;fill:none;stroke:url(#radialGradient11665);stroke-width:17.83196449;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path12250"
+ sodipodi:cx="-25.809397"
+ sodipodi:cy="179.43886"
+ sodipodi:rx="22.98097"
+ sodipodi:ry="22.98097"
+ d="m -3.4436513,184.72075 a 22.98097,22.98097 0 0 1 -25.9046347,17.42496 22.98097,22.98097 0 0 1 -19.37345,-24.4816 22.98097,22.98097 0 0 1 22.91234,-21.20622"
+ transform="matrix(-0.63300818,0.01438356,-0.01458424,-0.63300359,-491.4014,1510.996)" />
+ </g>
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,48.943073,-180.55304)"
+ id="use12258"
+ xlink:href="#g10450-5"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.97814761,0.20791169,-0.20791169,0.97814761,70.553652,-185.80321)"
+ id="use12260"
+ xlink:href="#use12000"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.95105653,0.30901699,-0.30901699,0.95105653,146.76602,-177.21804)"
+ id="use12266"
+ xlink:href="#g10450-5"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.91354547,0.40673664,-0.40673664,0.91354547,169.60833,-183.68101)"
+ id="use12270"
+ xlink:href="#use12000"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.86602542,0.5,-0.5,0.86602542,194.48539,-193.2587)"
+ id="use12272"
+ xlink:href="#use12002"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.80901701,0.58778525,-0.58778525,0.80901701,289.93475,-156.19404)"
+ id="use12278"
+ xlink:href="#g10450-5"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.74314484,0.66913061,-0.66913061,0.74314484,315.02774,-163.93338)"
+ id="use12282"
+ xlink:href="#use12000"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.66913062,0.74314483,-0.74314483,0.66913062,343.01848,-174.00634)"
+ id="use12284"
+ xlink:href="#use12002"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.58778527,0.809017,-0.809017,0.58778527,374.34035,-185.86931)"
+ id="use12290"
+ xlink:href="#use12008"
+ y="0"
+ x="0" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12290"
+ id="use12494"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,31.624213,-28.945572)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12494"
+ id="use12498"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,31.778114,-31.872282)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12498"
+ id="use12502"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,31.931711,-34.799662)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12502"
+ id="use12506"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,32.085178,-37.729332)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12506"
+ id="use12510"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,32.238466,-40.661342)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12510"
+ id="use12514"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,32.390823,-43.585942)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12514"
+ id="use12518"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,32.543439,-46.510902)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12518"
+ id="use12522"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,32.696338,-49.437422)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12522"
+ id="use12526"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,32.849272,-52.363942)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12526"
+ id="use12530"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,33.002239,-55.290422)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12530"
+ id="use12534"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,33.155242,-58.216862)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12534"
+ id="use12538"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,33.308287,-61.143262)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12538"
+ id="use12542"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,33.461378,-64.069632)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12542"
+ id="use12546"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,33.614517,-66.995962)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12546"
+ id="use12550"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,33.767708,-69.922282)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12550"
+ id="use12554"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,33.920952,-72.848572)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12554"
+ id="use12558"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,34.074252,-75.774862)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12558"
+ id="use12562"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,34.228224,-78.701442)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12562"
+ id="use12566"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,34.384481,-81.628162)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12566"
+ id="use12570"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,34.543085,-84.555062)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12570"
+ id="use12574"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,34.694273,-87.482889)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12574"
+ id="use12578"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,34.845821,-90.410449)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12578"
+ id="use12582"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,34.998931,-93.337739)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12582"
+ id="use12586"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,35.152046,-96.264989)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12586"
+ id="use12590"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,35.305116,-99.192209)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12590"
+ id="use12594"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,35.458143,-102.11938)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12594"
+ id="use12598"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,35.611131,-105.04652)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12598"
+ id="use12602"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,35.764086,-107.97361)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12602"
+ id="use12606"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,35.917013,-110.90066)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12606"
+ id="use12610"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,36.069915,-113.82765)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12610"
+ id="use12614"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,36.2228,-116.75459)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12614"
+ id="use12618"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,36.375673,-119.68147)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12618"
+ id="use12622"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,36.52885,-122.60769)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12622"
+ id="use12626"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,36.682157,-125.53161)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12626"
+ id="use12630"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,36.835642,-128.45319)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12630"
+ id="use12634"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,36.990059,-131.38219)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12634"
+ id="use12638"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,37.144216,-134.31083)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12638"
+ id="use12642"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,37.298091,-137.2379)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12642"
+ id="use12646"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,37.45193,-140.16497)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12646"
+ id="use12650"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,37.605737,-143.09209)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12650"
+ id="use12654"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,37.759507,-146.01924)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12654"
+ id="use12658"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,37.913236,-148.94644)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12658"
+ id="use12662"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,38.066918,-151.87367)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12662"
+ id="use12666"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,38.220552,-154.80093)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12666"
+ id="use12670"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,38.374134,-157.72821)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12670"
+ id="use12674"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,38.527663,-160.65551)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12674"
+ id="use12678"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,38.681136,-163.58282)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12678"
+ id="use12682"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,38.833937,-166.50983)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12682"
+ id="use12686"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,38.984453,-169.4367)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use12686"
+ id="use12690"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,39.132623,-172.3634)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#g12246"
+ id="use17640"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,18.463174,-0.6860274)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17640"
+ id="use17642"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,18.545526,-2.3041175)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17642"
+ id="use17644"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,18.627869,-3.9222415)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17644"
+ id="use17646"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,18.710256,-5.5403957)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17646"
+ id="use17648"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,18.792682,-7.1585849)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17648"
+ id="use17650"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,18.875146,-8.776813)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17650"
+ id="use17652"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,18.957642,-10.395084)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17652"
+ id="use17654"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,19.040166,-12.0134)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17654"
+ id="use17656"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,19.122713,-13.631765)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17656"
+ id="use17658"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,19.205279,-15.250181)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17658"
+ id="use17660"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,19.287857,-16.868648)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17660"
+ id="use17662"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,19.370295,-18.487328)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17662"
+ id="use17664"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,19.452449,-20.10785)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17664"
+ id="use17666"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,19.534518,-21.730599)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17666"
+ id="use17668"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,19.616047,-23.351029)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#g12246"
+ id="use17670"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,288.32996,17.191525)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17640"
+ id="use17672"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,305.13809,1.2121247)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17642"
+ id="use17674"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,321.94624,-14.767309)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17644"
+ id="use17676"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,338.75439,-30.746723)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17646"
+ id="use17678"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,355.56257,-46.726112)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17648"
+ id="use17680"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,372.37079,-62.705487)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17650"
+ id="use17682"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,389.179,-78.684846)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17652"
+ id="use17684"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,405.98726,-94.664188)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17654"
+ id="use17686"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,422.79551,-110.64352)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17656"
+ id="use17688"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,439.60382,-126.62284)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17658"
+ id="use17690"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,456.41215,-142.60217)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17660"
+ id="use17692"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,473.22049,-158.58145)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17662"
+ id="use17694"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,490.02954,-174.56102)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17664"
+ id="use17696"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,506.83972,-190.54059)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17666"
+ id="use17698"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,523.65101,-206.52033)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#use17668"
+ id="use17700"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,540.45771,-222.50042)"
+ width="100%"
+ height="100%" />
+ <g
+ transform="matrix(-0.29521867,7.2137245e-5,-7.2124844e-5,-0.29523807,-132.95323,452.47763)"
+ id="g17702"
+ style="display:inline">
+ <path
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/hbons/Moblin/git/carrick-ng/data/icons/network-connecting.png"
+ sodipodi:open="true"
+ sodipodi:end="4.712389"
+ sodipodi:start="0.23191105"
+ sodipodi:type="arc"
+ style="display:inline;fill:none;stroke:url(#radialGradient18026);stroke-width:17.83196449;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path17704"
+ sodipodi:cx="-25.809397"
+ sodipodi:cy="179.43886"
+ sodipodi:rx="22.98097"
+ sodipodi:ry="22.98097"
+ d="m -3.4436513,184.72075 a 22.98097,22.98097 0 0 1 -25.9046347,17.42496 22.98097,22.98097 0 0 1 -19.37345,-24.4816 22.98097,22.98097 0 0 1 22.91234,-21.20622"
+ transform="matrix(-0.16397381,0.61157081,-0.61162275,-0.16377992,-372.32298,1442.5061)" />
+ <path
+ transform="matrix(-0.63300818,0.01438356,-0.01458424,-0.63300359,-491.4014,1510.996)"
+ d="m -3.4436513,184.72075 a 22.98097,22.98097 0 0 1 -25.9046347,17.42496 22.98097,22.98097 0 0 1 -19.37345,-24.4816 22.98097,22.98097 0 0 1 22.91234,-21.20622"
+ sodipodi:ry="22.98097"
+ sodipodi:rx="22.98097"
+ sodipodi:cy="179.43886"
+ sodipodi:cx="-25.809397"
+ id="path17706"
+ style="display:inline;fill:none;stroke:url(#radialGradient18028);stroke-width:17.83196449;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc"
+ sodipodi:start="0.23191105"
+ sodipodi:end="4.712389"
+ sodipodi:open="true"
+ inkscape:export-filename="/home/hbons/Moblin/git/carrick-ng/data/icons/network-connecting.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ </g>
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.081742,-0.6039496)"
+ id="use17708"
+ xlink:href="#g17702"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.164094,-2.2220396)"
+ id="use17710"
+ xlink:href="#use17708"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.246437,-3.8401636)"
+ id="use17712"
+ xlink:href="#use17710"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.328824,-5.4583176)"
+ id="use17714"
+ xlink:href="#use17712"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.41125,-7.0765066)"
+ id="use17716"
+ xlink:href="#use17714"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.493714,-8.6947346)"
+ id="use17718"
+ xlink:href="#use17716"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.57621,-10.313006)"
+ id="use17720"
+ xlink:href="#use17718"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.658734,-11.931322)"
+ id="use17722"
+ xlink:href="#use17720"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.741281,-13.549687)"
+ id="use17724"
+ xlink:href="#use17722"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.823847,-15.168103)"
+ id="use17726"
+ xlink:href="#use17724"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.906425,-16.78657)"
+ id="use17728"
+ xlink:href="#use17726"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,20.988863,-18.40525)"
+ id="use17730"
+ xlink:href="#use17728"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,21.071017,-20.025772)"
+ id="use17732"
+ xlink:href="#use17730"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,21.153086,-21.648521)"
+ id="use17734"
+ xlink:href="#use17732"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0.99487012,0.10116048,-0.10116048,0.99487012,21.234615,-23.268951)"
+ id="use17736"
+ xlink:href="#use17734"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,304.30952,33.999897)"
+ id="use17738"
+ xlink:href="#g17702"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,321.11765,18.020497)"
+ id="use17740"
+ xlink:href="#use17708"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,337.9258,2.0410622)"
+ id="use17742"
+ xlink:href="#use17710"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,354.73395,-13.938351)"
+ id="use17744"
+ xlink:href="#use17712"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,371.54213,-29.91774)"
+ id="use17746"
+ xlink:href="#use17714"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,388.35035,-45.897115)"
+ id="use17748"
+ xlink:href="#use17716"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,405.15856,-61.876474)"
+ id="use17750"
+ xlink:href="#use17718"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,421.96682,-77.855816)"
+ id="use17752"
+ xlink:href="#use17720"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,438.77507,-93.835152)"
+ id="use17754"
+ xlink:href="#use17722"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,455.58338,-109.81448)"
+ id="use17756"
+ xlink:href="#use17724"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,472.39171,-125.79381)"
+ id="use17758"
+ xlink:href="#use17726"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,489.20005,-141.77309)"
+ id="use17760"
+ xlink:href="#use17728"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,506.0091,-157.75266)"
+ id="use17762"
+ xlink:href="#use17730"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,522.81928,-173.73223)"
+ id="use17764"
+ xlink:href="#use17732"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,539.63057,-189.71197)"
+ id="use17766"
+ xlink:href="#use17734"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-0.0505232,0.99872288,-0.99872288,-0.0505232,556.43727,-205.69206)"
+ id="use17768"
+ xlink:href="#use17736"
+ y="0"
+ x="0" />
+ </g>
+</svg>
diff --git a/data/theme/running-indicator.svg b/data/theme/running-indicator.svg
new file mode 100644
index 0000000..ebe7ecf
--- /dev/null
+++ b/data/theme/running-indicator.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="119.97824"
+ height="119.97824"
+ id="svg7355"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="running-indicator.svg">
+ <metadata
+ id="metadata4175">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#2c1cff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1141"
+ id="namedview4173"
+ showgrid="false"
+ inkscape:zoom="8.1348081"
+ inkscape:cx="81.120662"
+ inkscape:cy="58.117986"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g30864" />
+ <defs
+ id="defs7357">
+ <radialGradient
+ xlink:href="#linearGradient36429"
+ id="radialGradient7461"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.011539,0,0,0.57582113,-0.39262194,71.83807)"
+ cx="47.428951"
+ cy="167.16817"
+ fx="47.428951"
+ fy="167.16817"
+ r="37" />
+ <linearGradient
+ id="linearGradient36429">
+ <stop
+ id="stop36431"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop36433"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ xlink:href="#linearGradient36471"
+ id="radialGradient7463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1891549,0,0,0.55513246,-9.281289,36.12653)"
+ cx="49.067139"
+ cy="242.50381"
+ fx="49.067139"
+ fy="242.50381"
+ r="37.00671" />
+ <linearGradient
+ id="linearGradient36471">
+ <stop
+ id="stop36473"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop36475"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ r="37.00671"
+ fy="242.50381"
+ fx="49.067139"
+ cy="242.50381"
+ cx="49.067139"
+ gradientTransform="matrix(1.1891549,0,0,0.15252127,-9.281289,132.52772)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient7488"
+ xlink:href="#linearGradient36471" />
+ </defs>
+ <g
+ id="layer1"
+ transform="matrix(1.6213276,0,0,1.6213276,-431.6347,-272.5745)">
+ <g
+ style="display:inline"
+ id="g30864"
+ transform="translate(255.223,70.118091)">
+ <rect
+ ry="3.4593496"
+ rx="3.4593496"
+ y="99.596962"
+ x="12.596948"
+ height="71.116341"
+ width="71.116341"
+ id="rect14000"
+ style="opacity:0.37187500000000001;fill:url(#radialGradient7461);fill-opacity:1;stroke:none" />
+ <path
+ id="rect34520"
+ d="m 83.273151,166.72152 c 0,1.96759 -1.584022,3.55163 -3.551629,3.55163 l -63.443032,0 c -1.967608,0 -3.551648,-1.58402 -3.551643,-3.55164 0,-5.85318 0,-5.85318 0,0"
+ style="opacity:0.35;fill:none;stroke:url(#radialGradient7488);stroke-width:1;stroke-opacity:1"
+ connector-curvature="0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccscc" />
+ </g>
+ </g>
+</svg>
diff --git a/data/theme/toggle-off-dark.svg b/data/theme/toggle-off-dark.svg
new file mode 100644
index 0000000..163a135
--- /dev/null
+++ b/data/theme/toggle-off-dark.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="46" height="22"><defs><linearGradient id="a"><stop offset="0" stop-color="#39393a"/><stop offset="1" stop-color="#302f30"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="53" y1="294.429" x2="53" y2="309.804" gradientUnits="userSpaceOnUse" gradientTransform="translate(-42.76)"/></defs><g transform="translate(0 -291.18)" stroke-width="1.085" stroke="#151515"><rect style="marker:none" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#282828"/><rect ry="10.455" rx="10.455" y="291.715" x=".543" height="20.911" width="21.143" style="marker:none" fill="url(#b)"/></g></svg> \ No newline at end of file
diff --git a/data/theme/toggle-off-hc.svg b/data/theme/toggle-off-hc.svg
new file mode 100644
index 0000000..809cd3f
--- /dev/null
+++ b/data/theme/toggle-off-hc.svg
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48"
+ height="22"
+ id="svg2857"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="toggle-off-hc.svg">
+ <defs
+ id="defs2859">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2865" />
+ <inkscape:perspective
+ id="perspective2843"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect77541-4"
+ is_visible="true" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#000000"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-6.1820581"
+ inkscape:cy="-16.463788"
+ inkscape:document-units="px"
+ inkscape:current-layer="g37994"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1364"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-bbox="true"
+ showborder="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid12954"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2862">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-444.64286,-781.36218)">
+ <g
+ transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
+ id="g37994">
+ <g
+ transform="matrix(1.5323214,0,0,1.2413968,-324.76058,489.69039)"
+ id="toggle-off"
+ inkscape:label="#g8477">
+ <circle
+ cy="1033.993"
+ cx="571.95966"
+ id="path8444"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ r="7" />
+ <rect
+ ry="2.0108337"
+ rx="1.9562569"
+ y="1031.9885"
+ x="565.0083"
+ height="4.0216675"
+ width="34.850178"
+ id="rect8461"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ transform="matrix(1.5323214,0,0,1.2413968,-324.85635,491.16456)"
+ id="toggle-on"
+ inkscape:label="#g8481">
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect8475"
+ width="34.850178"
+ height="4.0216675"
+ x="565.0083"
+ y="1070.9279"
+ rx="1.9562569"
+ ry="2.0108337" />
+ <circle
+ transform="scale(-1,1)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle8463"
+ cx="-591.0213"
+ cy="1072.9402"
+ r="9" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/data/theme/toggle-off.svg b/data/theme/toggle-off.svg
new file mode 100644
index 0000000..ee51782
--- /dev/null
+++ b/data/theme/toggle-off.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="46" height="22"><g transform="translate(0 -291.18)"><rect style="marker:none;font-variant-east_asian:normal" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#e1dedb" stroke="#cdc7c2" stroke-linecap="round" stroke-linejoin="round"/><rect ry="10.455" rx="10.455" y="291.715" x=".543" height="20.911" width="21.143" style="marker:none;font-variant-east_asian:normal" fill="#f8f7f7" stroke="#aa9f98" stroke-linecap="round" stroke-linejoin="round"/><g transform="matrix(.97148 0 0 1 1658.914 -2552.91)" stroke-width="1.015" stroke-linecap="round" stroke-linejoin="round"><rect ry="13.17" rx="13.556" y="1234.681" x="-1242.732" height="26" width="49.409" style="marker:none" fill="#e1dedb" stroke="#cdc7c2"/><rect style="marker:none" width="26.763" height="26" x="-1242.732" y="1234.769" rx="13.511" ry="13.126" fill="#f8f7f7" stroke="#aa9f98"/></g><g transform="matrix(.97148 0 0 1 1658.914 -2512.91)" stroke-width="1.015" stroke="#2b73cc"><rect style="marker:none" width="49.409" height="26" x="-1242.732" y="1234.681" rx="13.556" ry="13.17" fill="#3081e3"/><rect ry="13.126" rx="13.511" y="1234.769" x="-1220.086" height="26" width="26.763" style="marker:none" fill="#f8f7f7" stroke-linecap="round" stroke-linejoin="round"/></g></g></svg> \ No newline at end of file
diff --git a/data/theme/toggle-on-dark.svg b/data/theme/toggle-on-dark.svg
new file mode 100644
index 0000000..b71931a
--- /dev/null
+++ b/data/theme/toggle-on-dark.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="46" height="22"><defs><linearGradient id="a"><stop offset="0" stop-color="#39393a"/><stop offset="1" stop-color="#302f30"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="53" y1="294.429" x2="53" y2="309.804" gradientUnits="userSpaceOnUse" gradientTransform="translate(-19)"/></defs><g transform="translate(0 -291.18)" stroke="#030e1b" stroke-width="1.085"><rect style="marker:none" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#15539e"/><rect ry="10.455" rx="10.455" y="291.715" x="24.304" height="20.911" width="21.143" style="marker:none" fill="url(#b)"/></g></svg> \ No newline at end of file
diff --git a/data/theme/toggle-on-hc.svg b/data/theme/toggle-on-hc.svg
new file mode 100644
index 0000000..9952f95
--- /dev/null
+++ b/data/theme/toggle-on-hc.svg
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48"
+ height="22"
+ id="svg2857"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="toggle-on-hc.svg">
+ <defs
+ id="defs2859">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2865" />
+ <inkscape:perspective
+ id="perspective2843"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect77541-4"
+ is_visible="true" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#000000"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-222.95215"
+ inkscape:cy="3.9378433"
+ inkscape:document-units="px"
+ inkscape:current-layer="g37994"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1364"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-bbox="true"
+ showborder="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid12954"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2862">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-444.64286,-781.36218)">
+ <g
+ transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
+ id="g37994">
+ <g
+ transform="matrix(1.5323214,0,0,1.2413968,-324.85635,441.50868)"
+ id="toggle-on"
+ inkscape:label="#g8481">
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect8475"
+ width="34.850178"
+ height="4.0216675"
+ x="565.0083"
+ y="1070.9279"
+ rx="1.9562569"
+ ry="2.0108337" />
+ <circle
+ transform="scale(-1,1)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle8463"
+ cx="-591.0213"
+ cy="1072.9402"
+ r="9" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/data/theme/toggle-on.svg b/data/theme/toggle-on.svg
new file mode 100644
index 0000000..28be67e
--- /dev/null
+++ b/data/theme/toggle-on.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="46" height="22"><g transform="translate(0 -291.18)" stroke="#2b73cc"><rect style="marker:none;font-variant-east_asian:normal" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#3081e3"/><rect ry="10.455" rx="10.455" y="291.715" x="24.304" height="20.911" width="21.143" style="marker:none;font-variant-east_asian:normal" fill="#f8f7f7" stroke-linecap="round" stroke-linejoin="round"/></g></svg> \ No newline at end of file
diff --git a/data/update-osk-layouts.sh b/data/update-osk-layouts.sh
new file mode 100755
index 0000000..8d78c0e
--- /dev/null
+++ b/data/update-osk-layouts.sh
@@ -0,0 +1,47 @@
+#!/bin/env bash
+
+CLDR_LAYOUTS_TARBALL="http://www.unicode.org/Public/cldr/latest/keyboards.zip"
+
+WORKDIR=".osk-layout-workbench"
+CLDR2JSON="cldr2json/cldr2json.py"
+SRCDIR="$WORKDIR/keyboards/android"
+DESTDIR="osk-layouts"
+GRESOURCE_FILE="gnome-shell-osk-layouts.gresource.xml"
+TMP_GRESOURCE_FILE=".$GRESOURCE_FILE.tmp"
+
+cd `dirname $0`
+
+# Ensure work/dest dirs
+rm -rf $WORKDIR
+mkdir -p $WORKDIR
+mkdir -p "osk-layouts"
+
+# Download stuff on the work dir
+pushd $WORKDIR
+gio copy $CLDR_LAYOUTS_TARBALL .
+unzip keyboards.zip
+popd
+
+# Transform to JSON files
+$CLDR2JSON $SRCDIR $DESTDIR
+
+# Generate new gresources xml file
+cat >$TMP_GRESOURCE_FILE <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/shell/osk-layouts">
+EOF
+
+for f in $DESTDIR/*.json
+do
+ echo " <file>$(basename $f)</file>" >>$TMP_GRESOURCE_FILE
+done
+
+cat >>$TMP_GRESOURCE_FILE <<EOF
+ <file>emoji.json</file>
+ </gresource>
+</gresources>
+EOF
+
+# Rewrite old gresources xml
+mv $TMP_GRESOURCE_FILE $GRESOURCE_FILE