diff --git a/android/gradle.properties b/android/gradle.properties
index 818e87b23b224ced309ae5c147e5ed827826e237..db7a1ee2908d6e94aeb319e1c1b548a8bb245891 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.2
-app.versionCode=2
+app.versionName=0.0.3
+app.versionCode=3
diff --git a/assets/icons/button_back.png b/assets/icons/button_back.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a802ff2d2bc0c90488a1c319288be9f28cdea5e
Binary files /dev/null and b/assets/icons/button_back.png differ
diff --git a/assets/icons/button_start.png b/assets/icons/button_start.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a3b74a3b98f45de590a7f290b810daba7120912
Binary files /dev/null and b/assets/icons/button_start.png differ
diff --git a/assets/icons/difficulty_easy.png b/assets/icons/difficulty_easy.png
new file mode 100644
index 0000000000000000000000000000000000000000..66f1476dadfda62b03378a040f10737d9edbab1c
Binary files /dev/null and b/assets/icons/difficulty_easy.png differ
diff --git a/assets/icons/difficulty_hard.png b/assets/icons/difficulty_hard.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c1aef8bb260d6e5241a0856c11cfae129c9d24e
Binary files /dev/null and b/assets/icons/difficulty_hard.png differ
diff --git a/assets/icons/difficulty_medium.png b/assets/icons/difficulty_medium.png
new file mode 100644
index 0000000000000000000000000000000000000000..146d9b9ca714b9c82e9a5188e88e5cc8736b893e
Binary files /dev/null and b/assets/icons/difficulty_medium.png differ
diff --git a/assets/icons/difficulty_nightmare.png b/assets/icons/difficulty_nightmare.png
new file mode 100644
index 0000000000000000000000000000000000000000..4cda5bce2f117d694c2940ba080121c4bc0c8b74
Binary files /dev/null and b/assets/icons/difficulty_nightmare.png differ
diff --git a/assets/icons/game_fail.png b/assets/icons/game_fail.png
new file mode 100644
index 0000000000000000000000000000000000000000..e93f8fa2815c0bac52c52a719f296671ac841e08
Binary files /dev/null and b/assets/icons/game_fail.png differ
diff --git a/assets/icons/game_win.png b/assets/icons/game_win.png
new file mode 100644
index 0000000000000000000000000000000000000000..d73741df40e8cb97e2bf0eec929bba2e7859459a
Binary files /dev/null and b/assets/icons/game_win.png differ
diff --git a/assets/icons/size_10x10.png b/assets/icons/size_10x10.png
new file mode 100644
index 0000000000000000000000000000000000000000..7cdbbb197a5dc4cab3a3e41259f8a3fa39cff9b8
Binary files /dev/null and b/assets/icons/size_10x10.png differ
diff --git a/assets/icons/size_15x15.png b/assets/icons/size_15x15.png
new file mode 100644
index 0000000000000000000000000000000000000000..45b2f4b3c2d657cd840e5ace4ceac18a8e4386f3
Binary files /dev/null and b/assets/icons/size_15x15.png differ
diff --git a/assets/icons/size_20x20.png b/assets/icons/size_20x20.png
new file mode 100644
index 0000000000000000000000000000000000000000..29ec37fc99149d700b7d4627fd13e982347da8fb
Binary files /dev/null and b/assets/icons/size_20x20.png differ
diff --git a/assets/skins/default_0.png b/assets/skins/default_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..586de0573e7f77d97c16942f603b8ee6d9c7d7bc
Binary files /dev/null and b/assets/skins/default_0.png differ
diff --git a/assets/skins/default_1.png b/assets/skins/default_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4b951d92fa7c2c3d7843ef06e725fab8fc34e48
Binary files /dev/null and b/assets/skins/default_1.png differ
diff --git a/assets/skins/default_2.png b/assets/skins/default_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..c47dee8a726f1e8e7f5193bfd5650f608e755124
Binary files /dev/null and b/assets/skins/default_2.png differ
diff --git a/assets/skins/default_3.png b/assets/skins/default_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..7da3d63267168150d65b94e11187d833f63d5e6a
Binary files /dev/null and b/assets/skins/default_3.png differ
diff --git a/assets/skins/default_4.png b/assets/skins/default_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..1bfd5edb7930ebf522874d20a79596bc03b5fe49
Binary files /dev/null and b/assets/skins/default_4.png differ
diff --git a/assets/skins/default_5.png b/assets/skins/default_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..38d695079a8377d20cb67e7e300a2a9b2c38da69
Binary files /dev/null and b/assets/skins/default_5.png differ
diff --git a/assets/skins/default_6.png b/assets/skins/default_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9074fa7dfbdcb7506cf0296c9385eb7bc410269
Binary files /dev/null and b/assets/skins/default_6.png differ
diff --git a/assets/skins/default_7.png b/assets/skins/default_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..8bf9bda2e28c5ef165e2a8e0ed3eaee7973be116
Binary files /dev/null and b/assets/skins/default_7.png differ
diff --git a/assets/skins/default_8.png b/assets/skins/default_8.png
new file mode 100644
index 0000000000000000000000000000000000000000..8733181012a39f2acc822446787d29bc79c113ec
Binary files /dev/null and b/assets/skins/default_8.png differ
diff --git a/assets/skins/default_mine.png b/assets/skins/default_mine.png
new file mode 100644
index 0000000000000000000000000000000000000000..71f1ea3c0204c33522ed29671136ea61d074e4b6
Binary files /dev/null and b/assets/skins/default_mine.png differ
diff --git a/assets/skins/default_unknown.png b/assets/skins/default_unknown.png
new file mode 100644
index 0000000000000000000000000000000000000000..be034071b95e7be9a24632a1ff4c7a68ad25b0c7
Binary files /dev/null and b/assets/skins/default_unknown.png differ
diff --git a/assets/skins/empty.png b/assets/skins/empty.png
new file mode 100644
index 0000000000000000000000000000000000000000..586de0573e7f77d97c16942f603b8ee6d9c7d7bc
Binary files /dev/null and b/assets/skins/empty.png differ
diff --git a/fastlane/metadata/android/en-US/changelogs/1.txt b/fastlane/metadata/android/en-US/changelogs/1.txt
new file mode 100644
index 0000000000000000000000000000000000000000..777d1a0ba948b3f865c80691b3dbd9989ab3cefe
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/1.txt
@@ -0,0 +1 @@
+Add initial empty app
diff --git a/fastlane/metadata/android/en-US/changelogs/2.txt b/fastlane/metadata/android/en-US/changelogs/2.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fe56ebf91e506ee59b7d03cf8b12af27f3218d98
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/2.txt
@@ -0,0 +1 @@
+Improve CI/CD, add jabber notification on create tag
diff --git a/fastlane/metadata/android/en-US/changelogs/3.txt b/fastlane/metadata/android/en-US/changelogs/3.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c4767c31cd60be21ad424c3e0b8357a7a045e229
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/3.txt
@@ -0,0 +1 @@
+Add minimal playable game.
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fe3f142e53937dcc8b1e95ccee28655b2732e27f
--- /dev/null
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -0,0 +1 @@
+Simple Minehunter Game
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8cff21a3902028c01974a4f3062e10c15544ee9
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/icon.png differ
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fe3f142e53937dcc8b1e95ccee28655b2732e27f
--- /dev/null
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -0,0 +1 @@
+Simple Minehunter Game
diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fe3f142e53937dcc8b1e95ccee28655b2732e27f
--- /dev/null
+++ b/fastlane/metadata/android/en-US/title.txt
@@ -0,0 +1 @@
+Simple Minehunter Game
diff --git a/fastlane/metadata/android/fr-FR/changelogs/1.txt b/fastlane/metadata/android/fr-FR/changelogs/1.txt
new file mode 100644
index 0000000000000000000000000000000000000000..92466631aefea3581239016047dac2ac13731baa
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/1.txt
@@ -0,0 +1 @@
+Création de l'application minimale, vide.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/2.txt b/fastlane/metadata/android/fr-FR/changelogs/2.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cdf380ac4f91ab3c0d9d07ac7af06ee46adfa7a2
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/2.txt
@@ -0,0 +1 @@
+Amélioration de la chaîne CI/CD, envoi d'un message à la création de version
diff --git a/fastlane/metadata/android/fr-FR/changelogs/3.txt b/fastlane/metadata/android/fr-FR/changelogs/3.txt
new file mode 100644
index 0000000000000000000000000000000000000000..75d529883f8fa154d4ea9bd7307daab48f0680d0
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/3.txt
@@ -0,0 +1 @@
+Ajout du jeu minimal, jouable.
diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..170a1a633d68331f0ae329b7d3af80123aac1ce5
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/full_description.txt
@@ -0,0 +1 @@
+Jeu du démineur simple
diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..170a1a633d68331f0ae329b7d3af80123aac1ce5
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/short_description.txt
@@ -0,0 +1 @@
+Jeu du démineur simple
diff --git a/fastlane/metadata/android/fr-FR/title.txt b/fastlane/metadata/android/fr-FR/title.txt
new file mode 100644
index 0000000000000000000000000000000000000000..170a1a633d68331f0ae329b7d3af80123aac1ce5
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/title.txt
@@ -0,0 +1 @@
+Jeu du démineur simple
diff --git a/icons/build_icons.sh b/icons/build_application_icons.sh
similarity index 92%
rename from icons/build_icons.sh
rename to icons/build_application_icons.sh
index fefc393e2f601cd671938068d23247d6bfb1682b..569a16a50dd3015a45c291a93305ff0f67f77c72 100755
--- a/icons/build_icons.sh
+++ b/icons/build_application_icons.sh
@@ -4,7 +4,6 @@
 command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
 command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
 command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
-command -v convert >/dev/null 2>&1 || { echo >&2 "I require convert (imagemagick) but it's not installed. Aborting."; exit 1; }
 
 CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
 BASE_DIR="$(dirname "${CURRENT_DIR}")"
@@ -46,3 +45,4 @@ build_icon  48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher
 build_icon  96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher
 build_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher
 build_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher
+build_icon 512 ${BASE_DIR}/fastlane/metadata/android/en-US/images/icon
diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh
new file mode 100755
index 0000000000000000000000000000000000000000..aae2bcba4f5c4a055565bdc501e43ab802c7c377
--- /dev/null
+++ b/icons/build_game_icons.sh
@@ -0,0 +1,74 @@
+#! /bin/bash
+
+# Check dependencies
+command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
+command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
+command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+BASE_DIR="$(dirname "${CURRENT_DIR}")"
+
+OPTIPNG_OPTIONS="-preserve -quiet -o7"
+
+# optimize svg
+function optimize_svg() {
+  SOURCE="$1"
+
+  cp ${SOURCE} ${SOURCE}.tmp
+  scour \
+      --remove-descriptive-elements \
+      --enable-id-stripping \
+      --enable-viewboxing \
+      --enable-comment-stripping \
+      --nindent=4 \
+      -i ${SOURCE}.tmp \
+      -o ${SOURCE}
+  rm ${SOURCE}.tmp
+}
+
+# build icons
+function build_icon() {
+  ICON_SIZE=192
+  SOURCE="$1"
+  TARGET="$2"
+
+  optimize_svg "${SOURCE}"
+
+  inkscape \
+      --export-width=${ICON_SIZE} \
+      --export-height=${ICON_SIZE} \
+      --export-filename=${TARGET} \
+      ${SOURCE}
+
+  optipng ${OPTIPNG_OPTIONS} ${TARGET}
+}
+
+function build_icon_for_skin() {
+  SKIN_CODE="$1"
+
+  build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/mine.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_mine.png
+  build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/unknown.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_unknown.png
+  for VALUE in {0..8};
+  do
+    if [ -f "${CURRENT_DIR}/skins/${SKIN_CODE}/${VALUE}.svg" ]; then
+      build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/${VALUE}.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_${VALUE}.png
+    fi
+  done
+}
+
+# Game icons
+build_icon ${CURRENT_DIR}/button_back.svg ${BASE_DIR}/assets/icons/button_back.png
+build_icon ${CURRENT_DIR}/button_start.svg ${BASE_DIR}/assets/icons/button_start.png
+build_icon ${CURRENT_DIR}/difficulty_easy.svg ${BASE_DIR}/assets/icons/difficulty_easy.png
+build_icon ${CURRENT_DIR}/difficulty_medium.svg ${BASE_DIR}/assets/icons/difficulty_medium.png
+build_icon ${CURRENT_DIR}/difficulty_hard.svg ${BASE_DIR}/assets/icons/difficulty_hard.png
+build_icon ${CURRENT_DIR}/difficulty_nightmare.svg ${BASE_DIR}/assets/icons/difficulty_nightmare.png
+build_icon ${CURRENT_DIR}/game_fail.svg ${BASE_DIR}/assets/icons/game_fail.png
+build_icon ${CURRENT_DIR}/game_win.svg ${BASE_DIR}/assets/icons/game_win.png
+build_icon ${CURRENT_DIR}/size_10x10.svg ${BASE_DIR}/assets/icons/size_10x10.png
+build_icon ${CURRENT_DIR}/size_15x15.svg ${BASE_DIR}/assets/icons/size_15x15.png
+build_icon ${CURRENT_DIR}/size_20x20.svg ${BASE_DIR}/assets/icons/size_20x20.png
+build_icon ${CURRENT_DIR}/skins/empty.svg ${BASE_DIR}/assets/skins/empty.png
+
+# Skins
+build_icon_for_skin "default"
diff --git a/icons/button_back.svg b/icons/button_back.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2622a578dba53ce582afabfc587c2a85a1fb6eaa
--- /dev/null
+++ b/icons/button_back.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x=".44662" y=".89101" width="92.772" height="91.894" ry="11.689" fill="#e41578" stroke="#fff" stroke-width=".238"/><path d="m59.387 71.362c1.1248 1.1302 4.0012 1.1302 4.0012 0v-45.921c0-1.1316-2.8832-1.1316-4.0121 0l-37.693 20.918c-1.1289 1.1248-1.1479 2.9551-0.02171 4.084z" fill="#fefeff" stroke="#930e4e" stroke-linecap="round" stroke-linejoin="round" stroke-width="8.257"/><path d="m57.857 68.048c0.96243 0.96706 3.4236 0.96706 3.4236 0v-39.292c0-0.96825-2.467-0.96825-3.4329 0l-32.252 17.898c-0.96594 0.96243-0.9822 2.5285-0.01858 3.4945z" fill="#fefeff" stroke="#feffff" stroke-linecap="round" stroke-linejoin="round" stroke-width="4.314"/></svg>
diff --git a/icons/button_start.svg b/icons/button_start.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e9d49d2172b9a0305db82779971e3c1e12f34a70
--- /dev/null
+++ b/icons/button_start.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x=".44662" y=".89101" width="92.772" height="91.894" ry="11.689" fill="#49a1ee" stroke="#fff" stroke-width=".238"/><path d="m34.852 25.44c-1.1248-1.1302-4.0012-1.1302-4.0012 0v45.921c0 1.1316 2.8832 1.1316 4.0121 0l37.693-20.918c1.1289-1.1248 1.1479-2.9551 0.02171-4.084z" fill="#fefeff" stroke="#105ca1" stroke-linecap="round" stroke-linejoin="round" stroke-width="8.257"/><path d="m36.382 28.754c-0.96243-0.96706-3.4236-0.96706-3.4236 0v39.292c0 0.96825 2.467 0.96825 3.4329 0l32.252-17.898c0.96594-0.96243 0.9822-2.5285 0.01858-3.4945z" fill="#fefeff" stroke="#feffff" stroke-linecap="round" stroke-linejoin="round" stroke-width="4.314"/></svg>
diff --git a/icons/difficulty_easy.svg b/icons/difficulty_easy.svg
new file mode 100644
index 0000000000000000000000000000000000000000..da0e21f6c94972d3e3f19d21cd44d4f712e3174d
--- /dev/null
+++ b/icons/difficulty_easy.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#41ff6a" stroke="#000" stroke-width="2"/><path d="m23.408 53.415 20.8 13.7c0.2 0.1 0.3 0.2 0.5 0.3 1.3 0.5 2.8-0.1 3.3-1.3 0.5-1.3-0.1-2.8-1.3-3.3l-23.2-9.6c-0.2 0-0.3 0.2-0.1 0.2zm23.7 11.6c0.1 0.8-0.5 1.4-1.3 1.5s-1.4-0.5-1.5-1.3 0.5-1.4 1.3-1.5c0.8 0 1.5 0.5 1.5 1.3z"/><path d="m41.708 36.515c0.1 0.4 0.6 0.7 1 0.7 0.9-0.1 1.9-0.1 2.8-0.1 1.5 0 2.9 0.1 4.3 0.3 0.6 0.1 1.2-0.4 1.2-1v-6.9c0-0.6-0.5-1-1-1-3.2 0.1-6.4 0.7-9.3 1.6-0.5 0.2-0.8 0.7-0.6 1.3z"/><path d="m52.508 37.815c2.1 0.5 4.2 1.3 6.2 2.2 0.5 0.3 1.2 0 1.4-0.6l2.7-8.2c0.2-0.5-0.1-1.1-0.6-1.3-3-0.9-6.1-1.5-9.3-1.6-0.6 0-1 0.4-1 1v7.5c-0.1 0.5 0.2 0.9 0.6 1z"/><path d="m81.508 46.115-8.4 6.1c-0.4 0.3-0.5 0.8-0.3 1.3 0.9 1.6 1.6 3.2 2.2 4.9 0.2 0.5 0.7 0.8 1.2 0.6l9.8-3.2c0.5-0.2 0.8-0.7 0.6-1.3-1-2.9-2.3-5.7-3.8-8.2-0.2-0.4-0.9-0.6-1.3-0.2z"/><path d="m32.908 40.015c2.3-1.1 4.7-2 7.2-2.5 0.6-0.1 1-0.7 0.8-1.3l-1.5-4.7c-0.2-0.5-0.8-0.8-1.3-0.6-2.9 1.2-5.7 2.7-8.2 4.6-0.4 0.3-0.5 0.9-0.2 1.4l2 2.8c0.2 0.4 0.8 0.5 1.2 0.3z"/><path d="m63.408 31.615-2.8 8.6c-0.1 0.4 0 0.9 0.4 1.1 1.7 1 3.4 2.2 4.9 3.6 0.4 0.4 1.1 0.3 1.5-0.1l5.7-7.9c0.3-0.4 0.2-1.1-0.2-1.4-2.5-1.9-5.3-3.4-8.2-4.6-0.5-0.2-1.1 0.1-1.3 0.7z"/><path d="m67.908 46.815c1.3 1.4 2.5 2.8 3.5 4.4 0.3 0.5 0.9 0.6 1.4 0.3l8.3-6c0.4-0.3 0.5-0.9 0.2-1.4-1.8-2.5-3.9-4.8-6.2-6.8-0.4-0.4-1.1-0.3-1.5 0.2l-5.9 8.1c-0.2 0.3-0.2 0.8 0.2 1.2z"/><path d="m24.408 46.315c1.8-2 3.9-3.7 6.2-5.1 0.5-0.3 0.6-1 0.3-1.4l-1.8-2.4c-0.3-0.5-1-0.6-1.5-0.2-2.3 2-4.4 4.3-6.2 6.8-0.3 0.4-0.2 1.1 0.2 1.4l1.4 1c0.5 0.3 1 0.3 1.4-0.1z"/><path d="m13.808 54.815 6 2c0.5 0.2 1-0.1 1.2-0.6 1.1-2.6 2.2-4.3 3.9-6.4 0.4-0.4 0.3-1.1-0.2-1.4l-5.9-4.2c-0.5-0.3-1.1-0.2-1.4 0.3-1.6 2.5-3.2 6.1-4.1 9-0.3 0.6 0 1.2 0.5 1.3z"/><path d="m75.808 60.915c0.4 1.7 0.7 3.5 0.9 5.3 0 0.5 0.5 0.9 1 0.9h10.2c0.6 0 1-0.5 1-1-0.1-3.1-0.5-6-1.3-8.9-0.1-0.6-0.7-0.9-1.3-0.7l-9.8 3.2c-0.6 0.2-0.9 0.7-0.7 1.2z"/><path d="m15.808 67.115c0.1-3.2 0.7-6.3 1.7-9.2 0.2-0.5-0.1-1.1-0.6-1.3l-0.4-0.1c-0.5-0.2-1.1 0.1-1.3 0.7-0.8 3.2-1.3 6.5-1.3 9.9z"/></svg>
diff --git a/icons/difficulty_hard.svg b/icons/difficulty_hard.svg
new file mode 100644
index 0000000000000000000000000000000000000000..254346afe6f2b8c3cf79ee079881802f863caee9
--- /dev/null
+++ b/icons/difficulty_hard.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#d31158" stroke="#000" stroke-width="2"/><path d="m69.154 59.254-24.4 5.1c-0.2 0-0.4 0.1-0.5 0.1-1.3 0.6-1.9 2-1.4 3.3 0.6 1.3 2 1.9 3.3 1.4l23-9.7c0.2 0 0.1-0.2 0-0.2zm-25 8.7c-0.6-0.5-0.6-1.4-0.1-2s1.4-0.6 2-0.1 0.6 1.4 0.1 2c-0.5 0.5-1.4 0.6-2 0.1z"/><path d="m41.054 38.354c0.1 0.4 0.6 0.7 1 0.7 0.9-0.1 1.9-0.1 2.8-0.1 1.5 0 2.9 0.1 4.3 0.3 0.6 0.1 1.2-0.4 1.2-1v-6.9c0-0.6-0.5-1-1-1-3.2 0.1-6.4 0.7-9.3 1.6-0.5 0.2-0.8 0.7-0.6 1.3z"/><path d="m51.854 39.754c2.1 0.5 4.2 1.3 6.2 2.2 0.5 0.3 1.2 0 1.4-0.6l2.7-8.2c0.2-0.5-0.1-1.1-0.6-1.3-3-0.9-6.1-1.5-9.3-1.6-0.6 0-1 0.4-1 1v7.5c-0.2 0.5 0.1 0.9 0.6 1z"/><path d="m82.754 46.554-12.2 8.9c-0.4 0.3-0.5 0.8-0.3 1.3 0.9 1.6 1.2 2.6 1.8 4.3 0.2 0.5 0.7 0.8 1.2 0.6l14.4-4.7c0.5-0.2 0.8-0.7 0.6-1.3-1-2.9-2.6-6.4-4.1-8.9-0.3-0.5-1-0.6-1.4-0.2z"/><path d="m32.154 41.854c2.3-1.1 4.7-2 7.2-2.5 0.6-0.1 1-0.7 0.8-1.3l-1.5-4.7c-0.2-0.5-0.8-0.8-1.3-0.6-2.9 1.2-5.7 2.7-8.2 4.6-0.4 0.3-0.5 0.9-0.2 1.4l2 2.8c0.3 0.4 0.8 0.5 1.2 0.3z"/><path d="m62.754 33.454-2.8 8.6c-0.1 0.4 0 0.9 0.4 1.1 1.7 1 3.4 2.2 4.9 3.6 0.4 0.4 1.1 0.3 1.5-0.1l5.7-7.9c0.3-0.4 0.2-1.1-0.2-1.4-2.5-1.9-5.3-3.4-8.2-4.6-0.5-0.1-1.1 0.2-1.3 0.7z"/><path d="m67.154 48.654c1.3 1.4 2.5 2.8 3.5 4.4 0.3 0.5 0.9 0.6 1.4 0.3l8.3-6c0.4-0.3 0.5-0.9 0.2-1.4-1.8-2.5-3.9-4.8-6.2-6.8-0.4-0.4-1.1-0.3-1.5 0.2l-5.9 8.1c-0.2 0.3-0.1 0.9 0.2 1.2z"/><path d="m23.654 48.154c1.8-2 3.9-3.7 6.2-5.1 0.5-0.3 0.6-1 0.3-1.4l-1.7-2.4c-0.3-0.5-1-0.6-1.5-0.2-2.3 2-4.4 4.3-6.2 6.8-0.3 0.4-0.2 1.1 0.2 1.4l1.4 1c0.4 0.4 1 0.3 1.3-0.1z"/><path d="m15.954 57.654 0.5 0.2c0.5 0.2 1-0.1 1.2-0.6 1.1-2.6 2.5-5 4.2-7.1 0.4-0.4 0.3-1.1-0.2-1.4l-1.2-0.8c-0.3-0.4-1-0.2-1.3 0.3-1.6 2.5-2.9 5.3-3.8 8.2-0.2 0.5 0.1 1.1 0.6 1.2z"/><path d="m75.054 62.754c0.4 1.7 0.7 3.5 0.9 5.3 0 0.5 0.5 0.9 1 0.9h10.2c0.6 0 1-0.5 1-1-0.1-3.1-0.5-6-1.3-8.9-0.1-0.6-0.7-0.9-1.3-0.7l-9.8 3.2c-0.5 0.2-0.8 0.7-0.7 1.2z"/><path d="m15.054 68.954c0.1-3.2 0.7-6.3 1.7-9.2 0.2-0.5-0.1-1.1-0.6-1.3l-0.3-0.1c-0.5-0.2-1.1 0.1-1.3 0.7-0.8 3.2-1.3 6.5-1.3 9.9z"/></svg>
diff --git a/icons/difficulty_medium.svg b/icons/difficulty_medium.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a6a8c5565ce3937fdb73613f7f53e14f1c888630
--- /dev/null
+++ b/icons/difficulty_medium.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#eeb517" stroke="#000" stroke-width="2"/><path d="m53.928 43.009-11 21.7c-0.1 0.2-0.1 0.3-0.2 0.5-0.4 1.4 0.4 2.7 1.7 3.2 1.4 0.4 2.7-0.4 3.2-1.7l6.6-23.7c0-0.1-0.2-0.2-0.3 0zm-8.5 24.3c-0.8 0.1-1.5-0.4-1.6-1.1-0.1-0.8 0.4-1.5 1.1-1.6 0.8-0.1 1.5 0.4 1.6 1.1 0.1 0.8-0.4 1.5-1.1 1.6z"/><path d="m41.128 37.409c0.1 0.4 0.6 0.7 1 0.7 0.9-0.1 1.9-0.1 2.8-0.1 1.5 0 2.9 0.1 4.3 0.3 0.6 0.1 1.2-0.4 1.2-1v-6.9c0-0.6-0.5-1-1-1-3.2 0.1-6.4 0.7-9.3 1.6-0.5 0.2-0.8 0.7-0.6 1.3z"/><path d="m51.928 41.209c2.1 0.5 3.5 1 5.5 2 0.5 0.3 1.2 0 1.4-0.6l4.2-12.8c0.2-0.5-0.1-1.1-0.6-1.3-3-0.9-6.9-1.5-10.1-1.7-0.6 0-1 0.4-1 1v12.4c-0.1 0.5 0.2 0.9 0.6 1z"/><path d="m80.928 47.009-8.4 6.1c-0.4 0.3-0.5 0.8-0.3 1.3 0.9 1.6 1.6 3.2 2.2 4.9 0.2 0.5 0.7 0.8 1.2 0.6l9.8-3.2c0.5-0.2 0.8-0.7 0.6-1.3-1-2.9-2.3-5.7-3.8-8.2-0.2-0.4-0.9-0.5-1.3-0.2z"/><path d="m32.328 40.909c2.3-1.1 4.7-2 7.2-2.5 0.6-0.1 1-0.7 0.8-1.3l-1.5-4.7c-0.2-0.5-0.8-0.8-1.3-0.6-2.9 1.2-5.7 2.7-8.2 4.6-0.4 0.3-0.5 0.9-0.2 1.4l2 2.8c0.2 0.4 0.8 0.5 1.2 0.3z"/><path d="m62.828 32.509-2.8 8.6c-0.1 0.4 0 0.9 0.4 1.1 1.7 1 3.4 2.2 4.9 3.6 0.4 0.4 1.1 0.3 1.5-0.1l5.7-7.9c0.3-0.4 0.2-1.1-0.2-1.4-2.5-1.9-5.3-3.4-8.2-4.6-0.5-0.1-1.1 0.2-1.3 0.7z"/><path d="m67.328 47.709c1.3 1.4 2.5 2.8 3.5 4.4 0.3 0.5 0.9 0.6 1.4 0.3l8.3-6c0.4-0.3 0.5-0.9 0.2-1.4-1.8-2.5-3.9-4.8-6.2-6.8-0.4-0.4-1.1-0.3-1.5 0.2l-5.8 8.1c-0.3 0.3-0.3 0.9 0.1 1.2z"/><path d="m23.828 47.209c1.8-2 3.9-3.7 6.2-5.1 0.5-0.3 0.6-1 0.3-1.4l-1.8-2.4c-0.3-0.5-1-0.6-1.5-0.2-2.3 2-4.4 4.3-6.2 6.8-0.3 0.4-0.2 1.1 0.2 1.4l1.4 1c0.5 0.4 1 0.3 1.4-0.1z"/><path d="m16.128 56.709 0.5 0.2c0.5 0.2 1-0.1 1.2-0.6 1.1-2.6 2.5-5 4.2-7.1 0.4-0.4 0.3-1.1-0.2-1.4l-1.2-0.8c-0.5-0.3-1.1-0.2-1.4 0.3-1.6 2.5-2.9 5.3-3.8 8.2-0.1 0.5 0.2 1.1 0.7 1.2z"/><path d="m75.228 61.809c0.4 1.7 0.7 3.5 0.9 5.3 0 0.5 0.5 0.9 1 0.9h10.2c0.6 0 1-0.5 1-1-0.1-3.1-0.5-6-1.3-8.9-0.1-0.6-0.7-0.9-1.3-0.7l-9.8 3.2c-0.6 0.2-0.8 0.7-0.7 1.2z"/><path d="m15.228 68.009c0.1-3.2 0.7-6.3 1.7-9.2 0.2-0.5-0.1-1.1-0.6-1.3l-0.3-0.1c-0.5-0.2-1.1 0.1-1.3 0.7-0.8 3.2-1.3 6.5-1.3 9.9z"/></svg>
diff --git a/icons/difficulty_nightmare.svg b/icons/difficulty_nightmare.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6d18292932921a21a9229cfb26efd1fd5c900423
--- /dev/null
+++ b/icons/difficulty_nightmare.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#727272" stroke="#000" stroke-width="2"/><path d="m70.135 63.932-24.924 0.42736c-0.19644-0.03756-0.41166 0.02311-0.50988 0.0043-1.3895 0.34521-2.2418 1.6076-1.9948 2.9784 0.34521 1.3895 1.6076 2.2418 2.9784 1.9948l24.412-5.2084c0.19644 0.03756 0.13578-0.17766 0.03756-0.19644zm-26.189 3.8507c-0.49544-0.60378-0.32643-1.4878 0.27734-1.9832 0.60378-0.49544 1.4878-0.32643 1.9832 0.27734 0.49544 0.60378 0.32643 1.4878-0.27734 1.9832-0.585 0.39721-1.4878 0.32643-1.9832-0.27734z"/><path d="m41.054 38.354c0.1 0.4 0.6 0.7 1 0.7 0.9-0.1 1.9-0.1 2.8-0.1 1.5 0 2.9 0.1 4.3 0.3 0.6 0.1 1.2-0.4 1.2-1v-6.9c0-0.6-0.5-1-1-1-3.2 0.1-6.4 0.7-9.3 1.6-0.5 0.2-0.8 0.7-0.6 1.3z"/><path d="m51.854 39.754c2.1 0.5 4.2 1.3 6.2 2.2 0.5 0.3 1.2 0 1.4-0.6l2.7-8.2c0.2-0.5-0.1-1.1-0.6-1.3-3-0.9-6.1-1.5-9.3-1.6-0.6 0-1 0.4-1 1v7.5c-0.2 0.5 0.1 0.9 0.6 1z"/><path d="m80.972 47.708-8.7626 6.3924c-0.2873 0.21547-0.35912 0.5746-0.21547 0.93372 0.64642 1.1492 0.86189 1.8674 1.2928 3.0884 0.14365 0.35912 0.50277 0.5746 0.86189 0.43094l10.343-3.3757c0.35912-0.14365 0.57459-0.50277 0.43095-0.93372-0.71824-2.0829-1.8674-4.5968-2.9448-6.3924-0.21547-0.35912-0.71824-0.43095-1.0055-0.14365z" stroke-width=".71824"/><path d="m32.154 41.854c2.3-1.1 4.7-2 7.2-2.5 0.6-0.1 1-0.7 0.8-1.3l-1.5-4.7c-0.2-0.5-0.8-0.8-1.3-0.6-2.9 1.2-5.7 2.7-8.2 4.6-0.4 0.3-0.5 0.9-0.2 1.4l2 2.8c0.3 0.4 0.8 0.5 1.2 0.3z"/><path d="m62.754 33.454-2.8 8.6c-0.1 0.4 0 0.9 0.4 1.1 1.7 1 3.4 2.2 4.9 3.6 0.4 0.4 1.1 0.3 1.5-0.1l5.7-7.9c0.3-0.4 0.2-1.1-0.2-1.4-2.5-1.9-5.3-3.4-8.2-4.6-0.5-0.1-1.1 0.2-1.3 0.7z"/><path d="m67.154 48.654c1.3 1.4 2.5 2.8 3.5 4.4 0.3 0.5 0.9 0.6 1.4 0.3l8.3-6c0.4-0.3 0.5-0.9 0.2-1.4-1.8-2.5-3.9-4.8-6.2-6.8-0.4-0.4-1.1-0.3-1.5 0.2l-5.9 8.1c-0.2 0.3-0.1 0.9 0.2 1.2z"/><path d="m23.654 48.154c1.8-2 3.9-3.7 6.2-5.1 0.5-0.3 0.6-1 0.3-1.4l-1.7-2.4c-0.3-0.5-1-0.6-1.5-0.2-2.3 2-4.4 4.3-6.2 6.8-0.3 0.4-0.2 1.1 0.2 1.4l1.4 1c0.4 0.4 1 0.3 1.3-0.1z"/><path d="m15.954 57.654 0.5 0.2c0.5 0.2 1-0.1 1.2-0.6 1.1-2.6 2.5-5 4.2-7.1 0.4-0.4 0.3-1.1-0.2-1.4l-1.2-0.8c-0.3-0.4-1-0.2-1.3 0.3-1.6 2.5-2.9 5.3-3.8 8.2-0.2 0.5 0.1 1.1 0.6 1.2z"/><path d="m73.314 60.926c0.51791 2.2011 0.90634 4.5317 1.1653 6.8623 0 0.64738 0.64738 1.1653 1.2948 1.1653h13.207c0.77686 0 1.2948-0.64738 1.2948-1.2948-0.12948-4.0138-0.64738-7.7686-1.6832-11.523-0.12948-0.77686-0.90634-1.1653-1.6832-0.90634l-12.689 4.1433c-0.64738 0.25895-1.0358 0.90634-0.90634 1.5537z" stroke-width="1.2948"/><path d="m15.054 68.954c0.1-3.2 0.7-6.3 1.7-9.2 0.2-0.5-0.1-1.1-0.6-1.3l-0.3-0.1c-0.5-0.2-1.1 0.1-1.3 0.7-0.8 3.2-1.3 6.5-1.3 9.9z"/></svg>
diff --git a/icons/game_fail.svg b/icons/game_fail.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1b9e31313ebd610a0b3b503b84b603ad64f5ca5f
--- /dev/null
+++ b/icons/game_fail.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.16545 0 0 .16545 4.4777 4.4833)"><g transform="translate(1,1)"><g fill="#f57c00"><polygon points="331.8 7.533 331.8 162.58 306.2 169.67 306.2 35.095"/><polygon points="281.28 144.07 281.28 236.06 255.68 243.14 255.68 171.63"/><polygon points="281.28 236.06 344.17 218.56 338.54 227.27 281.28 243.14"/><polygon points="485.4 127 391.53 272.07 472.09 305.6 468.33 314.73 365.93 272.07 454.17 135.7"/></g><g fill="#ff9801"><path d="m493.93 314.73-170.67 93.867v17.067h-136.53v-16.981c0.68-0.071 1.364-0.1 2.048-0.085h32.085v-25.6c0.014-4.707 3.826-8.52 8.533-8.533h34.816l86.955-47.189-60.928-25.344 48.299-74.667 5.632-8.704-62.891 17.493v-91.989h24.918v25.6l25.6-7.083v7.083l122.37-33.963-88.235 136.36 102.4 42.667 3.755-9.131z"/><path d="m306.2 35.095v108.97h-24.917l-25.6 27.563-23.296 25.002-17.237-9.045-71.083-37.205 7.168 17.152 50.859 122.2-45.909 3.498 55.979 41.983-35.328 20.139 44.715 19.115h7.851c-4.707 0.014-8.52 3.826-8.533 8.533v25.6h-32.085c-0.684-0.014-1.368 0.014-2.048 0.085v-0.085l-128-51.2 59.733-34.133-102.4-76.8 110.93-8.533-78.165-187.65-7.168-17.152 161.96 84.821 17.237 9.046z"/><polygon points="281.28 144.07 281.28 236.06 255.68 243.14 255.68 171.63"/><path d="m289.13 408.6h8.533v17.067h-127.91c0.939-8.961 8.021-16.042 16.981-16.981 0.68-0.071 1.364-0.1 2.048-0.085h32.085v-25.6c0.014-4.707 3.826-8.52 8.533-8.533h34.816l86.955-47.189-60.928-25.344 48.299-74.667 31.232-8.704-53.931 83.371 60.928 25.344-86.955 47.189h-9.215c4.707 0.014 8.52 3.826 8.533 8.533z"/><polygon points="281.28 236.06 344.17 218.56 338.54 227.27 281.28 243.14"/><polygon points="331.8 162.58 459.8 127 454.17 135.7 331.8 169.67"/></g><g fill="#ffb301"><polygon points="351.17 327.28 290.24 301.93 338.54 227.27 369.77 218.56 315.84 301.93 376.77 327.28 289.82 374.47 264.22 374.47"/><polygon points="281.28 144.07 281.28 236.06 255.68 243.14 255.68 171.63"/></g><polygon points="255.68 171.63 255.68 243.14 281.28 236.06 281.28 243.14 338.54 227.27 290.24 301.93 351.17 327.28 264.22 374.47 221.55 374.47 176.84 355.35 212.16 335.21 156.18 293.23 202.09 289.73 151.24 167.53 144.07 150.38 215.15 187.59 232.39 196.63" fill="#fdd834"/><polygon points="281.28 236.06 344.17 218.56 338.54 227.27 281.28 243.14" fill="#fec108"/><path d="m340.33 427.71v40.619h-170.67v-40.619c-0.014-0.684 0.014-1.368 0.085-2.048 0.939-8.961 8.021-16.042 16.981-16.981 0.68-0.071 1.364-0.1 2.048-0.085h132.44c0.684-0.014 1.368 0.014 2.048 0.085 9.726 1.03 17.097 9.249 17.067 19.029z" fill="#ffe0b2"/><path d="m289.13 383v25.6h-68.267v-25.6c0.014-4.707 3.826-8.52 8.533-8.533h51.2c4.708 0.014 8.521 3.826 8.534 8.533z" fill="#ecf0f1"/><path d="m16.067 451.27h477.87c4.713 0 8.533 3.821 8.533 8.533v34.133c0 4.713-3.821 8.533-8.533 8.533h-477.87c-4.713 0-8.533-3.821-8.533-8.533v-34.133c-1e-3 -4.712 3.82-8.533 8.533-8.533z" fill="#4e342e"/><path d="m16.067 451.27h452.27c4.713 0 8.533 3.821 8.533 8.533v34.133c0 4.713-3.821 8.533-8.533 8.533h-452.27c-4.713 0-8.533-3.821-8.533-8.533v-34.133c-1e-3 -4.712 3.82-8.533 8.533-8.533z" fill="#795548"/></g><path d="m494.93 443.73h-145.07v-15.05c-7e-3 -7.152-2.802-14.019-7.791-19.144l156.97-86.331c2.875-1.576 4.593-4.66 4.417-7.935-0.176-3.274-2.214-6.157-5.242-7.415l-92.967-38.733 88.317-136.49c1.921-2.977 1.805-6.831-0.294-9.686-2.098-2.855-5.742-4.117-9.156-3.172l-142.78 39.666v-150.91c-1e-3 -3.508-2.148-6.658-5.413-7.941s-6.982-0.437-9.371 2.132l-106.5 114.69-173.42-90.842c-3.184-1.669-7.073-1.163-9.724 1.266s-3.494 6.258-2.11 9.576l80.792 193.92-99.175 7.625c-3.541 0.275-6.542 2.714-7.533 6.124-0.992 3.41 0.233 7.078 3.075 9.209l92.008 69.008-48.458 27.692c-2.846 1.623-4.511 4.733-4.283 8.002 0.227 3.268 2.307 6.118 5.35 7.332l112.04 44.815c-4.151 4.906-6.441 11.117-6.47 17.544v15.05h-145.07c-9.421 0.011-17.055 7.645-17.067 17.065v34.133c0.012 9.421 7.646 17.054 17.067 17.067h477.87c9.421-0.012 17.054-7.646 17.067-17.067v-34.133c-0.013-9.42-7.647-17.054-17.068-17.066zm-371.23-112.06c2.496-1.425 4.106-4.01 4.284-6.878s-1.1-5.633-3.4-7.355l-84.267-63.208 88.342-6.792c2.729-0.212 5.19-1.719 6.619-4.053s1.651-5.212 0.598-7.738l-76.25-183 158.28 82.908c3.408 1.784 7.589 1.067 10.208-1.75l96.15-103.54v140.4c0 2.667 1.247 5.18 3.369 6.794s4.878 2.143 7.447 1.431l131.94-36.65-81.658 126.19c-1.372 2.124-1.732 4.747-0.982 7.162s2.532 4.373 4.866 5.346l86.042 35.85-153.22 84.275h-23.408v-17.067c-2e-3 -1.186-0.129-2.368-0.377-3.527l83.277-51.09c2.734-1.674 4.298-4.739 4.051-7.935-0.248-3.196-2.266-5.983-5.226-7.215l-51.442-21.433 48.35-74.733c1.921-2.977 1.805-6.831-0.294-9.686-2.098-2.855-5.742-4.117-9.156-3.172l-77.717 21.592v-87.883c-1e-3 -3.508-2.148-6.658-5.413-7.941s-6.982-0.437-9.371 2.132l-44.4 47.817-82.567-43.25c-3.184-1.669-7.073-1.163-9.723 1.266-2.651 2.429-3.494 6.258-2.11 9.576l53.517 128.44-34.167 2.625c-3.541 0.275-6.542 2.714-7.533 6.124-0.992 3.41 0.233 7.078 3.075 9.209l45.575 34.175-24.05 13.742c-2.665 1.524-4.307 4.361-4.3 7.431s1.661 5.9 4.333 7.411l40.673 22.969c-0.224 1.105-0.338 2.229-0.34 3.356v17.067h-23.958l-110.07-44.026zm93.942-8.441-37.833-28.375 23.325-1.792c2.729-0.212 5.19-1.719 6.619-4.053s1.651-5.212 0.598-7.738l-48.967-117.52 67.425 35.317c3.408 1.787 7.59 1.07 10.208-1.75l34.05-36.667v77.375c0 2.667 1.247 5.18 3.369 6.794 2.123 1.614 4.878 2.143 7.447 1.431l66.875-18.575-41.692 64.433c-1.372 2.124-1.732 4.747-0.982 7.162s2.532 4.373 4.865 5.346l45.467 18.95-71.972 44.153c-1.568-0.497-3.2-0.762-4.845-0.787h-51.2c-1.655 0.024-3.297 0.292-4.873 0.796l-31.052-17.529 22.283-12.733c2.495-1.425 4.106-4.01 4.284-6.878 0.179-2.868-1.1-5.633-3.399-7.355zm12.758 60.766h51.2v17.067h-51.2zm-51.2 44.684c7e-3 -5.824 4.726-10.543 10.55-10.55h132.5c5.824 7e-3 10.543 4.726 10.55 10.55v15.05h-153.6zm-162.13 66.25v-34.133h477.87l0.017 34.133z"/></g></svg>
diff --git a/icons/game_win.svg b/icons/game_win.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fe20923864d0c5d39168eced03038b65106a596b
--- /dev/null
+++ b/icons/game_win.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.17604 0 0 .17604 7.9341 1.7716)"><path d="m101.92 496.35c-1.8555 0-3.7109-0.69532-5.1484-2.0898-2.9297-2.8438-3-7.5234-0.15234-10.453l9.1875-9.4648c2.8438-2.9297 7.5234-3 10.453-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4648c-1.4492 1.4961-3.375 2.2461-5.3047 2.2461z" fill="#ff4e61"/><path d="m201.65 133.26c-1.8516 0-3.7109-0.69531-5.1445-2.0898-2.9297-2.8438-3-7.5234-0.15625-10.449l9.1914-9.4688c2.8438-2.9297 7.5195-3 10.449-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#ff4e61"/><path d="m413.8 100.39c-1.8555 0-3.7109-0.69141-5.1484-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4688c2.8438-2.9258 7.5234-2.9961 10.453-0.15234 2.9297 2.8398 3 7.5234 0.15625 10.449l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#5c73bc"/><path d="m413.8 463.77c-1.8555 0-3.7109-0.69532-5.1484-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4688c2.8438-2.9258 7.5234-3 10.453-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m63.07 112.91c-1.8516 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4687c2.8438-2.9258 7.5234-2.9961 10.453-0.15234 2.9258 2.8438 2.9961 7.5234 0.15234 10.449l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m12.309 278.82c-1.8516 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1875-9.4688c2.8438-2.9297 7.5234-3 10.453-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4453 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#2dc471"/><path d="m216.29 278.49-23.996 12.996c-6.2226 3.3711-13.496-2.0742-12.309-9.2148l4.582-27.523c0.47266-2.8359-0.4375-5.7266-2.4375-7.7344l-19.414-19.496c-5.0352-5.0547-2.2578-13.863 4.7031-14.906l26.824-4.0156c2.7656-0.41407 5.1524-2.1992 6.3867-4.7812l12-25.043c3.1133-6.4922 12.102-6.4922 15.215 0l11.996 25.043c1.2383 2.582 3.625 4.3672 6.3867 4.7812l26.828 4.0156c6.957 1.043 9.7344 9.8516 4.6992 14.906l-19.41 19.496c-2 2.0078-2.9141 4.8984-2.4414 7.7344l4.582 27.523c1.1914 7.1406-6.082 12.586-12.305 9.2148l-23.996-12.996c-2.4727-1.3398-5.4258-1.3398-7.8945 0z" fill="#ffd02f"/><path d="m220.24 512c-4.082 0-7.3906-3.3086-7.3906-7.3906v-115.59c0-4.082 3.3086-7.3945 7.3906-7.3945s7.3906 3.3125 7.3906 7.3945v115.59c0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#5c73bc"/><path d="m220.3 357.42h-0.11328c-4.082 0-7.3945-3.3125-7.3945-7.3945s3.3086-7.3906 7.3945-7.3906h0.11328c4.082 0 7.3906 3.3086 7.3906 7.3906s-3.3086 7.3945-7.3906 7.3945z" fill="#5c73bc"/><path d="m220.3 332h-0.14838c-4.082-0.0156-7.375-3.3398-7.3594-7.4219 0.0195-4.0742 3.3242-7.3594 7.3906-7.3594h0.14848c4.082 0.0156 7.375 3.3398 7.3594 7.4219-0.0156 4.0703-3.3242 7.3594-7.3906 7.3594z" fill="#fa0"/><path d="m87.234 230.89c-1.9297 0-3.8555-0.75-5.3047-2.2422l-79.34-81.738c-2.8438-2.9297-2.7773-7.6094 0.15234-10.449 2.9297-2.8438 7.6094-2.7734 10.453 0.15235l79.344 81.738c2.8438 2.9258 2.7734 7.6094-0.15625 10.449-1.4375 1.3945-3.293 2.0898-5.1484 2.0898z" fill="#ff4e61"/><path d="m113.95 258.5c-1.8633 0-3.7266-0.69922-5.1641-2.1055-2.9219-2.8516-2.9766-7.5312-0.125-10.453l0.082-0.082c2.8516-2.918 7.5312-2.9766 10.453-0.12109 2.9219 2.8516 2.9766 7.5312 0.12109 10.453l-0.0781 0.082c-1.4492 1.4805-3.3672 2.2266-5.2891 2.2266z" fill="#fa0"/><path d="m131.4 276.48c-1.8555 0-3.7109-0.69531-5.1484-2.0898-2.9258-2.8438-2.9961-7.5234-0.15235-10.449l0.0781-0.0859c2.8476-2.9297 7.5273-2.9961 10.453-0.15235 2.9297 2.8438 3 7.5234 0.15625 10.453l-0.082 0.082c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#5c73bc"/><path d="m353.24 227.99c-1.8555 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l79.34-81.734c2.8438-2.9297 7.5234-3 10.453-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-79.344 81.734c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m326.52 255.6c-1.9141 0-3.8242-0.73828-5.2695-2.2109l-0.082-0.082c-2.8633-2.9141-2.8203-7.5938 0.0899-10.453 2.9141-2.8633 7.5938-2.8203 10.453 0.0898l0.082 0.082c2.8594 2.9141 2.8203 7.5938-0.0937 10.453-1.4375 1.4141-3.3086 2.1211-5.1797 2.1211z" fill="#ff4e61"/><path d="m309.07 273.58c-1.9297 0-3.8555-0.75-5.3047-2.2422l-0.082-0.082c-2.8398-2.9297-2.7734-7.6094 0.15625-10.453s7.6094-2.7734 10.453 0.15234l0.082 0.082c2.8398 2.9297 2.7734 7.6094-0.15625 10.453-1.4375 1.3945-3.293 2.0898-5.1484 2.0898z" fill="#fa0"/><path d="m300.65 116.69c-1.2422 0-2.5-0.3125-3.6523-0.97266-3.5469-2.0234-4.7812-6.5391-2.7578-10.082l56.863-99.652c2.0234-3.543 6.5352-4.7773 10.082-2.7539 3.5469 2.0234 4.7812 6.5391 2.7578 10.082l-56.863 99.652c-1.3633 2.3867-3.8594 3.7266-6.4297 3.7266z" fill="#62d38f"/><path d="m281.52 150.33c-1.293 0-2.5977-0.33593-3.7891-1.0469l-0.0976-0.0586c-3.5-2.0938-4.6445-6.6328-2.5469-10.137 2.0938-3.5078 6.6328-4.6445 10.137-2.5508l0.0977 0.0586c3.5039 2.0938 4.6445 6.6328 2.5508 10.137-1.3867 2.3164-3.8359 3.5976-6.3516 3.5976z" fill="#fa0"/><path d="m269.02 172.25c-1.3008 0-2.6172-0.34375-3.8086-1.0625l-0.0977-0.0586c-3.4961-2.1094-4.6211-6.6523-2.5156-10.148 2.1094-3.4961 6.6523-4.6172 10.148-2.5117l0.0976 0.0586c3.4961 2.1094 4.6211 6.6523 2.5117 10.148-1.3867 2.3008-3.832 3.5742-6.3359 3.5742z" fill="#2dc471"/><path d="m139.96 116.69c-2.5703 0-5.0664-1.3398-6.4297-3.7305l-56.863-99.648c-2.0234-3.5469-0.78906-8.0586 2.7539-10.082 3.5469-2.0234 8.0625-0.79297 10.086 2.7539l56.863 99.648c2.0234 3.5469 0.78906 8.0625-2.7539 10.086-1.1562 0.66016-2.4141 0.97266-3.6562 0.97266z" fill="#5c73bc"/><path d="m159.09 150.33c-2.5078 0-4.957-1.2773-6.3438-3.582-2.1016-3.5-0.96875-8.043 2.5273-10.145l0.10157-0.0586c3.5-2.1016 8.0391-0.97266 10.141 2.5273 2.1055 3.5 0.97266 8.0391-2.5273 10.145l-0.0977 0.0586c-1.1914 0.71484-2.5039 1.0547-3.8008 1.0547z" fill="#ff4e61"/><path d="m171.6 172.25c-2.5 0-4.9375-1.2656-6.3281-3.5625-2.1172-3.4922-1-8.0352 2.4883-10.152l0.0977-0.0586c3.4961-2.1133 8.0391-1 10.156 2.4922 2.1133 3.4922 1 8.0352-2.4922 10.152l-0.0977 0.0586c-1.1992 0.72656-2.5195 1.0703-3.8242 1.0703z" fill="#fa0"/><path d="m402.14 357.28-15.523 11.602c-4.0234 3.0117-9.6523-0.043-9.5234-5.1641l0.5039-19.75c0.0508-2.0352-0.87109-3.9648-2.4688-5.1641l-15.508-11.621c-4.0234-3.0156-2.9453-9.4726 1.8242-10.93l18.391-5.6094c1.8906-0.57812 3.3906-2.082 4-4.0156l5.9375-18.785c1.5391-4.875 7.8359-5.8125 10.652-1.5898l10.863 16.285c1.1211 1.6758 2.9688 2.6797 4.9414 2.6797l19.18 0.0117c4.9766 4e-3 7.7891 5.8828 4.7578 9.9492l-11.676 15.672c-1.2031 1.6172-1.5586 3.7383-0.94922 5.6719l5.918 18.797c1.5312 4.875-3.0273 9.4453-7.7148 7.7344l-18.078-6.5977c-1.8594-0.67969-3.9258-0.37109-5.5273 0.82422z" fill="#ffd02f"/><path d="m261.51 512c-4.082 0-7.3906-3.3086-7.3906-7.3906 0-57.23 22.832-95.922 41.984-118.3 20.828-24.332 41.613-35.023 42.488-35.469 3.6406-1.8477 8.0898-0.39063 9.9336 3.2539 1.8438 3.6367 0.39453 8.0781-3.2422 9.9297-0.3125 0.16016-19.5 10.164-38.367 32.395-25.227 29.719-38.016 66.121-38.016 108.2 0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#ff4e61"/><path d="m102.86 397.35 11.766 15.605c3.0547 4.0469 9.2852 2.7305 10.547-2.2266l4.8633-19.113c0.5-1.9648 1.9102-3.5547 3.7695-4.2461l18.039-6.707c4.6797-1.7383 5.3906-8.25 1.207-11.016l-16.141-10.672c-1.6602-1.1016-2.6914-2.9726-2.7578-5.0039l-0.61719-19.75c-0.15625-5.1211-5.9492-7.832-9.7969-4.5859l-14.84 12.516c-1.5312 1.2891-3.5781 1.7227-5.4726 1.1562l-18.422-5.5c-4.7773-1.4258-9.0703 3.4102-7.2617 8.1836l6.9688 18.41c0.71875 1.8945 0.48438 4.0352-0.625 5.7188l-10.77 16.348c-2.793 4.2422 0.34375 9.9375 5.3125 9.6445l19.145-1.1406c1.9727-0.11719 3.875 0.77343 5.0859 2.3789z" fill="#ffd02f"/><path d="m179.02 512c-4.082 0-7.3906-3.3086-7.3906-7.3906 0-30.059-6.6797-57.559-19.852-81.734-1.9531-3.5859-0.62891-8.0742 2.957-10.027 3.5859-1.9531 8.0742-0.62891 10.027 2.9531 14.363 26.375 21.648 56.254 21.648 88.809 0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#fa0"/><path d="m268.93 55.898c0-11.285-8.8828-20.434-19.836-20.434-10.957 0-19.836 9.1484-19.836 20.434 0 11.285 8.8789 20.438 19.836 20.438 10.953 0 19.836-9.1523 19.836-20.438z" fill="#ffd02f"/><path d="m373.08 446.81c0-11.285-8.8789-20.434-19.832-20.434-10.957 0-19.836 9.1484-19.836 20.434s8.8789 20.434 19.836 20.434c10.953 0 19.832-9.1484 19.832-20.434z" fill="#5c73bc"/><path d="m44.129 450.86c0-9.0508-7.1211-16.387-15.91-16.387-8.7852 0-15.906 7.3359-15.906 16.387 0 9.0547 7.1211 16.391 15.906 16.391 8.7891 0 15.91-7.3359 15.91-16.391z" fill="#62d38f"/><path d="m88.172 288.35c0-9.0508-7.1211-16.387-15.91-16.387-8.7852 0-15.906 7.3359-15.906 16.387s7.1211 16.391 15.906 16.391c8.7891 0 15.91-7.3398 15.91-16.391z" fill="#5c73bc"/><g fill="#ff4e61"><path d="m210.84 16.391c0-9.0547-7.1211-16.391-15.906-16.391-8.7891 0-15.91 7.3359-15.91 16.391 0 9.0508 7.1211 16.387 15.91 16.387 8.7852 0 15.906-7.3359 15.906-16.387z"/><path d="m365.23 152.88c0-9.0508-7.125-16.391-15.91-16.391-8.7852 0-15.91 7.3398-15.91 16.391s7.125 16.387 15.91 16.387c8.7852 0 15.91-7.3359 15.91-16.387z"/><path d="m139.96 32.746c-1.8555 0-3.7109-0.69141-5.1484-2.0898-2.9297-2.8438-3-7.5195-0.15625-10.449l9.1914-9.4688c2.8438-2.9297 7.5234-3 10.449-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-9.1875 9.4688c-1.4492 1.4922-3.3789 2.2422-5.3047 2.2422z"/></g></g></svg>
diff --git a/icons/size_10x10.svg b/icons/size_10x10.svg
new file mode 100644
index 0000000000000000000000000000000000000000..538fd9d948716684c7c011b6cdd21c26237a7908
--- /dev/null
+++ b/icons/size_10x10.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="0" fill="#c5ffc5" stroke="#000" stroke-width="2"/>
+  <path d="m32.035 62.07v35.93h35.93v-35.93zm31.808 31.808h-12.37v-12.37h12.37zm-0.0014-15.903h-12.369v-12.37h12.37zm-28.274-12.37h12.37v12.37h-12.37zm0 15.905h12.37v12.37h-12.37z" stroke-width="1.767"/><g transform="translate(1.9e-4,-4.3517)" fill="#00d600" stroke="#009100" aria-label="10x10"><path d="m15.292 8.8519v21.126h-5.8377v-13.843q-1.4169 1.0769-2.7488 1.7428-1.3177 0.66595-3.3156 1.2752v-4.7325q2.9472-0.94934 4.5767-2.2812 1.6295-1.3319 2.5505-3.2873z"/><path d="m21.569 19.507q0-5.9227 2.1254-8.289 2.1396-2.3663 6.5037-2.3663 2.097 0 3.4431 0.52426 1.3461 0.51009 2.1962 1.3461 0.85015 0.82182 1.3319 1.7428 0.49592 0.90683 0.79348 2.1254 0.58094 2.3238 0.58094 4.8459 0 5.6535-1.9128 8.2748t-6.5887 2.6213q-2.6213 0-4.2366-0.83598t-2.6496-2.4513q-0.75097-1.1477-1.176-3.1314-0.41091-1.9979-0.41091-4.4066zm5.7244 0.01417q0 3.9674 0.69429 5.4268 0.70846 1.4453 2.0404 1.4453 0.87849 0 1.5161-0.60928 0.65178-0.62345 0.94934-1.9554 0.31172-1.3319 0.31172-4.1516 0-4.1374-0.70846-5.5543-0.69429-1.4311-2.097-1.4311-1.4311 0-2.0687 1.4594-0.63762 1.4453-0.63762 5.3701z"/><path d="m40.174 14.93h6.8437l2.3946 4.1941 2.7772-4.1941h6.362l-5.1293 7.1696 5.4977 7.8781h-6.7304l-2.7772-4.8459-3.2731 4.8459h-6.2486l5.4693-7.8781z"/><path d="m73.358 8.8519v21.126h-5.8377v-13.843q-1.4169 1.0769-2.7488 1.7428-1.3177 0.66595-3.3156 1.2752v-4.7325q2.9472-0.94934 4.5767-2.2812 1.6295-1.3319 2.5505-3.2873z"/><path d="m79.635 19.507q0-5.9227 2.1254-8.289 2.1396-2.3663 6.5037-2.3663 2.097 0 3.4431 0.52426 1.3461 0.51009 2.1962 1.3461 0.85016 0.82182 1.3319 1.7428 0.49592 0.90683 0.79348 2.1254 0.58094 2.3238 0.58094 4.8459 0 5.6535-1.9128 8.2748t-6.5887 2.6213q-2.6213 0-4.2366-0.83598t-2.6496-2.4513q-0.75097-1.1477-1.176-3.1314-0.41091-1.9979-0.41091-4.4066zm5.7244 0.01417q0 3.9674 0.69429 5.4268 0.70846 1.4453 2.0404 1.4453 0.87849 0 1.5161-0.60928 0.65178-0.62345 0.94934-1.9554 0.31172-1.3319 0.31172-4.1516 0-4.1374-0.70846-5.5543-0.69429-1.4311-2.097-1.4311-1.4311 0-2.0687 1.4594-0.63762 1.4453-0.63762 5.3701z"/></g></svg>
diff --git a/icons/size_15x15.svg b/icons/size_15x15.svg
new file mode 100644
index 0000000000000000000000000000000000000000..51282ffebc8f9522da8f5ac043bafef6bd437d9c
--- /dev/null
+++ b/icons/size_15x15.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="0" fill="#ffdfba" stroke="#000" stroke-width="2"/>
+  <path d="m24.111 46.113v51.887h51.778v-51.887zm32.165 18.883v13.733h-12.836v-13.733zm-12.836-3.4332v-12.016h12.836v12.016zm28.731 32.615h-12.465v-12.016h12.465zm0-15.448h-12.465v-13.733h12.465zm-15.897 3.4332v12.016h-12.836v-12.016zm15.897-20.6h-12.465v-12.016h12.465zm-44.631-12.016h12.465v12.016h-12.465zm0 15.448h12.465v13.733h-12.465zm0 17.167h12.465v12.016h-12.465z" stroke-width="1.7167"/><g transform="matrix(1.0992 0 0 1.0992 -4.9603 -7.468)" fill="#ff9924" stroke="#9f5300" stroke-width=".90975" aria-label="15x15"><path d="m17.799 10.888v19.585h-5.4118v-12.833q-1.3135 0.99829-2.5483 1.6157-1.2216 0.61736-3.0737 1.1822v-4.3872q2.7322-0.88007 4.2427-2.1148 1.5106-1.2347 2.3644-3.0474z"/><path d="m25.785 11.216h12.702v4.269h-8.6037l-0.45974 2.8898q0.89321-0.42033 1.7601-0.6305 0.88007-0.21017 1.7339-0.21017 2.8898 0 4.6893 1.747 1.7996 1.747 1.7996 4.4004 0 1.8652-0.93261 3.586-0.91948 1.7207-2.6271 2.6271-1.6945 0.90634-4.3478 0.90634-1.9046 0-3.2707-0.35466-1.3529-0.36779-2.3118-1.0771-0.94575-0.72245-1.5368-1.6288-0.59109-0.90634-0.98516-2.2593l5.4118-0.59109q0.19703 1.3004 0.91948 1.9834 0.72245 0.6699 1.7207 0.6699 1.1165 0 1.839-0.84066 0.73558-0.8538 0.73558-2.5351 0-1.7207-0.73558-2.522-0.73558-0.80126-1.9572-0.80126-0.77499 0-1.4974 0.38093-0.53855 0.27584-1.1822 0.99829l-4.558-0.65677z"/><path d="m40.864 16.523h6.3444l2.2199 3.8881 2.5745-3.8881h5.8978l-4.755 6.6465 5.0965 7.3033h-6.2393l-2.5745-4.4923-3.0343 4.4923h-5.7927l5.0703-7.3033z"/><path d="m71.627 10.888v19.585h-5.4118v-12.833q-1.3135 0.99829-2.5483 1.6157-1.2216 0.61736-3.0737 1.1822v-4.3872q2.7322-0.88007 4.2427-2.1148 1.5106-1.2347 2.3644-3.0474z"/><path d="m79.614 11.216h12.702v4.269h-8.6037l-0.45974 2.8898q0.89321-0.42033 1.7601-0.6305 0.88007-0.21017 1.7339-0.21017 2.8898 0 4.6893 1.747t1.7995 4.4004q0 1.8652-0.93261 3.586-0.91948 1.7207-2.6271 2.6271-1.6945 0.90634-4.3478 0.90634-1.9046 0-3.2707-0.35466-1.3529-0.36779-2.3118-1.0771-0.94575-0.72245-1.5368-1.6288-0.59109-0.90634-0.98516-2.2593l5.4118-0.59109q0.19703 1.3004 0.91948 1.9834 0.72245 0.6699 1.7207 0.6699 1.1165 0 1.839-0.84066 0.73558-0.8538 0.73558-2.5351 0-1.7207-0.73558-2.522-0.73558-0.80126-1.9572-0.80126-0.77499 0-1.4974 0.38093-0.53855 0.27584-1.1822 0.99829l-4.558-0.65677z"/></g></svg>
diff --git a/icons/size_20x20.svg b/icons/size_20x20.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4734ae11074e3114602c5eb40d58f24961ac2cd7
--- /dev/null
+++ b/icons/size_20x20.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="0" fill="#ffc4c4" stroke="#000" stroke-width="2"/><path d="m15.971 30.405v67.595h68.058v-67.595zm32.033 19.075v12.498h-12.96v-12.498zm-12.96-3.4681v-12.138h12.96v12.138zm44.53 47.537h-12.138v-12.138h12.138zm0-15.965h-12.138v-12.138h12.138zm-15.965 0h-12.138v-12.138h12.138zm0 3.826v12.138h-12.138v-12.138zm15.965-19.431h-12.138v-12.498h12.138zm-15.965 0h-12.138v-12.498h12.138zm-15.606 3.4681v12.138h-12.96v-12.138zm0 15.965v12.138h-12.96v-12.138zm31.571-47.538v12.138h-12.138v-12.138zm-15.965 12.138h-12.138v-12.138h12.138zm-44.172-12.138h12.138v12.138h-12.138zm0 15.606h12.138v12.498h-12.138zm0 15.968h12.138v12.138h-12.138zm0 15.965h12.138v12.138h-12.138z" stroke-width="1.734"/><g transform="matrix(1.0243 0 0 1.0243 -.37355 -10.97)" fill="#ff1e1e" stroke="#8e0000" stroke-width=".97628" aria-label="20x20"><path d="m19.449 35.993h-17.121q0.29423-2.536 1.7794-4.7637 1.4992-2.2417 5.6043-5.2821 2.5079-1.8634 3.2085-2.8302 0.70054-0.96674 0.70054-1.8354 0-0.93872-0.70054-1.5972-0.68653-0.67252-1.7373-0.67252-1.0928 0-1.7934 0.68653-0.68653 0.68653-0.92471 2.4239l-5.7164-0.46236q0.33626-2.4099 1.2329-3.7549 0.89669-1.359 2.5219-2.0736 1.6393-0.72856 4.5255-0.72856 3.0123 0 4.6796 0.68653 1.6813 0.68653 2.634 2.1156 0.96674 1.4151 0.96674 3.1804 0 1.8774-1.1069 3.5868-1.0928 1.7093-3.9931 3.7549-1.7233 1.1909-2.3118 1.6673-0.57444 0.47637-1.359 1.247h8.9109z"/><path d="m21.887 25.639q0-5.8565 2.1016-8.1963 2.1156-2.3398 6.431-2.3398 2.0736 0 3.4046 0.5184 1.331 0.50439 2.1717 1.331 0.84065 0.81263 1.317 1.7233 0.49038 0.89669 0.7846 2.1016 0.57444 2.2978 0.57444 4.7917 0 5.5903-1.8915 8.1823t-6.515 2.592q-2.592 0-4.1892-0.82664t-2.62-2.4239q-0.74257-1.1349-1.1629-3.0964-0.40631-1.9755-0.40631-4.3574zm5.6604 0.01401q0 3.923 0.68653 5.3661 0.70054 1.4291 2.0176 1.4291 0.86867 0 1.4992-0.60246 0.6445-0.61648 0.93872-1.9335 0.30824-1.317 0.30824-4.1052 0-4.0912-0.70054-5.4922-0.68653-1.4151-2.0736-1.4151-1.4151 0-2.0456 1.4431-0.63049 1.4291-0.63049 5.3101z"/><path d="m40.284 21.114h6.7672l2.3678 4.1472 2.7461-4.1472h6.2908l-5.0719 7.0895 5.4362 7.79h-6.6551l-2.7461-4.7917-3.2365 4.7917h-6.1788l5.4082-7.79z"/><path d="m76.866 35.993h-17.121q0.29423-2.536 1.7794-4.7637 1.4992-2.2417 5.6043-5.2821 2.5079-1.8634 3.2085-2.8302 0.70054-0.96674 0.70054-1.8354 0-0.93872-0.70054-1.5972-0.68653-0.67252-1.7373-0.67252-1.0928 0-1.7934 0.68653-0.68653 0.68653-0.92471 2.4239l-5.7164-0.46236q0.33626-2.4099 1.233-3.7549 0.89669-1.359 2.5219-2.0736 1.6393-0.72856 4.5255-0.72856 3.0123 0 4.6796 0.68653 1.6813 0.68653 2.634 2.1156 0.96674 1.4151 0.96674 3.1804 0 1.8774-1.1069 3.5868-1.0928 1.7093-3.9931 3.7549-1.7233 1.1909-2.3118 1.6673-0.57444 0.47637-1.359 1.247h8.9109z"/><path d="m79.304 25.639q0-5.8565 2.1016-8.1963 2.1156-2.3398 6.431-2.3398 2.0736 0 3.4046 0.5184 1.331 0.50439 2.1717 1.331 0.84065 0.81263 1.317 1.7233 0.49038 0.89669 0.7846 2.1016 0.57444 2.2978 0.57444 4.7917 0 5.5903-1.8915 8.1823t-6.515 2.592q-2.592 0-4.1892-0.82664t-2.62-2.4239q-0.74257-1.1349-1.1629-3.0964-0.40631-1.9755-0.40631-4.3574zm5.6604 0.01401q0 3.923 0.68653 5.3661 0.70054 1.4291 2.0176 1.4291 0.86867 0 1.4992-0.60246 0.6445-0.61648 0.93872-1.9335 0.30824-1.317 0.30824-4.1052 0-4.0912-0.70054-5.4922-0.68653-1.4151-2.0736-1.4151-1.4151 0-2.0456 1.4431-0.63049 1.4291-0.63049 5.3101z"/></g>
+  </svg>
diff --git a/icons/skins/default/0.svg b/icons/skins/default/0.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fed760a0ffab7c114180e079d0999d5464a914f1
--- /dev/null
+++ b/icons/skins/default/0.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><text x="29.053539" y="43.304588" fill="#000000" font-family="sans-serif" font-size="40px" letter-spacing="0px" word-spacing="0px" style="line-height:1.25" xml:space="preserve"><tspan/></text></svg>
diff --git a/icons/skins/default/1.svg b/icons/skins/default/1.svg
new file mode 100644
index 0000000000000000000000000000000000000000..da4bfe1fc437d22bd1538d6e2806078c4189790a
--- /dev/null
+++ b/icons/skins/default/1.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/>
+<g stroke-width="3.1763" aria-label="1"><path d="m66.056 3.7513v92.497h-25.559v-60.61q-6.2037 4.7148-12.035 7.6306-5.7695 2.9157-14.517 5.5833v-20.72q12.904-4.1565 20.038-9.988t11.167-14.393z"/></g></svg>
diff --git a/icons/skins/default/2.svg b/icons/skins/default/2.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7f1a27e8b0270ba5493499bb3f450336d7dad014
--- /dev/null
+++ b/icons/skins/default/2.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g stroke-width="3.1763" aria-label="2"><path d="m87.905 96.249h-75.809q1.3028-11.229 7.8787-21.093 6.638-9.9259 24.815-23.388 11.105-8.2509 14.206-12.531 3.1019-4.2806 3.1019-8.1269 0-4.1565-3.1019-7.0722-3.0398-2.9778-7.6926-2.9778-4.8389 0-7.9408 3.0398-3.0398 3.0398-4.0944 10.732l-25.311-2.0472q1.4889-10.67 5.4593-16.626 3.9704-6.0176 11.167-9.1815 7.2583-3.2259 20.038-3.2259 13.338 0 20.72 3.0398 7.4445 3.0398 11.663 9.3676 4.2806 6.2657 4.2806 14.082 0 8.313-4.9009 15.882-4.8389 7.5685-17.681 16.626-7.6306 5.2732-10.236 7.3824-2.5435 2.1093-6.0176 5.5213h39.456z"/></g></svg>
diff --git a/icons/skins/default/3.svg b/icons/skins/default/3.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e48bb58e31eaa99af11ab54f81aea35189a0d4d4
--- /dev/null
+++ b/icons/skins/default/3.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g stroke-width="3.1763" aria-label="3"><path d="m37.686 30.831-23.884-4.2806q2.9778-11.415 11.415-17.494 8.4991-6.0796 24.008-6.0796 17.805 0 25.745 6.638 7.9408 6.638 7.9408 16.688 0 5.8935-3.2259 10.67-3.2259 4.7769-9.7398 8.375 5.2732 1.3028 8.0648 3.0398 4.5287 2.7917 7.0102 7.3824 2.5435 4.5287 2.5435 10.856 0 7.9408-4.1565 15.261-4.1565 7.2583-11.973 11.229-7.8167 3.9083-20.534 3.9083-12.407 0-19.604-2.9157-7.1343-2.9157-11.787-8.4991-4.5907-5.6454-7.0722-14.144l25.249-3.35q1.4889 7.6306 4.5907 10.608 3.1639 2.9157 8.0028 2.9157 5.087 0 8.437-3.7222 3.412-3.7222 3.412-9.9259 0-6.3278-3.288-9.8019-3.2259-3.4741-8.8093-3.4741-2.9778 0-8.1889 1.4889l1.3028-18.053q2.1093 0.31018 3.288 0.31018 4.963 0 8.2509-3.1639 3.35-3.1639 3.35-7.5065 0-4.1565-2.4815-6.638t-6.8241-2.4815q-4.4667 0-7.2583 2.7296-2.7917 2.6676-3.7843 9.4296z"/></g></svg>
diff --git a/icons/skins/default/4.svg b/icons/skins/default/4.svg
new file mode 100644
index 0000000000000000000000000000000000000000..609d4409e1e78aa0f20618fc7a0a0b37fddd07bb
--- /dev/null
+++ b/icons/skins/default/4.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g stroke-width="3.1763" aria-label="4"><path d="m56.297 79.25h-46.032v-20.782l46.032-54.717h22.023v55.895h11.415v19.604h-11.415v16.998h-22.023zm0-19.604v-28.599l-24.319 28.599z"/></g></svg>
diff --git a/icons/skins/default/5.svg b/icons/skins/default/5.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3e4ce20f882889cce3fd54a6440da0189ae248bc
--- /dev/null
+++ b/icons/skins/default/5.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g stroke-width="3.1763" aria-label="5"><path d="m23.479 3.7513h59.99v20.162h-40.634l-2.1713 13.648q4.2185-1.9852 8.313-2.9778 4.1565-0.99259 8.1889-0.99259 13.648 0 22.147 8.2509 8.4991 8.2509 8.4991 20.782 0 8.8093-4.4046 16.936-4.3426 8.1269-12.407 12.407-8.0028 4.2806-20.534 4.2806-8.9954 0-15.447-1.675-6.3898-1.737-10.919-5.087-4.4667-3.412-7.2583-7.6926-2.7917-4.2806-4.6528-10.67l25.559-2.7917q0.93056 6.1417 4.3426 9.3676 3.412 3.1639 8.1269 3.1639 5.2732 0 8.6852-3.9704 3.4741-4.0324 3.4741-11.973 0-8.1269-3.4741-11.911-3.4741-3.7843-9.2435-3.7843-3.6602 0-7.0722 1.7991-2.5435 1.3028-5.5833 4.7148l-21.527-3.1019z"/></g></svg>
diff --git a/icons/skins/default/6.svg b/icons/skins/default/6.svg
new file mode 100644
index 0000000000000000000000000000000000000000..684ec0f338496c51fc361f1d145d9c17bea7cb4f
--- /dev/null
+++ b/icons/skins/default/6.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g stroke-width="3.1763" aria-label="6"><path d="m85.547 24.999-25.125 3.1019q-0.99259-5.2732-3.35-7.4445-2.2954-2.1713-5.7074-2.1713-6.1417 0-9.5537 6.2037-2.4815 4.4667-3.6602 19.107 4.5287-4.5907 9.3056-6.762 4.7769-2.2333 11.043-2.2333 12.159 0 20.534 8.6852 8.437 8.6852 8.437 22.023 0 8.9954-4.2806 16.44-4.2185 7.4445-11.787 11.291-7.5065 3.7843-18.859 3.7843-13.648 0-21.899-4.6528-8.2509-4.6528-13.214-14.827-4.9009-10.236-4.9009-27.048 0-24.629 10.36-36.044 10.36-11.477 28.723-11.477 10.856 0 17.122 2.5435 6.3278 2.4815 10.484 7.3204 4.1565 4.8389 6.3278 12.159zm-46.528 40.51q0 7.3824 3.7222 11.601 3.7222 4.1565 9.1195 4.1565 4.963 0 8.313-3.7843t3.35-11.291q0-7.6926-3.4741-11.725t-8.6232-4.0324q-5.2732 0-8.8713 3.9083-3.5361 3.9083-3.5361 11.167z"/></g></svg>
diff --git a/icons/skins/default/7.svg b/icons/skins/default/7.svg
new file mode 100644
index 0000000000000000000000000000000000000000..40d418cdf8746dc499e285f9ac1472ea15c7c4c3
--- /dev/null
+++ b/icons/skins/default/7.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g stroke-width="3.1763" aria-label="7"><path d="m13.119 4.5268h73.762v17.06q-9.6158 8.6852-16.068 18.797-7.8167 12.283-12.345 27.358-3.5982 11.725-4.8389 27.731h-25.187q2.9778-22.271 9.3676-37.346t20.224-32.259h-44.915z"/></g></svg>
diff --git a/icons/skins/default/8.svg b/icons/skins/default/8.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c444e92a5a6a2218cb1dfd24f2815e73319d84e9
--- /dev/null
+++ b/icons/skins/default/8.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g stroke-width="3.1763" aria-label="8"><path d="m28.039 46.588q-5.9556-3.1639-8.6852-7.0722-3.7222-5.3352-3.7222-12.283 0-11.415 10.732-18.673 8.375-5.5833 22.147-5.5833 18.239 0 26.924 6.9482 8.7472 6.9482 8.7472 17.494 0 6.1417-3.4741 11.477-2.6056 3.9704-8.1889 7.6926 7.3824 3.5361 10.981 9.3676 3.6602 5.8315 3.6602 12.904 0 6.8241-3.1639 12.78-3.1019 5.8935-7.6926 9.1195-4.5287 3.2259-11.353 4.7148-6.762 1.5509-14.455 1.5509-14.455 0-22.085-3.412-7.6306-3.412-11.601-10.05t-3.9704-14.827q0-8.0028 3.7222-13.524 3.7222-5.5833 11.477-8.6232zm11.353-17.867q0 4.7148 2.9157 7.6306 2.9778 2.8537 7.8787 2.8537 4.3426 0 7.1343-2.8537t2.7917-7.3824q0-4.7148-2.9157-7.6306-2.9157-2.9778-7.4445-2.9778-4.5907 0-7.5065 2.9157-2.8537 2.8537-2.8537 7.4445zm-1.3648 39.145q0 6.0176 3.6602 9.8639 3.6602 3.7843 8.375 3.7843 4.5287 0 8.1269-3.8463 3.5982-3.9083 3.5982-9.8639 0-6.0176-3.6602-9.8639-3.5982-3.8463-8.375-3.8463-4.7148 0-8.2509 3.7222-3.4741 3.7222-3.4741 10.05z"/></g></svg>
diff --git a/icons/skins/default/mine.svg b/icons/skins/default/mine.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4c2a1f5dee28181ddc9d369508ca3bbe6f1ebc46
--- /dev/null
+++ b/icons/skins/default/mine.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g transform="matrix(1.0346 0 0 1.0346 -1.7311 -1.7312)" fill="#eb0404" stroke="#870000" stroke-width="1.9331"><path d="m92.148 55.869c-0.626-0.939-1.482-1.519-2.568-1.739l-6.792-1.242c0.368-5.669-0.727-11.035-3.286-16.096l5.853-4.224c0.939-0.663 1.491-1.574 1.657-2.733 0.202-1.086-0.037-2.071-0.718-2.954l-0.469-0.718c-0.626-0.883-1.537-1.427-2.733-1.629-1.031-0.166-2.016 0.092-2.954 0.773l-5.632 4.059c-3.81-4.215-8.347-7.206-13.611-8.973l1.27-7.731c0.202-1.104-0.037-2.126-0.718-3.065-0.626-0.883-1.482-1.427-2.568-1.629l-0.856-0.166c-1.104-0.147-2.126 0.092-3.065 0.718-0.884 0.681-1.427 1.565-1.629 2.65l-1.16 7.427c-2.503-0.221-4.951-0.175-7.344 0.138-1.362 0.055-2.641 0.294-3.838 0.718-0.626 0.147-1.224 0.331-1.795 0.552l-3.451-7.51c-0.46-0.994-1.215-1.693-2.264-2.098-1.031-0.423-2.043-0.405-3.037 0.055l-0.773 0.414c-0.994 0.405-1.73 1.16-2.209 2.264-0.368 1.031-0.313 2.043 0.166 3.037l3.506 7.648c-0.202 0.11-0.405 0.249-0.607 0.414-5.264 3.681-9.019 8.31-11.265 13.888l-6.958-1.546c-1.086-0.276-2.098-0.074-3.037 0.607-0.994 0.534-1.592 1.344-1.795 2.43l-0.246 0.772c-0.203 1.104-0.018 2.172 0.552 3.203 0.626 0.883 1.491 1.463 2.595 1.739l6.626 1.546c-0.736 5.835 0.101 11.329 2.512 16.483l-5.411 3.672c-0.939 0.626-1.537 1.491-1.795 2.595-0.147 1.086 0.092 2.098 0.718 3.037l0.469 0.635c0.626 0.939 1.454 1.537 2.485 1.795 1.16 0.147 2.209-0.092 3.147-0.718l5.135-3.424c3.7 4.583 8.255 7.887 13.667 9.912l-1.242 6.323c-0.202 1.104 9e-3 2.154 0.635 3.147 0.626 0.883 1.482 1.427 2.568 1.629l0.801 0.166c1.086 0.258 2.098 0.101 3.037-0.469 0.939-0.681 1.509-1.574 1.712-2.678l1.242-6.074c6 0.626 11.651-0.285 16.952-2.733l4.003 6.074c0.626 0.939 1.509 1.518 2.651 1.739 1.049 0.258 2.043 0.074 2.982-0.552l0.69-0.387c0.939-0.626 1.537-1.518 1.795-2.678 0.203-1.086-9e-3 -2.098-0.635-3.037l-3.81-5.936c4.583-3.7 7.841-8.255 9.774-13.667l6.875 1.242c1.086 0.202 2.098-9e-3 3.037-0.635 0.883-0.607 1.427-1.463 1.629-2.568l0.166-0.773c0.202-1.103-0.01-2.143-0.636-3.119zm-50.085-15.013c-0.824 1.929-2.217 3.297-4.178 4.102-1.962 0.806-3.92 0.815-5.876 0.028-1.936-0.778-3.299-2.13-4.09-4.056s-0.774-3.853 0.05-5.782c0.844-1.92 2.247-3.284 4.209-4.089 1.962-0.806 3.91-0.819 5.846-0.041 1.956 0.787 3.329 2.144 4.12 4.069 0.79 1.925 0.763 3.848-0.081 5.769z" fill="#eb0404" stroke="#870000" stroke-width="1.9331"/></g></svg>
diff --git a/icons/skins/default/unknown.svg b/icons/skins/default/unknown.svg
new file mode 100644
index 0000000000000000000000000000000000000000..293eb2947da5a7a6d58f6e8270f11908f631bc59
--- /dev/null
+++ b/icons/skins/default/unknown.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect x="3.5527e-15" y="-7.1054e-15" width="100" height="100" fill="#696969" fill-opacity=".28943" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.1508"/></svg>
diff --git a/icons/skins/empty.svg b/icons/skins/empty.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6b7cca72d5b5fe5d116270f4c6d4aa081402fbee
--- /dev/null
+++ b/icons/skins/empty.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/></svg>
diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart
new file mode 100644
index 0000000000000000000000000000000000000000..e2a6c0dad2cb19c305589d93875fd5bc959bdeae
--- /dev/null
+++ b/lib/entities/cell.dart
@@ -0,0 +1,53 @@
+import 'package:flutter/material.dart';
+
+import '../provider/data.dart';
+import '../utils/board_utils.dart';
+
+class Cell {
+  bool isMined = false;
+  bool isExplored = false;
+  bool isMarked = false;
+  int minesCountAround = 0;
+
+  Cell(
+    @required this.isMined,
+  );
+
+  Container widget(Data myProvider, int row, int col) {
+    String imageAsset = 'assets/skins/' + myProvider.skin + '_unknown.png';
+
+    Color backgroundColor = this.getBackgroundColor();
+
+    if (this.isExplored) {
+      if (this.isMined) {
+        imageAsset = 'assets/skins/' + myProvider.skin + '_mine.png';
+      } else {
+        imageAsset = 'assets/skins/' + myProvider.skin + '_' + this.minesCountAround.toString() + '.png';
+      }
+    }
+
+    return Container(
+      decoration: BoxDecoration(
+        color: backgroundColor,
+        border: Border.all(
+          color: Colors.grey,
+          width: 1,
+        ),
+      ),
+      child: GestureDetector(
+        child: Image(
+          image: AssetImage(imageAsset),
+          fit: BoxFit.fill,
+        ),
+        onTap: () {
+          BoardUtils.walkOnCell(myProvider, row, col);
+          BoardUtils.checkBoardIsSolved(myProvider);
+        },
+      ),
+    );
+  }
+
+  Color getBackgroundColor() {
+    return Colors.white;
+  }
+}
diff --git a/lib/layout/board.dart b/lib/layout/board.dart
new file mode 100644
index 0000000000000000000000000000000000000000..b5e1d1263d986559bb3ead5b1defaf79c9498da4
--- /dev/null
+++ b/lib/layout/board.dart
@@ -0,0 +1,44 @@
+import 'package:flutter/material.dart';
+
+import '../provider/data.dart';
+
+class Board {
+
+  static Container buildGameBoard(Data myProvider) {
+    return Container(
+      margin: EdgeInsets.all(2),
+      padding: EdgeInsets.all(2),
+      decoration: BoxDecoration(
+        color: Colors.black,
+        borderRadius: BorderRadius.circular(2),
+        border: Border.all(
+          color: Colors.black,
+          width: 2,
+        ),
+      ),
+      child: buildGameTileset(myProvider),
+    );
+  }
+
+  static Table buildGameTileset(Data myProvider) {
+    List cells = myProvider.cells;
+
+    return Table(
+      defaultColumnWidth: IntrinsicColumnWidth(),
+      children: [
+        for (var row = 0; row < myProvider.sizeVertical; row++)
+          TableRow(children: [
+            for (var col = 0; col < myProvider.sizeHorizontal; col++)
+              Column(children: [
+                cells[row][col].widget(
+                  myProvider,
+                  row,
+                  col
+                )
+              ]),
+          ]),
+      ]
+    );
+  }
+
+}
diff --git a/lib/layout/game.dart b/lib/layout/game.dart
new file mode 100644
index 0000000000000000000000000000000000000000..8333c64de56f4bea171098b41fc89afde2d810ce
--- /dev/null
+++ b/lib/layout/game.dart
@@ -0,0 +1,66 @@
+import 'package:flutter/material.dart';
+
+import '../layout/board.dart';
+import '../provider/data.dart';
+import '../utils/game_utils.dart';
+
+class Game {
+
+  static Container buildGameWidget(Data myProvider) {
+    return Container(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          Board.buildGameBoard(myProvider),
+          SizedBox(height: 2),
+          (myProvider.gameWin || myProvider.gameFail) ? Game.buildEndGameMessage(myProvider) : SizedBox(height: 2),
+        ],
+      ),
+    );
+  }
+
+  static FlatButton buildRestartGameButton(Data myProvider) {
+    return FlatButton(
+      child: Container(
+        child: Image(
+          image: AssetImage('assets/icons/button_back.png'),
+          fit: BoxFit.fill,
+        ),
+      ),
+      onPressed: () => GameUtils.resetGame(myProvider),
+    );
+  }
+
+  static Container buildEndGameMessage(Data myProvider) {
+    Image decorationImage = Image(
+      image: AssetImage(
+        myProvider.gameWin
+          ? 'assets/icons/game_win.png'
+          : myProvider.gameFail
+            ? 'assets/icons/game_fail.png'
+            : ''
+      ),
+      fit: BoxFit.fill,
+    );
+
+    return Container(
+      margin: EdgeInsets.all(2),
+      padding: EdgeInsets.all(2),
+
+      child: Table(
+        defaultColumnWidth: IntrinsicColumnWidth(),
+        children: [
+          TableRow(
+            children: [
+              Column(children: [ decorationImage ]),
+              Column(children: [ buildRestartGameButton(myProvider) ]),
+              Column(children: [ decorationImage ]),
+            ],
+          ),
+        ]
+      )
+    );
+  }
+
+}
diff --git a/lib/layout/parameters.dart b/lib/layout/parameters.dart
new file mode 100644
index 0000000000000000000000000000000000000000..c15d8a1c89663a75cbcd32e19047484eed3632c5
--- /dev/null
+++ b/lib/layout/parameters.dart
@@ -0,0 +1,119 @@
+import 'package:flutter/material.dart';
+
+import '../provider/data.dart';
+import '../utils/game_utils.dart';
+
+class Parameters {
+
+  static Container buildParametersSelector(Data myProvider) {
+    return Container(
+      padding: EdgeInsets.all(2),
+      margin: EdgeInsets.all(2),
+      child: Column(
+        mainAxisSize: MainAxisSize.min,
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: [
+          Parameters.buildParameterSelector(myProvider, 'difficulty'),
+          SizedBox(height: 5),
+          Parameters.buildParameterSelector(myProvider, 'size'),
+          SizedBox(height: 5),
+
+          Parameters.buildStartGameButton(myProvider),
+        ],
+      ),
+    );
+  }
+
+  static Container buildStartGameButton(Data myProvider) {
+    return Container(
+      margin: EdgeInsets.all(2),
+      padding: EdgeInsets.all(2),
+
+      child: Table(
+        defaultColumnWidth: IntrinsicColumnWidth(),
+        children: [
+          TableRow(
+            children: [
+              Column(
+                children: [
+                  Image(
+                    image: AssetImage('assets/skins/empty.png'),
+                    fit: BoxFit.fill,
+                  ),
+                ]
+              ),
+              Column(
+                children: [
+                  FlatButton(
+                    child: Container(
+                      child: Image(
+                        image: AssetImage('assets/icons/button_start.png'),
+                        fit: BoxFit.fill,
+                      ),
+                    ),
+                    onPressed: () => GameUtils.startGame(myProvider),
+                  ),
+                ]
+              ),
+              Column(
+                children: [
+                  Image(
+                    image: AssetImage('assets/skins/empty.png'),
+                    fit: BoxFit.fill,
+                  ),
+                ]
+              ),
+            ],
+          ),
+        ]
+      )
+    );
+  }
+
+  static Table buildParameterSelector(Data myProvider, String parameterCode) {
+    List availableValues = myProvider.getParameterAvailableValues(parameterCode);
+
+    return Table(
+      defaultColumnWidth: IntrinsicColumnWidth(),
+      children: [
+        TableRow(
+          children: [
+            for (var index = 0; index < availableValues.length; index++)
+              Column(
+                children: [
+                  _buildParameterButton(myProvider, parameterCode, availableValues[index])
+                ]
+              ),
+          ],
+        ),
+      ],
+    );
+  }
+
+  static FlatButton _buildParameterButton(Data myProvider, String parameterCode, String parameterValue) {
+    String currentValue = myProvider.getParameterValue(parameterCode).toString();
+
+    bool isActive = (parameterValue == currentValue);
+    String imageAsset = 'assets/icons/' + parameterCode + '_' + parameterValue + '.png';
+
+    return FlatButton(
+      padding: EdgeInsets.all(2),
+      child: Container(
+        decoration: BoxDecoration(
+          color: Colors.white,
+          borderRadius: BorderRadius.circular(10),
+          border: Border.all(
+            color: isActive ? Colors.blue : Colors.white,
+            width: 10,
+          ),
+        ),
+        child: Image(
+          image: AssetImage(imageAsset),
+          fit: BoxFit.fill,
+        ),
+      ),
+      onPressed: () => myProvider.setParameterValue(parameterCode, parameterValue),
+    );
+  }
+
+}
diff --git a/lib/main.dart b/lib/main.dart
index a317c62a527f381023b7d4269324b197fdf9fde7..dd1afff2ab481d34fc88bd2e0751f294b17f42ed 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,10 +1,15 @@
 import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
 import 'package:provider/provider.dart';
 
 import 'provider/data.dart';
 import 'screens/home.dart';
 
-void main() => runApp(MyApp());
+void main() {
+  WidgetsFlutterBinding.ensureInitialized();
+  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
+      .then((value) => runApp(MyApp()));
+}
 
 class MyApp extends StatelessWidget {
   @override
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 26ba51565a5338663d46e626c47259c3d6eb8915..d637afad75b6ffc73ceff166a5f68bc08a3a650f 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -2,4 +2,105 @@ import 'package:flutter/foundation.dart';
 
 class Data extends ChangeNotifier {
 
+  // Configuration available values
+  List _availableDifficultyLevels = ['easy', 'medium', 'hard', 'nightmare'];
+  List _availableSizes = ['10x10', '15x15', '20x20'];
+
+  List get availableDifficultyLevels => _availableDifficultyLevels;
+  List get availableSizes => _availableSizes;
+
+  // Application default configuration
+  String _level = 'medium';
+  String _size = '15x15';
+  String _skin = 'default';
+
+  // Game data
+  bool _stateRunning = false;
+  bool _gameWin = false;
+  bool _gameFail = false;
+  int _sizeVertical = null;
+  int _sizeHorizontal = null;
+  List _cells = [];
+
+  String get level => _level;
+  void updateLevel(String level) {
+    _level = level;
+    notifyListeners();
+  }
+
+  String get size => _size;
+  int get sizeVertical => _sizeVertical;
+  int get sizeHorizontal => _sizeHorizontal;
+  void updateSize(String size) {
+    _size = size;
+    _sizeHorizontal = int.parse(_size.split('x')[0]);
+    _sizeVertical = int.parse(_size.split('x')[1]);
+    notifyListeners();
+  }
+
+  String get skin => _skin;
+  void updateSkin(String skin) {
+    _skin = skin;
+    notifyListeners();
+  }
+
+  getParameterValue(String parameterCode) {
+    switch(parameterCode) {
+      case 'difficulty': { return _level; }
+      break;
+      case 'size': { return _size; }
+      break;
+    }
+  }
+
+  List getParameterAvailableValues(String parameterCode) {
+    switch(parameterCode) {
+      case 'difficulty': { return _availableDifficultyLevels; }
+      break;
+      case 'size': { return _availableSizes; }
+      break;
+    }
+  }
+
+  setParameterValue(String parameterCode, String parameterValue) {
+    switch(parameterCode) {
+      case 'difficulty': { updateLevel(parameterValue); }
+      break;
+      case 'size': { updateSize(parameterValue); }
+      break;
+    }
+  }
+
+  List get cells => _cells;
+  void updateCells(List cells) {
+    _cells = cells;
+    notifyListeners();
+  }
+
+  void setCellAsExplored(int row, int col) {
+    _cells[row][col].isExplored = true;
+    notifyListeners();
+  }
+
+  bool get stateRunning => _stateRunning;
+  void updateStateRunning(bool stateRunning) {
+    _stateRunning = stateRunning;
+    updateGameWin(false);
+    updateGameFail(false);
+    notifyListeners();
+  }
+
+  bool get gameWin => _gameWin;
+  void updateGameWin(bool gameWin) {
+    print('updateGameWin: ' + (gameWin ? 'true' : 'false'));
+    _gameWin = gameWin;
+    notifyListeners();
+  }
+
+  bool get gameFail => _gameFail;
+  void updateGameFail(bool gameFail) {
+    print('updateGameFail: ' + (gameFail ? 'true' : 'false'));
+    _gameFail = gameFail;
+    notifyListeners();
+  }
 }
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 7c832f2449376dc7d1298f0d8f066e26167f4133..39c0be2fa8e96df70f1f4e55e4b61a2a9be8b170 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -1,57 +1,53 @@
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
 
+import '../layout/game.dart';
+import '../layout/parameters.dart';
 import '../provider/data.dart';
+import '../utils/game_utils.dart';
 
 class Home extends StatelessWidget {
   static const String id = 'home';
 
   @override
   Widget build(BuildContext context) {
-    Data _myProvider = Provider.of<Data>(context);
+    Data myProvider = Provider.of<Data>(context);
 
-    return Scaffold(
-      appBar: AppBar(
-        title: Text('Minehunter game'),
-      ),
-      body: Center(
-        child: Column(
-          mainAxisAlignment: MainAxisAlignment.center,
-          children: <Widget>[
-            Container(
-              child: Column(
-                mainAxisSize: MainAxisSize.min,
-                mainAxisAlignment: MainAxisAlignment.center,
-                children: [
-                  Container(
-                    margin: EdgeInsets.all(4),
-                    padding: EdgeInsets.all(4),
-                    decoration: BoxDecoration(
-                      color: Colors.blue,
-                      borderRadius: BorderRadius.circular(4),
-                      border: Border.all(
-                        color: Colors.green,
-                        width: 4,
-                      ),
-                    ),
-                    child: FlatButton(
-                      child: Text(
-                        '💣',
-                        textAlign: TextAlign.center,
-                        style: TextStyle(
-                          fontSize: 50,
-                          fontWeight: FontWeight.w600,
-                          color: Colors.black,
-                        ),
-                      ),
-                    ),
-                  ),
-                ],
+    List<Widget> menuActions = [];
+
+    if (myProvider.stateRunning) {
+      menuActions = [
+        FlatButton(
+          child: Container(
+            decoration: BoxDecoration(
+              borderRadius: BorderRadius.circular(4),
+              border: Border.all(
+                color: Colors.blue,
+                width: 4,
               ),
             ),
-          ],
+            margin: EdgeInsets.all(8),
+            child: Image(
+              image: AssetImage('assets/icons/button_back.png'),
+              fit: BoxFit.fill
+            ),
+          ),
+          onPressed: () => GameUtils.resetGame(myProvider),
         ),
+      ];
+    }
+
+    return Scaffold(
+      appBar: AppBar(
+        actions: menuActions,
       ),
+      body: SafeArea(
+        child: Center(
+          child: myProvider.stateRunning
+            ? Game.buildGameWidget(myProvider)
+            : Parameters.buildParametersSelector(myProvider)
+        ),
+      )
     );
   }
 }
diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart
new file mode 100644
index 0000000000000000000000000000000000000000..743a832d0d6e80344604d465bf4674cb59c1b0a6
--- /dev/null
+++ b/lib/utils/board_utils.dart
@@ -0,0 +1,195 @@
+import '../entities/cell.dart';
+import '../provider/data.dart';
+
+class BoardUtils {
+
+  static printGrid(List cells) {
+    print('');
+    print('-------');
+    for (var rowIndex = 0; rowIndex < cells.length; rowIndex++) {
+      String row = '';
+      for (var colIndex = 0; colIndex < cells[rowIndex].length; colIndex++) {
+        row += cells[rowIndex][colIndex].isMined ? 'X' : '.';
+      }
+      print(row);
+    }
+    print('-------');
+    print('');
+  }
+
+  static List createEmptyBoard(int sizeHorizontal, int sizeVertical) {
+    int index = 0;
+    List cells = [];
+    for (var rowIndex = 0; rowIndex < sizeVertical; rowIndex++) {
+      List row = [];
+      for (var colIndex = 0; colIndex < sizeHorizontal; colIndex++) {
+        row.add(Cell(false));
+      }
+      cells.add(row);
+    }
+
+    return cells;
+  }
+
+  static int getMinesCount(int sizeHorizontal, int sizeVertical, String level) {
+    int minesCountRatio = 0;
+    switch(level) {
+      case 'easy': {
+        minesCountRatio = 5;
+      }
+      break;
+      case 'medium': {
+        minesCountRatio = 10;
+      }
+      break;
+      case 'hard': {
+        minesCountRatio = 15;
+      }
+      break;
+      case 'nightmare': {
+        minesCountRatio = 20;
+      }
+      break;
+    }
+
+    int minesCount = ((sizeHorizontal * sizeVertical) * minesCountRatio / 100).round();
+
+    print('Mines count: ' + minesCount.toString());
+
+    return minesCount;
+  }
+
+  static List createBoard(int sizeHorizontal, int sizeVertical, String level) {
+    List cells = createEmptyBoard(sizeHorizontal, sizeVertical);
+
+    // Shuffle cells to put random mines
+    List cellsArray = [];
+    for (var row = 0; row < sizeVertical; row++) {
+      for (var col = 0; col < sizeHorizontal; col++) {
+        cellsArray.add([row, col]);
+      }
+    }
+    cellsArray.shuffle();
+
+    // Put random mines on board
+    int minesCount = getMinesCount(sizeHorizontal, sizeVertical, level);
+    for (var mineIndex = 0; mineIndex < minesCount; mineIndex++) {
+      cells[cellsArray[mineIndex][0]][cellsArray[mineIndex][1]].isMined = true;
+    }
+
+    // Compute all mines counts on cells
+    for (var row = 0; row < sizeVertical; row++) {
+      for (var col = 0; col < sizeHorizontal; col++) {
+        cells[row][col].minesCountAround = getMinesCountAround(cells, row, col);
+      }
+    }
+
+    printGrid(cells);
+
+    return cells;
+  }
+
+  static void walkOnCell(Data myProvider, int row, int col) {
+    print('Walk on cell [' + col.toString() + ',' + row.toString() + ']');
+    myProvider.setCellAsExplored(row, col);
+
+    if (myProvider.cells[row][col].minesCountAround == 0) {
+      List safeCells = getAllSafeCellsAround(myProvider.cells, row, col);
+      for (var safeCellIndex = 0; safeCellIndex < safeCells.length; safeCellIndex++) {
+        int safeCellRow = safeCells[safeCellIndex][0];
+        int safeCellCol = safeCells[safeCellIndex][1];
+        if (!myProvider.cells[safeCellRow][safeCellCol].isExplored) {
+          walkOnCell(myProvider, safeCellRow, safeCellCol);
+        }
+      }
+    }
+  }
+
+  static List getAllSafeCellsAround(List cells, int row, int col) {
+    int sizeHorizontal = cells.length;
+    int sizeVertical = cells[0].length;
+
+    List safeCellsCoordinates = [];
+
+    if (cells[row][col].minesCountAround == 0) {
+      for (var deltaRow = -1; deltaRow <= 1; deltaRow++) {
+        for (var deltaCol = -1; deltaCol <= 1; deltaCol++) {
+          int candidateRow = row + deltaRow;
+          int candidateCol = col + deltaCol;
+          if (
+            (candidateRow >= 0 && candidateRow < sizeVertical)
+            &&
+            (candidateCol >= 0 && candidateCol < sizeHorizontal)
+            &&
+            !cells[candidateRow][candidateCol].isExplored
+          ) {
+            safeCellsCoordinates.add([candidateRow, candidateCol]);
+          }
+        }
+      }
+    }
+
+    return safeCellsCoordinates;
+  }
+
+  static int getMinesCountAround(List cells, int row, int col) {
+    int sizeHorizontal = cells.length;
+    int sizeVertical = cells[0].length;
+
+    int minesCountAround = 0;
+    for (var deltaRow = -1; deltaRow <= 1; deltaRow++) {
+      for (var deltaCol = -1; deltaCol <= 1; deltaCol++) {
+        if (
+          (row + deltaRow >= 0 && row + deltaRow < sizeVertical)
+          &&
+          (col + deltaCol >= 0 && col + deltaCol < sizeHorizontal)
+          &&
+          (cells[row + deltaRow][col + deltaCol].isMined)
+        ) {
+          minesCountAround++;
+        }
+      }
+    }
+
+    return minesCountAround;
+  }
+
+  static bool checkBoardIsSolved(Data myProvider) {
+    print('checkBoardIsSolved');
+    List cells = myProvider.cells;
+    int sizeHorizontal = cells.length;
+    int sizeVertical = cells[0].length;
+
+    myProvider.updateGameWin(false);
+    myProvider.updateGameFail(false);
+
+    for (var row = 0; row < sizeVertical; row++) {
+      for (var col = 0; col < sizeHorizontal; col++) {
+        // Walked on a mine
+        if (cells[row][col].isMined == true && cells[row][col].isExplored == true) {
+          myProvider.updateGameFail(true);
+          return false;
+        }
+      }
+    }
+
+    for (var row = 0; row < sizeVertical; row++) {
+      for (var col = 0; col < sizeHorizontal; col++) {
+        if (
+          // Mine not already found
+          (cells[row][col].isMined == true && cells[row][col].isMarked == false)
+          ||
+          // Safe cell marked as mined
+          (cells[row][col].isMined == false && cells[row][col].isMarked == true)
+        ) {
+          return false;
+        }
+      }
+    }
+
+    print('-> ok all mines found!');
+    myProvider.updateGameWin(true);
+
+    return true;
+  }
+}
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
new file mode 100644
index 0000000000000000000000000000000000000000..03e51b7743f9243613e7b56814a6f9ba8b1b13b3
--- /dev/null
+++ b/lib/utils/game_utils.dart
@@ -0,0 +1,22 @@
+import '../provider/data.dart';
+import '../utils/board_utils.dart';
+
+class GameUtils {
+
+  static void resetGame(Data myProvider) {
+    myProvider.updateStateRunning(false);
+  }
+
+  static void startGame(Data myProvider) {
+    print('Starting game: ' + myProvider.size + ' - ' + myProvider.level);
+    myProvider.updateSize(myProvider.size);
+    myProvider.updateStateRunning(true);
+    myProvider.updateCells(
+      BoardUtils.createBoard(
+        myProvider.sizeHorizontal,
+        myProvider.sizeVertical,
+        myProvider.level
+      )
+    );
+  }
+}
diff --git a/pubspec.lock b/pubspec.lock
index 8fe48be6a46a17b55d64d9bf688549189566046f..f57afd81a9fe9091b34d0f271f0797d0475ce325 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -7,7 +7,7 @@ packages:
       name: async
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.6.1"
+    version: "2.7.0"
   boolean_selector:
     dependency: transitive
     description:
@@ -73,7 +73,7 @@ packages:
       name: meta
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.3.0"
+    version: "1.4.0"
   nested:
     dependency: transitive
     description:
@@ -141,7 +141,7 @@ packages:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.3.0"
+    version: "0.4.0"
   typed_data:
     dependency: transitive
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index cd7aa5949567a24b31417ee4ef8f65293622ad10..3915ac927c74635e0da63a07d902a9d06fca2292 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -19,3 +19,5 @@ flutter:
   uses-material-design: true
   assets:
     - assets/files/
+    - assets/icons/
+    - assets/skins/