From a97bdbda4ecf83645d409b717e36828784d1450d Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Sun, 1 Mar 2020 16:47:20 +0100
Subject: [PATCH] Draft Hiddenqueen, Grasshopper and Knightmate chess (rules
 unwritten)

---
 TODO                                          |  17 +-
 .../public/images/pieces/Grasshopper/bg.svg   |   1 +
 .../public/images/pieces/Grasshopper/wg.svg   |   1 +
 .../public/images/pieces/Hiddenqueen/bt.svg   |   7 +
 .../public/images/pieces/Hiddenqueen/wt.svg   |   8 +
 .../pieces/Knightmate/{bn.svg => bk.svg}      |   0
 .../pieces/Knightmate/{wn.svg => wk.svg}      |   0
 client/src/base_rules.js                      |  20 +--
 client/src/translations/en.js                 |   8 +-
 client/src/translations/es.js                 |   8 +-
 client/src/translations/fr.js                 |  10 +-
 .../src/translations/rules/Enpassant/en.pug   |  11 ++
 .../src/translations/rules/Enpassant/es.pug   |  12 ++
 .../src/translations/rules/Enpassant/fr.pug   |  12 ++
 .../src/translations/rules/Grasshopper/en.pug |   1 +
 .../src/translations/rules/Grasshopper/es.pug |   1 +
 .../src/translations/rules/Grasshopper/fr.pug |   1 +
 .../src/translations/rules/Hiddenqueen/en.pug |   1 +
 .../src/translations/rules/Hiddenqueen/es.pug |   1 +
 .../src/translations/rules/Hiddenqueen/fr.pug |   1 +
 .../src/translations/rules/Knightmate/en.pug  |   1 +
 .../src/translations/rules/Knightmate/es.pug  |   1 +
 .../src/translations/rules/Knightmate/fr.pug  |   1 +
 client/src/translations/rules/Rifle/en.pug    |   2 +-
 client/src/translations/rules/Rifle/es.pug    |   2 +-
 client/src/translations/rules/Rifle/fr.pug    |   2 +-
 client/src/translations/rules/Wormhole/es.pug |   4 +-
 client/src/variants/Alice.js                  |  19 ++-
 client/src/variants/Antiking.js               |   5 +-
 client/src/variants/Enpassant.js              | 102 ++++++------
 client/src/variants/Grand.js                  |   4 +-
 client/src/variants/Grasshopper.js            | 133 +++++++++++++++
 client/src/variants/Hiddenqueen.js            | 155 ++++++++++++++++++
 client/src/variants/Knightmate.js             | 132 +++++++++++++++
 client/src/variants/Wildebeest.js             |   4 +-
 client/src/variants/Wormhole.js               |   2 +
 client/src/views/Analyse.vue                  |  29 +++-
 client/src/views/Rules.vue                    |  17 +-
 server/db/populate.sql                        |   3 +
 server/models/User.js                         |  11 +-
 40 files changed, 651 insertions(+), 99 deletions(-)
 create mode 100644 client/public/images/pieces/Grasshopper/bg.svg
 create mode 100644 client/public/images/pieces/Grasshopper/wg.svg
 create mode 100644 client/public/images/pieces/Hiddenqueen/bt.svg
 create mode 100644 client/public/images/pieces/Hiddenqueen/wt.svg
 rename client/public/images/pieces/Knightmate/{bn.svg => bk.svg} (100%)
 rename client/public/images/pieces/Knightmate/{wn.svg => wk.svg} (100%)
 create mode 100644 client/src/translations/rules/Grasshopper/en.pug
 create mode 100644 client/src/translations/rules/Grasshopper/es.pug
 create mode 100644 client/src/translations/rules/Grasshopper/fr.pug
 create mode 100644 client/src/translations/rules/Hiddenqueen/en.pug
 create mode 100644 client/src/translations/rules/Hiddenqueen/es.pug
 create mode 100644 client/src/translations/rules/Hiddenqueen/fr.pug
 create mode 100644 client/src/translations/rules/Knightmate/en.pug
 create mode 100644 client/src/translations/rules/Knightmate/es.pug
 create mode 100644 client/src/translations/rules/Knightmate/fr.pug
 create mode 100644 client/src/variants/Grasshopper.js
 create mode 100644 client/src/variants/Hiddenqueen.js
 create mode 100644 client/src/variants/Knightmate.js

diff --git a/TODO b/TODO
index fb75f95d..7bcb36fd 100644
--- a/TODO
+++ b/TODO
@@ -1,9 +1,18 @@
-newmove received on mygames page should be added to storage if gtype == "live"
-and, on game page "mconnect" events => send newmove to them (better than current setup)
-also, mygames page should ask lastate infos to connected players if any (where it's not my turn)
-(maybe in component GameList, if g.type == "live" ...)
+# Functionality:
+On Game page "mconnect" events =>
+  send lastate to them (because they have the game infos) or just "your turn" - if their turn
+  remember them to send next "newmove" (or just "it's your turn") later - if not their turn
+  (=> listen for "mdisconnect" as well)
+From MyGames page: send "mconnect" to all online players (me included: potential multi-tabs)
+  When quit, send mdisconnect (relayed by server if no other MyGames tab).
+And remove current "notify through newmove" on server in sockets.js
 
+# Images:
 Color black wildebeest and camels pieces in white instead of transparent.
+Color white grasshoppers as well. Adjust wormholes color and size.
+Better "Check3" king images: just horizontal red bars maybe (1 to 3).
+Center king image for Knightmate variant.
 
+# Misc:
 Saw once a "double challenge" bug, one anonymous and a second one logged
 Both were asked a challenge probably, and both challenges added as different ones.
diff --git a/client/public/images/pieces/Grasshopper/bg.svg b/client/public/images/pieces/Grasshopper/bg.svg
new file mode 100644
index 00000000..5c238e36
--- /dev/null
+++ b/client/public/images/pieces/Grasshopper/bg.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 50 50" version="1.1"><path d="M45.906 2.969c-.043.008-.086.02-.125.031A1.002 1.002 0 0 0 45 4c0 7.152-4.719 10.906-4.719 10.906l-.031.031c-.324.04-.64.102-.938.25-1 .399-2.32 1.102-3.718 2-.899.5-1.899 1.118-3 1.72 0 0-.094-.009-.094.093-.602.398-5.79 2.805-12.188 5.406.801.7 1.583 1.489 2.282 2.188 2 2.101 2.699 4.718 2 7.218-.801 2.602-2.989 4.68-5.688 5.282-.5.101-1.093.218-1.593.218-1.899 0-3.7-.82-5-2.218l-.626-.594c0 1-.374 2.293-.874 3.594.5.101.8.21 1 .312.398.102 1.976.594 4.374.594 4.102 0 7.72-1.988 10.72-4.688L26 30.5c-.102-.5.313-1.094.813-1.094.5-.101 1.093.282 1.093.782l.688 4.5a42.763 42.763 0 0 0 3.093-3.626l.782.657 3.125 6.812a.997.997 0 0 0 1.343.469s.395-.18.844-.25c.45-.07.735-.055.938.188a1.01 1.01 0 0 0 1.562-1.282c-.797-.957-2.011-1.035-2.812-.906-.25.04-.239.094-.438.156l-2.812-6.218a1.022 1.022 0 0 0-.282-.375l-1.062-.844a71.725 71.725 0 0 0 1.625-2.375c.898 2.601 1.906 4.218 3.406 4.218 1.899 0 7.407-3.511 7.407-8.812 0-1.86-.442-3.777-1.25-5.219 1.593-1.047 5.18-3.914 5.937-9.125a1.003 1.003 0 0 0-.277-.879 1.003 1.003 0 0 0-.88-.277.994.994 0 0 0-.843.844c-.703 4.836-4.125 7.23-5.188 7.875-.097-.082-.21-.149-.312-.219C44.07 13.805 47 9.883 47 4a1 1 0 0 0-1.094-1.031zm-41 12.094a2.935 2.935 0 0 0-1.593.53c-1.2.802-1.626 2.305-1.126 3.907L7 43.406c-1.398-.398-3.605-.511-6.406.688-.5.199-.7.812-.5 1.312.101.399.508.594.906.594.102 0 .3-.008.5.094 4-1.7 6.305-.196 6.406-.094.301.2.793.2 1.094 0 .3-.2.508-.602.406-1L8.5 40.687c0-.101.094-.085.094-.187 1.5-3.398 1.613-7.2 1.312-10 .399.5.696 1 1.094 1.5 1 1.3 1.813 2.492 2.813 3.594 1.199 1.3 2.886 1.804 4.687 1.406 1.898-.398 3.688-2.008 4.188-3.906.5-1.801 0-3.688-1.5-5.188-2.602-2.699-6.301-5.71-9.5-8.312-1.5-1.301-2.899-2.508-4-3.407-.875-.75-1.844-1.152-2.782-1.125zM40.5 21c.8 0 1.5.7 1.5 1.5s-.7 1.5-1.5 1.5-1.5-.7-1.5-1.5.7-1.5 1.5-1.5zm-38 10.313c-.602.199-1.21.398-1.813.5-.3 0-.488.292-.687.593-.102.301-.012.7.188 1 .101.102 1.406 1.696 3.406 3.094zm26.188 3.375c-.602.601-1.18 1.117-1.782 1.718l.282 1.907c0 .199.117.398.218.5l4.188 5c.3.398.82.48 1.218.28.301-.1 1.383-.491 1.782-.093.199.2.511.406.812.406.2 0 .492-.117.594-.218.398-.399.492-.977.094-1.376-.899-1.101-2.399-1.113-3.5-.812L29 37.812z" id="surface1"/><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description about="https://iconscout.com/legal#licenses" dc:title="grasshopper,filled" dc:description="grasshopper,filled" dc:publisher="Iconscout" dc:date="2017-12-07" dc:format="image/svg+xml" dc:language="en"><dc:creator><rdf:Bag><rdf:li>Icons8</rdf:li></rdf:Bag></dc:creator></rdf:Description></rdf:RDF></metadata></svg>
\ No newline at end of file
diff --git a/client/public/images/pieces/Grasshopper/wg.svg b/client/public/images/pieces/Grasshopper/wg.svg
new file mode 100644
index 00000000..045fffea
--- /dev/null
+++ b/client/public/images/pieces/Grasshopper/wg.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 50 50" version="1.1"><path d="M45.906 2.969c-.043.008-.086.02-.125.031A1.002 1.002 0 0 0 45 4c0 6.996-4.46 10.684-4.656 10.844a3.304 3.304 0 0 0-1.094.219.466.466 0 0 0-.063.03c-1.738.762-3.89 2.145-6.656 3.626-.043.02-.086.039-.125.062.059-.043-.59.348-1.437.75-.848.403-1.989.926-3.344 1.532a391.07 391.07 0 0 1-9.281 3.968c-3.73-3.3-8.149-6.738-10.594-8.875-.672-.582-1.441-.945-2.188-1.062a3.158 3.158 0 0 0-2.093.375c-1.203.703-1.707 2.304-1.219 3.937h-.031l.031.125L4.5 30.688c-1.04.328-2.527.812-3.688 1.03a1.01 1.01 0 0 0-.765.641c-.121.336-.055.711.172.985 0 0 2.445 3.058 5.718 4.5l1.125 5.593c-.214-.066-.156-.105-.406-.156-1.445-.285-3.539-.261-6.062.813a1.002 1.002 0 0 0-.254 1.789c.32.21.734.222 1.066.023 2.176-.926 3.797-.902 4.875-.687 1.078.215 1.532.593 1.532.593a1.001 1.001 0 0 0 1.563-1L8.499 40.5a.842.842 0 0 0 .094-.188c1.644-3.593 1.625-7.207 1.281-10.03 1.316 1.796 2.727 3.816 3.969 5.187h.031c1.07 1.16 2.48 1.668 3.813 1.593 1.332-.074 2.597-.671 3.562-1.562.965-.89 1.645-2.11 1.75-3.5.105-1.39-.422-2.895-1.688-4.188v-.03c-.417-.419-.878-.848-1.343-1.282a383.223 383.223 0 0 0 8.468-3.625c1.368-.61 2.536-1.148 3.407-1.563.808-.382 1.234-.582 1.625-.843l.125-.063c2.746-1.476 4.941-2.836 6.375-3.468.422-.165.699-.153 1.031 0 .332.152.691.488 1.031 1 .676 1.027 1.157 2.746 1.157 4.468 0 2.047-1.075 3.746-2.376 4.969a9.44 9.44 0 0 1-1.937 1.406c-.582.313-1.121.407-1.063.407-.042 0-.097.011-.25-.125-.152-.137-.347-.426-.562-.844-.434-.836-.902-2.16-1.344-3.782a1.002 1.002 0 0 0-1.812-.28c-.817 1.273-2.73 4.655-5.563 7.905L28 30.157a1 1 0 0 0-1.063-.875 1.008 1.008 0 0 0-.726.367c-.18.223-.254.508-.211.79l.531 3.468C23.621 36.734 20.074 39 16.094 39c-2.34 0-3.75-.531-3.75-.531a.994.994 0 0 0-1.024.14.995.995 0 0 0-.355.97 1 1 0 0 0 .691.765s1.778.656 4.438.656c4.218 0 7.855-2.07 10.812-4.688l.313 1.938a.997.997 0 0 0 .218.5l4.188 5a1 1 0 0 0 1.219.25s.394-.18.843-.25c.45-.07.735-.055.938.188.223.3.59.449.957.394a1.002 1.002 0 0 0 .574-1.676c-.797-.957-1.98-1.035-2.781-.906-.367.059-.41.129-.656.219l-3.563-4.282-.468-3.093c.199-.207.402-.414.593-.625a38.145 38.145 0 0 0 2.375-2.907l.813.657 3.125 6.812a.997.997 0 0 0 1.343.469s.395-.18.844-.25c.45-.07.735-.055.938.188a1.01 1.01 0 0 0 1.562-1.282c-.797-.957-2.011-1.035-2.812-.906-.25.04-.239.094-.438.156l-2.812-6.218a1.022 1.022 0 0 0-.282-.375l-1.093-.875a65 65 0 0 0 1.593-2.47c.25.743.485 1.618.782 2.188.285.547.59.996 1 1.375.41.38.988.657 1.593.657.711 0 1.258-.258 2-.657.743-.398 1.59-.949 2.376-1.687 1.574-1.477 3-3.684 3-6.438 0-1.86-.407-3.676-1.188-5.093 1.54-.989 5.227-3.836 6-9.157a1.003 1.003 0 0 0-.277-.879 1.003 1.003 0 0 0-.88-.277.994.994 0 0 0-.843.844c-.719 4.945-4.281 7.332-5.25 7.906-.086-.074-.16-.152-.25-.219C44.07 13.844 47 9.902 47 4a1 1 0 0 0-1.094-1.031zM4.844 17.063a1.26 1.26 0 0 1 .437 0c.332.054.73.226 1.157.593 2.542 2.227 6.984 5.684 10.625 8.907.003.003-.004.027 0 .03.113.31.37.544.687.626.004.004.027-.004.031 0 .746.676 1.461 1.336 2.094 1.968l.031.032c.907.941 1.153 1.828 1.094 2.625-.063.808-.48 1.59-1.125 2.187-.645.598-1.504.985-2.313 1.032-.808.046-1.539-.2-2.218-.938-1.801-1.988-3.328-4.594-6.375-8.25a1.002 1.002 0 0 0-1.215-.223 1.003 1.003 0 0 0-.504 1.13s1.21 4.75.406 9.437l-1-4.907-.031-.187a.879.879 0 0 0-.031-.094L4.187 19a1.169 1.169 0 0 0-.03-.125c-.34-1.023-.048-1.46.343-1.688.098-.058.215-.101.344-.125zM40.5 21a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zM4.906 32.656l.5 2.625c-1.004-.648-1.855-1.414-2.5-2.062.801-.23 1.383-.387 2-.563z" id="surface1"/><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description about="https://iconscout.com/legal#licenses" dc:title="grasshopper" dc:description="grasshopper" dc:publisher="Iconscout" dc:date="2017-12-07" dc:format="image/svg+xml" dc:language="en"><dc:creator><rdf:Bag><rdf:li>Icons8</rdf:li></rdf:Bag></dc:creator></rdf:Description></rdf:RDF></metadata></svg>
\ No newline at end of file
diff --git a/client/public/images/pieces/Hiddenqueen/bt.svg b/client/public/images/pieces/Hiddenqueen/bt.svg
new file mode 100644
index 00000000..ea17c33c
--- /dev/null
+++ b/client/public/images/pieces/Hiddenqueen/bt.svg
@@ -0,0 +1,7 @@
+<svg width="2048" height="2048" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
+ <g class="layer">
+  <title>Layer 1</title>
+  <path id="svg_1" fill="#000" transform="translate(0,2048) scale(1,-1)" fill-rule="nonzero" d="m1024,205l-540,0q-40,100 -40,209q0,185 105,332t270,210q-71,33 -115,99t-45,151q0,105 70,182t172,89q-81,61 -81,161q0,84 59,144t145,60q84,0 144,-60t60,-144q0,-100 -81,-161q102,-12 172,-89t70,-182q0,-84 -45,-150t-116,-100q165,-63 270,-210t105,-332q0,-108 -39,-209l-540,0z"/>
+  <path d="m819,376c-1.10864,-2.65115 -1.43005,-3.20636 -1.81732,-3.81818c-0.43079,-0.68066 -0.92487,-1.41653 -1.48804,-2.2005c-0.60889,-0.8476 -1.27008,-1.75565 -2.86133,-3.64798c-0.87073,-1.03552 -1.84528,-2.10236 -2.89648,-3.24301c-1.13385,-1.23032 -2.37537,-2.5477 -3.71552,-3.98099c-1.45422,-1.5553 -3.04144,-3.23602 -6.55463,-7.10934c-1.97681,-2.17944 -4.06763,-4.53577 -6.26703,-7.047c-2.3103,-2.63788 -4.69867,-5.40512 -7.14899,-8.289c-2.52118,-2.96729 -5.09711,-6.00662 -10.25067,-12.33066c-2.61664,-3.21088 -5.22595,-6.49396 -7.86749,-9.84302c-2.69867,-3.42151 -5.44696,-6.94714 -8.27252,-10.58099c-2.91949,-3.75473 -5.93329,-7.65588 -12.35999,-15.90933c-3.41547,-4.38628 -6.95422,-8.9063 -10.56299,-13.5345c-3.65521,-4.68777 -7.31976,-9.39703 -10.94104,-14.1015c-3.57062,-4.63864 -7.07538,-9.15788 -13.49597,-17.864c-2.97205,-4.03 -5.71832,-7.89087 -8.29053,-11.57249c-2.44452,-3.49889 -4.73553,-6.86145 -6.91345,-10.08751c-2.09222,-3.09909 -4.07996,-6.11176 -7.96271,-11.84c-1.88171,-2.77608 -3.75427,-5.48759 -5.6145,-8.13901c-1.82922,-2.60718 -3.64941,-5.15764 -5.46149,-7.653c-1.78436,-2.45724 -3.54993,-4.87331 -7.09064,-9.54132c-1.73474,-2.28705 -3.47064,-4.52077 -5.1825,-6.7155c-1.68158,-2.1559 -3.3396,-4.2627 -4.95752,-6.32851c-1.58038,-2.01788 -3.13312,-3.97557 -6.02667,-7.78934c-1.37946,-1.81818 -2.68964,-3.59576 -3.92999,-5.33399c-1.19934,-1.68072 -2.33246,-3.32444 -3.39001,-4.938c-1.02209,-1.55947 -2.00916,-3.07068 -3.67999,-6.06133c-0.7948,-1.42258 -1.50128,-2.83826 -2.1615,-4.2285c-0.6449,-1.35799 -1.23981,-2.70664 -1.81049,-4.0395c-0.5636,-1.3162 -1.09601,-2.63194 -2.1947,-5.232c-0.5498,-1.30115 -1.11273,-2.59476 -1.68146,-3.8775c-0.56335,-1.27058 -1.12866,-2.51943 -1.69055,-3.7425c-0.54913,-1.19524 -1.08734,-2.35553 -2.12799,-4.54666c-0.48743,-1.02637 -0.95947,-2.00164 -1.401,-2.93401c-0.41974,-0.88636 -0.81396,-1.72973 -1.16699,-2.53799c-0.33398,-0.7646 -0.66193,-1.48513 -1.09863,-2.86134c-0.19977,-0.62952 -0.33636,-1.23968 -0.44702,-1.8195c-0.10492,-0.54971 -0.17834,-1.07628 -0.24902,-1.5765c-0.06726,-0.47612 -0.10406,-0.93633 -0.30396,-1.77066c-0.09442,-0.39422 -0.2287,-0.76503 -0.37201,-1.119c-0.13953,-0.34473 -0.2948,-0.67261 -0.44403,-0.993c-0.14545,-0.31228 -0.30652,-0.60992 -0.51733,-1.22134c-0.10205,-0.29589 -0.16907,-0.59618 -0.21899,-0.891c-0.04852,-0.28667 -0.07629,-0.56709 -0.09296,-0.837c-0.01587,-0.25748 -0.0202,-0.50133 -0.02136,-0.93867c-0.00049,-0.19017 -0.00055,-0.36139 0.00452,-0.5145c0.00452,-0.13624 0.01184,-0.25707 0.03149,-0.3615c0.01727,-0.09199 0.03271,-0.18232 0.13068,-0.29067c0.04773,-0.05276 0.11749,-0.08546 0.19049,-0.114c0.0777,-0.03036 0.16376,-0.05228 0.25348,-0.078c0.09399,-0.02693 0.19531,-0.04832 0.38934,-0.14133c0.10291,-0.04932 0.20178,-0.11667 0.3045,-0.186c0.10663,-0.07198 0.21503,-0.14935 0.33148,-0.222c0.11987,-0.07477 0.24329,-0.15697 0.5307,-0.25867c0.15192,-0.05376 0.31689,-0.08492 0.48596,-0.114c0.1723,-0.02964 0.34753,-0.05153 0.52203,-0.078c0.17285,-0.02621 0.34607,-0.04227 0.65863,-0.14133c0.14832,-0.04701 0.28595,-0.11616 0.42303,-0.186c0.14026,-0.07146 0.28375,-0.15067 0.44098,-0.222c0.16809,-0.07627 0.3526,-0.16115 0.80267,-0.25867c0.26227,-0.05682 0.55566,-0.08547 0.87152,-0.1095c0.33618,-0.02557 0.69092,-0.03843 1.06049,-0.0465c0.38141,-0.00833 0.77197,-0.00999 1.56799,-0.01067c0.40015,-0.00034 0.80133,0 1.20453,0c0.40613,0 0.81628,0 1.23145,0c0.4212,0 0.84937,-0.00032 1.73071,0c0.45496,0.00017 0.92004,-0.0002 1.39496,0.009c0.48511,0.0094 0.98041,0.0271 1.48505,0.063c0.51538,0.03666 1.04401,0.07384 2.12,0.26134c0.55768,0.09718 1.12451,0.23282 1.70398,0.39c0.59943,0.1626 1.21448,0.35448 1.84802,0.57c0.65924,0.22427 1.34271,0.46952 2.78131,1.04c0.76727,0.30426 1.56073,0.63686 2.38501,0.9855c0.85577,0.36196 1.74017,0.74325 2.65497,1.1385c0.94519,0.40839 1.91895,0.83327 3.96002,1.70933c1.06439,0.45686 2.16107,0.92152 3.28497,1.4085c1.15613,0.50095 2.34265,1.02319 3.55505,1.5795c1.24774,0.57254 2.53369,1.16103 5.15997,2.512c1.37213,0.70581 2.76324,1.47058 4.18048,2.27551c1.45355,0.82556 2.92798,1.69667 4.42352,2.6085c1.5282,0.9317 3.08209,1.89312 6.22931,3.94933c1.6156,1.05553 3.23999,2.15211 4.88104,3.2715c1.66034,1.13257 3.3288,2.28886 5.00696,3.4605c1.68921,1.17935 3.38171,2.37145 6.77869,4.768c1.69983,1.19923 3.39618,2.39762 5.091,3.5865c1.68658,1.18311 3.36505,2.35431 5.03699,3.5055c1.6554,1.13979 3.29022,2.26878 6.5387,4.408c1.58313,1.04253 3.14508,2.0392 4.66949,2.997c1.47174,0.92471 2.89087,1.79814 4.24646,2.619c1.27759,0.77361 2.47131,1.49071 4.58405,2.71734c0.89435,0.51924 1.68896,0.96973 2.39099,1.3575c0.61285,0.33851 1.14874,0.62532 1.617,0.8625c0.40271,0.20399 0.74957,0.37872 1.32532,0.61333c0.2334,0.09511 0.44122,0.16673 0.62402,0.2145c0.15613,0.0408 0.2926,0.06414 0.40796,0.0615c0.09772,-0.00224 0.19232,-0.01271 0.30133,-0.10933c0.05328,-0.04719 0.08551,-0.11752 0.11401,-0.19051c0.03033,-0.07771 0.05231,-0.16378 0.078,-0.25349c0.02692,-0.09395 0.04828,-0.1953 0.14136,-0.38934c0.04974,-0.10377 0.12097,-0.20825 0.19946,-0.327c0.09076,-0.13728 0.19836,-0.29673 0.31653,-0.489c0.13855,-0.22553 0.2995,-0.49072 0.65063,-1.184c0.21619,-0.42685 0.44244,-0.91831 0.68555,-1.47c0.26801,-0.60817 0.54779,-1.27835 0.8385,-2.01c0.31323,-0.78824 0.64423,-1.63514 1.30933,-3.52c0.36224,-1.02657 0.72198,-2.11224 1.09045,-3.2475c0.38232,-1.17804 0.76605,-2.39761 1.1535,-3.6525c0.3963,-1.28342 0.79492,-2.59207 1.58936,-5.26666c0.40228,-1.35437 0.80133,-2.72 1.20453,-4.095c0.40613,-1.385 0.81488,-2.78042 1.23145,-4.185c0.4198,-1.41542 0.84082,-2.84263 1.73071,-5.72c0.45032,-1.45618 0.9165,-2.91892 1.38599,-4.3905c0.47186,-1.47909 0.94879,-2.9632 1.422,-4.4535c0.47412,-1.49336 0.9541,-2.98681 1.85864,-5.98933c0.45117,-1.4976 0.88354,-2.99462 1.30054,-4.4865c0.4137,-1.48014 0.80902,-2.94961 1.18347,-4.4055c0.36914,-1.43515 0.72906,-2.84781 1.34937,-5.608c0.29956,-1.33287 0.56592,-2.63854 0.828,-3.9105c0.25525,-1.23871 0.49957,-2.44492 0.75598,-3.6135c0.24908,-1.13507 0.47559,-2.24248 1.08264,-4.30933c0.28955,-0.9857 0.62317,-1.92178 0.97205,-2.811c0.33435,-0.85207 0.68585,-1.65151 1.04395,-2.397c0.3371,-0.70169 0.66272,-1.35289 1.31738,-2.45867c0.28168,-0.47579 0.55511,-0.88977 0.81445,-1.248c0.23071,-0.31871 0.45068,-0.59049 0.6615,-0.816c0.18634,-0.19935 0.35773,-0.37338 0.69067,-0.60267c0.14063,-0.09685 0.27814,-0.1688 0.40955,-0.2055c0.11896,-0.03321 0.23987,-0.03585 0.3465,0.0015c0.11121,0.03895 0.2276,0.11518 0.41064,0.37067c0.11273,0.1573 0.20728,0.36102 0.32251,0.5895c0.13153,0.26081 0.27795,0.55835 0.45752,0.8865c0.20166,0.36848 0.42743,0.78229 1.05328,1.69067c0.36353,0.52759 0.79254,1.08141 1.26154,1.6755c0.50275,0.6368 1.0498,1.30461 1.63049,2.0085c0.61029,0.73983 1.25537,1.50788 2.60797,3.14933c0.71198,0.86404 1.44379,1.76202 2.19452,2.6985c0.77875,0.97145 1.57971,1.98637 2.40149,3.0495c0.85474,1.10578 1.74194,2.25875 3.57068,4.752c0.97137,1.32429 1.9599,2.71151 2.97601,4.1475c1.04535,1.47729 2.10828,2.99764 3.19202,4.5525c1.10364,1.58347 2.21851,3.1953 4.49866,6.46666c1.15356,1.65499 2.31482,3.31571 3.495,4.968c1.17981,1.65173 2.37048,3.28915 3.58496,4.896c1.20563,1.59515 2.39581,3.1812 4.92004,6.13599c1.23303,1.44332 2.50171,2.81114 3.77698,4.12051c1.2478,1.28116 2.50366,2.49554 3.75897,3.64349c1.21979,1.11549 2.41473,2.18547 4.79736,4.06934c1.12189,0.88708 2.23187,1.69363 3.31049,2.4435c1.03241,0.71777 2.03918,1.37619 3.01349,1.9845c0.92957,0.58038 1.82465,1.11858 3.50934,2.072c0.77728,0.4399 1.51813,0.84354 2.22003,1.215c0.6582,0.34834 1.27777,0.66451 1.85999,0.94501c0.53796,0.25919 1.03192,0.50042 1.91998,0.84c0.37726,0.14425 0.72229,0.25057 1.03351,0.3285c0.2771,0.06938 0.52838,0.11395 0.75452,0.1395c0.20306,0.02295 0.388,0.03037 0.71198,0.032c0.14532,0.00073 0.2829,0.0005 0.414,-0.009c0.12762,-0.00925 0.25403,-0.02747 0.37799,-0.063c0.12903,-0.03699 0.26672,-0.0854 0.54138,-0.26134c0.16071,-0.10296 0.32758,-0.24139 0.513,-0.4035c0.21228,-0.18555 0.44647,-0.40778 0.711,-0.66451c0.30096,-0.29211 0.63763,-0.62768 1.44263,-1.432c0.47485,-0.47447 0.99738,-0.99733 1.56604,-1.56599c0.61267,-0.61267 1.26733,-1.26734 1.96198,-1.96201c0.73267,-0.73267 1.50134,-1.50134 3.13867,-3.13866c0.86536,-0.86534 1.7627,-1.76268 2.69397,-2.694c0.96735,-0.96735 1.97272,-1.97268 3.01801,-3.018c1.08734,-1.08735 2.21893,-2.21844 4.62134,-4.62134c1.27863,-1.27888 2.62988,-2.6301 4.06952,-4.083c1.55658,-1.57095 3.24609,-3.28898 5.08649,-5.181c2.02295,-2.07968 4.24658,-4.37392 9.34399,-9.736c2.92596,-3.07789 6.03973,-6.38836 9.29553,-9.849c3.33484,-3.54467 6.68225,-7.11063 9.98846,-10.623c3.19751,-3.39692 6.21265,-6.62256 11.54938,-12.19467c2.17334,-2.26921 4.04279,-4.17982 5.62799,-5.7885c1.33252,-1.35226 2.46021,-2.47758 3.396,-3.4395c0.79883,-0.82113 1.51447,-1.53076 2.64264,-2.93867c0.5636,-0.70339 1.08447,-1.46054 1.59601,-2.2305c0.50983,-0.76745 0.98962,-1.53894 1.45203,-2.2935c0.44482,-0.72584 0.84723,-1.42617 1.61865,-2.64267c0.32935,-0.51934 0.63495,-0.96974 0.92401,-1.3485c0.25079,-0.32861 0.48267,-0.59973 0.70801,-0.7995c0.18939,-0.16791 0.36847,-0.3327 0.70129,-0.352c0.14667,-0.00851 0.29425,0.07086 0.41852,0.189c0.14679,0.13955 0.27588,0.3489 0.40948,0.603c0.15674,0.29814 0.31427,0.65612 0.672,1.54133c0.21375,0.529 0.44244,1.12308 0.69,1.7835c0.27271,0.7275 0.56311,1.52791 0.87,2.4045c0.33337,0.95232 0.69098,1.98444 1.44,4.312c0.41595,1.29255 0.84204,2.67498 1.28552,4.1415c0.46735,1.54543 0.94672,3.17011 1.43848,4.8705c0.51202,1.77058 1.03931,3.60962 2.10938,7.488c0.55951,2.02777 1.12061,4.11183 1.69501,6.243c0.58563,2.17282 1.17834,4.38244 1.78497,6.621c0.61334,2.26345 1.22723,4.54758 2.52002,9.136c0.64807,2.30014 1.31146,4.58801 1.98151,6.855c0.66199,2.23965 1.32611,4.43817 1.99048,6.585c0.64673,2.08981 1.27368,4.11269 2.52802,7.89333c0.58167,1.75317 1.15356,3.40543 1.71448,4.959c0.52893,1.46498 1.04681,2.83647 1.56152,4.113c0.48224,1.19596 0.93231,2.31645 1.89063,4.26133c0.42816,0.86893 0.86761,1.6503 1.2915,2.358c0.38892,0.64931 0.76733,1.22779 1.12054,1.746c0.31824,0.4669 0.62366,0.86937 1.08795,1.56267c0.18573,0.27739 0.33002,0.52288 0.44702,0.7335c0.09869,0.17757 0.17432,0.33115 0.24902,0.4545c0.06384,0.10543 0.12195,0.20972 0.30396,0.312c0.10327,0.05804 0.23651,0.08549 0.38104,0.10049c0.15704,0.0163 0.32825,0.01071 0.50696,-0.01649c0.18896,-0.02877 0.39148,-0.06638 0.77869,-0.25067c0.20679,-0.09841 0.40912,-0.23763 0.61798,-0.39899c0.22894,-0.17691 0.46753,-0.39027 0.72601,-0.633c0.28717,-0.26969 0.59808,-0.5779 1.32269,-1.30133c0.42023,-0.41956 0.87933,-0.87936 1.37549,-1.38c0.53448,-0.53931 1.10486,-1.11881 1.7085,-1.74c0.64014,-0.65874 1.3161,-1.35488 2.74933,-2.88c0.76758,-0.81677 1.55847,-1.67493 2.37598,-2.56651c0.84393,-0.92039 1.70789,-1.8705 2.59204,-2.8455c0.9032,-0.99599 1.82062,-2.0126 3.69867,-4.088c0.95477,-1.05514 1.91956,-2.1203 2.89948,-3.19051c0.98932,-1.08048 1.9931,-2.16671 3.01648,-3.25349c1.03296,-1.09692 2.07532,-2.20453 4.25067,-4.38934c1.10242,-1.10724 2.23413,-2.20329 3.37653,-3.3045c1.1496,-1.10815 2.31201,-2.21525 3.47552,-3.3315c1.16748,-1.12007 2.34521,-2.23594 4.64795,-4.53067c1.15198,-1.14801 2.28473,-2.31539 3.414,-3.486c1.12939,-1.17073 2.25165,-2.34833 3.37799,-3.522c1.12634,-1.17366 2.24493,-2.35493 4.54138,-4.65866c1.14734,-1.151 2.30817,-2.27869 3.47247,-3.3825c1.14917,-1.08948 2.29272,-2.14458 3.42749,-3.1575c1.10376,-0.98527 2.17261,-1.93874 4.26666,-3.62667c0.97021,-0.78205 1.91144,-1.48949 2.81104,-2.1345c0.84222,-0.60386 1.64233,-1.14418 2.39697,-1.6215c0.69318,-0.43842 1.32764,-0.83558 2.45868,-1.41067c0.46533,-0.23659 0.88171,-0.41553 1.24805,-0.543c0.31165,-0.10843 0.58374,-0.17735 0.81592,-0.201c0.19397,-0.01976 0.36914,-0.0284 0.60266,0.07734c0.09778,0.04424 0.17627,0.12757 0.24158,0.2355c0.08203,0.1355 0.15552,0.32652 0.25049,0.5685c0.11963,0.3049 0.25757,0.68717 0.67468,1.696c0.26929,0.65125 0.59412,1.39353 0.95691,2.2275c0.3999,0.91938 0.83643,1.91761 1.29907,2.9925c0.49219,1.1434 1.01465,2.34841 2.07727,4.94667c0.56104,1.37177 1.12195,2.7929 1.68604,4.257c0.57727,1.49854 1.15234,3.03282 1.72205,4.599c0.57776,1.58847 1.15833,3.19687 2.25867,6.47733c0.55457,1.65329 1.08887,3.32907 1.63196,5.0265c0.55286,1.72789 1.11401,3.49566 1.70398,5.3055c0.60791,1.86454 1.22998,3.79445 2.66406,7.83467c0.75928,2.13908 1.57361,4.31734 2.4209,6.50249c0.8407,2.1682 1.68945,4.27454 2.54712,6.2775c0.80713,1.88511 1.50684,3.64718 3.03198,6.38667c0.57886,1.03983 1.11865,1.84015 1.67542,2.316c0.42456,0.36288 0.90552,0.5074 1.28857,0.372c0.42041,-0.14861 0.80811,-0.56215 1.53601,-1.688c0.43811,-0.6776 0.84973,-1.47434 1.3125,-2.3415c0.50415,-0.94471 1.03735,-1.97327 1.62744,-3.0705c0.63135,-1.17395 1.29346,-2.43169 2.89331,-5.088c0.86743,-1.44024 1.82788,-2.92381 2.86951,-4.452c1.08716,-1.59499 2.26123,-3.2261 3.52649,-4.884c1.31067,-1.71733 2.67908,-3.48627 5.77075,-6.99734c1.61597,-1.83516 3.36023,-3.67007 5.20947,-5.544c1.93298,-1.95882 4.00867,-3.96764 6.22644,-6.048c2.34143,-2.19634 4.84216,-4.49507 10.39734,-9.408c3.02747,-2.67745 6.22412,-5.44318 9.52954,-8.2905c3.37061,-2.90344 6.78088,-5.81615 10.18652,-8.7135c3.35742,-2.85629 6.63428,-5.63268 12.78394,-10.82933c2.80103,-2.36692 5.41101,-4.57083 7.84509,-6.612c2.2594,-1.89463 4.35828,-3.64407 6.31494,-5.244c1.80701,-1.47762 3.46753,-2.84967 6.50671,-5.144c1.33899,-1.01079 2.59399,-1.8974 3.75452,-2.6775c1.04968,-0.7056 2.01038,-1.31144 2.88147,-1.8225c0.76611,-0.44949 1.43506,-0.83699 2.53064,-1.33333c0.40198,-0.1821 0.73047,-0.30577 0.99451,-0.3525c0.20081,-0.03555 0.36877,-0.0188 0.48145,0.0525c0.10913,0.06904 0.17664,0.19733 0.35742,0.46667c0.10645,0.1586 0.24097,0.32856 0.39001,0.5265c0.17114,0.22729 0.3645,0.49132 0.56995,0.8055c0.23523,0.35979 0.50098,0.77438 1.04004,1.83467c0.32202,0.63338 0.6438,1.3535 0.97192,2.151c0.35535,0.86363 0.7063,1.80338 1.04407,2.817c0.35767,1.07362 0.72644,2.21051 1.31726,4.69867c0.31433,1.32382 0.57288,2.71218 0.83252,4.1475c0.26733,1.47801 0.51929,2.99874 0.78748,4.5525c0.27344,1.58459 0.53113,3.20057 1.21338,6.46667c0.34644,1.6587 0.74695,3.32093 1.17151,4.9905c0.42749,1.68116 0.88586,3.36508 1.36047,5.0535c0.47644,1.69527 0.97021,3.3912 1.96802,6.78933c0.4989,1.69927 0.99756,3.39233 1.49548,5.073c0.4928,1.66332 0.98132,3.30269 1.46851,4.911c0.47668,1.57368 0.93835,3.10791 1.86938,6.016c0.43909,1.3717 0.87451,2.68053 1.30493,3.9255c0.40991,1.18564 0.81323,2.30623 1.21509,3.3585c0.37854,0.99129 0.7312,1.92355 1.47998,3.54934c0.33228,0.72144 0.66992,1.36883 1.00049,1.94849c0.30103,0.52802 0.59619,0.99416 0.88342,1.39951c0.25732,0.36324 0.4928,0.68489 0.94934,1.152c0.18347,0.18772 0.35791,0.3323 0.51904,0.438c0.13843,0.09083 0.27063,0.15202 0.39294,0.186c0.11084,0.03082 0.21875,0.04066 0.42139,0.04266c0.10022,0.00098 0.20215,0.00011 0.30444,-0.018c0.1073,-0.019 0.22046,-0.05828 0.33154,-0.126c0.12622,-0.07695 0.26538,-0.18421 0.53064,-0.52267c0.16663,-0.21259 0.32886,-0.48297 0.52649,-0.789c0.22778,-0.35268 0.48962,-0.75601 0.80554,-1.203c0.35779,-0.50618 0.76392,-1.07651 1.83472,-2.34133c0.62634,-0.73981 1.3457,-1.51669 2.1239,-2.3475c0.8269,-0.88274 1.70862,-1.79908 2.62805,-2.75249c0.94983,-0.98494 1.9314,-1.98754 3.91467,-4.06667c1.00342,-1.05191 2.00281,-2.11852 3.00903,-3.1905c1.01245,-1.07869 2.0304,-2.1657 3.06299,-3.2535c1.04016,-1.09588 2.08459,-2.20452 4.26135,-4.38933c1.10242,-1.10656 2.23108,-2.2011 3.37646,-3.2865c1.14661,-1.08663 2.30603,-2.15651 3.47546,-3.2055c1.16162,-1.042 2.31592,-2.07125 4.64807,-4.008c1.13684,-0.94411 2.27148,-1.84489 3.396,-2.706c1.09705,-0.84008 2.18091,-1.63645 3.25195,-2.382c1.03662,-0.72154 2.03967,-1.41763 4.01868,-2.57867c0.92432,-0.5423 1.82825,-1.01189 2.6925,-1.4295c0.80945,-0.39111 1.57471,-0.72556 2.28748,-1.0065c0.64587,-0.25457 1.224,-0.48334 2.18665,-0.73067c0.35852,-0.09212 0.65649,-0.14838 0.88049,-0.102c0.18323,0.03793 0.32654,0.17619 0.40356,0.366c0.0957,0.23591 0.12646,0.55707 0.21594,1.40266c0.05713,0.53934 0.11938,1.15658 0.2085,1.8465c0.09839,0.76218 0.22107,1.59238 0.37952,2.4855c0.17004,0.95806 0.35388,1.98043 0.91199,4.168c0.3009,1.17933 0.66772,2.3977 1.0575,3.6615c0.40344,1.30828 0.83862,2.65094 1.28259,4.0305c0.45435,1.41144 0.9325,2.84613 1.82666,5.808c0.45483,1.50674 0.88635,3.03596 1.30945,4.581c0.42615,1.55629 0.83911,3.12661 1.24646,4.707c0.40906,1.58695 0.81018,3.18112 1.61072,6.37867c0.40051,1.59956 0.79932,3.19753 1.19995,4.791c0.39929,1.58786 0.79858,3.1677 1.20007,4.737c0.39856,1.55804 0.79272,3.10323 1.59998,6.13866c0.39612,1.48961 0.79443,2.95013 1.19104,4.374c0.38477,1.38145 0.76355,2.71046 1.13696,3.978c0.354,1.20173 0.68262,2.33142 1.33862,4.31467c0.28235,0.85369 0.5542,1.61133 0.81909,2.277c0.23474,0.59005 0.46179,1.10358 0.69299,1.53899c0.20288,0.38214 0.38403,0.7267 0.82129,1.18401c0.18628,0.19478 0.39404,0.33678 0.59998,0.438c0.19495,0.09581 0.39856,0.15316 0.59998,0.186c0.19897,0.03245 0.40002,0.04196 0.80005,0.04266c0.20361,0.00036 0.43103,-0.00565 0.69897,-0.054c0.33826,-0.06103 0.7627,-0.18649 1.29297,-0.378c0.67017,-0.24206 1.49463,-0.57139 3.67468,-1.568c1.41711,-0.64782 3.05115,-1.44051 4.9126,-2.3715c2.10583,-1.05322 4.44727,-2.26373 7.02747,-3.6405c2.84204,-1.51651 5.94604,-3.19109 12.89331,-7.15466c3.88953,-2.21906 7.98352,-4.63321 12.28955,-7.12051c4.44983,-2.5703 9.00696,-5.17938 13.6665,-7.7235c4.66357,-2.54635 9.2655,-5.13206 18.54395,-9.32267c4.39563,-1.9853 8.71301,-3.63119 12.86548,-5.0685c3.93323,-1.36141 7.68689,-2.489 11.21851,-3.4395c3.2666,-0.87918 6.27405,-1.60926 11.41602,-2.65867c2.08557,-0.42564 3.87341,-0.74588 5.38647,-0.9765c1.2594,-0.19196 2.29968,-0.31667 3.14551,-0.3555c0.6759,-0.03104 1.22949,-0.05536 1.96802,0.16533c0.28003,0.08368 0.50122,0.22145 0.65698,0.3765c0.14014,0.13953 0.22937,0.30721 0.27905,0.4755c0.04822,0.16359 0.05994,0.33192 0.06396,0.648c0.00183,0.14549 0,0.284 0,0.4185c0,0.1335 0,0.269 0,0.4095c0,0.1485 0.00037,0.308 0,0.672c-0.00024,0.21067 -0.00037,0.4454 -0.00903,0.708c-0.00977,0.29477 -0.02893,0.62566 -0.06299,0.996c-0.03821,0.41507 -0.08582,0.87933 -0.26135,1.96267c-0.10229,0.63109 -0.23608,1.31918 -0.3855,2.0655c-0.16101,0.80439 -0.34253,1.66391 -0.53845,2.5785c-0.20764,0.96909 -0.43103,1.99059 -0.9093,4.18934c-0.25549,1.17429 -0.51929,2.39513 -0.79956,3.657c-0.28894,1.30082 -0.59167,2.63575 -0.9165,3.999c-0.33154,1.39146 -0.66687,2.80872 -1.45068,5.67733c-0.39868,1.45918 -0.83472,2.93 -1.29443,4.422c-0.46948,1.52406 -0.97156,3.07958 -1.50146,4.674c-0.54626,1.64365 -1.12109,3.33888 -2.37073,6.904c-0.66162,1.8877 -1.36182,3.85163 -2.11206,5.8965c-0.7854,2.14059 -1.62854,4.37799 -2.54395,6.7155c-0.96216,2.45705 -1.98096,5.0402 -4.34399,10.55467c-1.27417,2.97346 -2.65234,6.04797 -4.10095,9.204c-1.47925,3.22279 -3.01123,6.46889 -4.58704,9.70799c-1.56824,3.22357 -3.11731,6.40527 -6.31201,12.42134c-1.5105,2.84445 -3.02661,5.5379 -4.49695,8.11499c-1.41272,2.47609 -2.79761,4.84164 -4.11902,7.125c-1.27319,2.20004 -2.53516,4.3051 -4.71741,8.42667c-1.0415,1.96703 -1.98254,3.91573 -2.87097,5.82451c-0.86609,1.86076 -1.67371,3.69499 -2.45703,5.4915c-0.76733,1.75986 -1.48962,3.50052 -3.00525,6.85066c-0.74231,1.6409 -1.51074,3.24519 -2.28149,4.82401c-0.76147,1.55984 -1.53064,3.09286 -2.29053,4.608c-0.7511,1.49753 -1.5083,2.97073 -2.92798,5.90132c-0.69812,1.44099 -1.36584,2.87599 -2.01001,4.30051c-0.63586,1.4062 -1.24573,2.80124 -1.83008,4.1835c-0.57556,1.36147 -1.13574,2.7045 -2.15991,5.34933c-0.49805,1.28621 -0.96326,2.55313 -1.41907,3.78749c-0.44275,1.19897 -0.86768,2.36023 -1.29297,3.4725c-0.40759,1.06599 -0.7793,2.09109 -1.62134,3.90666c-0.38245,0.82463 -0.78906,1.57663 -1.20447,2.26651c-0.39465,0.6553 -0.80762,1.26083 -1.23157,1.8255c-0.41272,0.54962 -0.83911,1.07426 -1.73059,2.07466c-0.44958,0.50456 -0.91626,1.00104 -1.38599,1.5c-0.47168,0.50104 -0.94788,0.99954 -1.422,1.5c-0.47327,0.49954 -0.94897,0.99309 -1.85876,2c-0.44873,0.49663 -0.88293,0.99754 -1.30493,1.5c-0.41797,0.49759 -0.82324,0.99753 -1.21509,1.5c-0.38806,0.49756 -0.76965,0.99303 -1.47998,2c-0.35022,0.49644 -0.68323,0.99823 -1.01392,1.4955c-0.328,0.49339 -0.65063,0.98509 -0.97803,1.46851c-0.32532,0.48027 -0.64331,0.96227 -1.34131,1.86934c-0.34741,0.45154 -0.71777,0.88733 -1.09509,1.323c-0.38257,0.44171 -0.78052,0.88474 -1.18494,1.341c-0.41577,0.46906 -0.85107,0.94806 -1.71997,2.00266c-0.46082,0.55933 -0.92004,1.15225 -1.3905,1.76251c-0.48035,0.62305 -0.9624,1.25934 -1.45349,1.89749c-0.49255,0.64017 -0.97742,1.28424 -1.98938,2.50665c-0.49316,0.59573 -0.99548,1.16434 -1.49097,1.71902c-0.48584,0.54395 -0.96875,1.07147 -1.43701,1.59299c-0.45898,0.51114 -0.91797,1.00507 -1.73865,2.02133c-0.39856,0.49353 -0.76733,0.9967 -1.11902,1.5c-0.34705,0.49677 -0.67566,0.99817 -0.99304,1.5c-0.31519,0.4982 -0.61938,0.99957 -1.22131,2c-0.30054,0.49945 -0.59888,0.99884 -0.90454,1.491c-0.30371,0.48917 -0.61145,0.97064 -0.93152,1.43701c-0.31641,0.461 -0.62683,0.92007 -1.33057,1.73865c-0.34424,0.40048 -0.71716,0.77097 -1.09509,1.13702c-0.38196,0.37 -0.78149,0.7363 -1.18494,1.11899c-0.41675,0.39526 -0.8584,0.79886 -1.71997,1.74399c-0.46472,0.50977 -0.92029,1.06723 -1.38159,1.6485c-0.47083,0.59335 -0.93311,1.20407 -1.3905,1.81952c-0.45361,0.61023 -0.89099,1.21533 -1.72791,2.36533c-0.39026,0.53632 -0.76514,1.04819 -1.12805,1.54199c-0.35437,0.48218 -0.70544,0.95789 -1.05603,1.43402c-0.35474,0.48187 -0.71875,0.97488 -1.48267,2.02399c-0.41016,0.56326 -0.83411,1.151 -1.27197,1.75351c-0.44482,0.61215 -0.89307,1.22684 -1.34399,1.8345c-0.44373,0.59799 -0.87207,1.18298 -1.71729,2.24533c-0.38562,0.48468 -0.76038,0.92862 -1.11902,1.3425c-0.34021,0.3927 -0.67249,0.7619 -0.99304,1.11749c-0.31201,0.34607 -0.625,0.68115 -1.22131,1.37332c-0.30334,0.35208 -0.60168,0.71732 -0.90002,1.09052c-0.30164,0.37741 -0.60095,0.76291 -0.90002,1.1535c-0.3009,0.39307 -0.60022,0.7905 -1.19995,1.58932c-0.30017,0.39978 -0.59924,0.79919 -0.90002,1.1955c-0.29919,0.39435 -0.59851,0.78479 -0.90002,1.16852c-0.29846,0.37994 -0.59314,0.75641 -1.19995,1.46933c-0.29651,0.34833 -0.59924,0.68344 -0.89551,1.01849c-0.29443,0.33298 -0.5874,0.66589 -0.86853,1.00949c-0.28259,0.34543 -0.57251,0.69363 -1.06934,1.47202c-0.25671,0.40222 -0.48584,0.83298 -0.71399,1.272c-0.23059,0.44363 -0.45105,0.89545 -0.67798,1.34399c-0.22571,0.44611 -0.43652,0.89587 -0.94128,1.71732c-0.24402,0.397 -0.51221,0.76553 -0.78149,1.11902c-0.26294,0.34515 -0.53149,0.67227 -0.79053,0.99298c-0.25195,0.31195 -0.5105,0.6058 -0.92798,1.22134c-0.19934,0.29395 -0.36768,0.59607 -0.51904,0.89551c-0.14722,0.29138 -0.27502,0.58267 -0.39294,0.8685c-0.11462,0.27792 -0.21497,0.55219 -0.42139,1.06934c-0.09814,0.24588 -0.19873,0.48187 -0.30005,0.7095c-0.09875,0.22171 -0.19922,0.43668 -0.29993,0.64648c-0.09924,0.20654 -0.19958,0.40961 -0.40002,0.81067c-0.09998,0.19995 -0.19946,0.39963 -0.30444,0.59549c-0.10437,0.19482 -0.21289,0.38593 -0.33154,0.56851c-0.11768,0.18115 -0.23486,0.36411 -0.53064,0.66934c-0.14758,0.15234 -0.31482,0.28415 -0.48157,0.414c-0.16541,0.12881 -0.33301,0.25003 -0.49048,0.37799c-0.15356,0.12479 -0.31616,0.24011 -0.52795,0.54132c-0.10315,0.14682 -0.16992,0.31708 -0.22803,0.49051c-0.05933,0.17734 -0.104,0.36404 -0.15601,0.5535c-0.05334,0.19424 -0.09607,0.40012 -0.28271,0.78934c-0.09863,0.2056 -0.23242,0.40256 -0.37646,0.60001c-0.14783,0.20267 -0.31042,0.40051 -0.47546,0.60001c-0.16589,0.2005 -0.34033,0.39362 -0.64807,0.79999c-0.14917,0.19699 -0.28381,0.39841 -0.40942,0.60001c-0.12366,0.19846 -0.23792,0.39914 -0.34656,0.60001c-0.10779,0.19916 -0.20984,0.39975 -0.41064,0.79999c-0.10022,0.19971 -0.19934,0.39896 -0.30005,0.59549c-0.09949,0.19412 -0.19861,0.38437 -0.29993,0.56851c-0.09875,0.17953 -0.19336,0.35498 -0.40002,0.66934c-0.0968,0.14722 -0.19788,0.28186 -0.29553,0.40948c-0.09314,0.1217 -0.18457,0.2356 -0.26843,0.3465c-0.07983,0.10547 -0.16162,0.20331 -0.26941,0.41068c-0.05054,0.09726 -0.08411,0.19818 -0.11401,0.2955c-0.02869,0.09341 -0.0509,0.1842 -0.078,0.26849c-0.02551,0.07938 -0.04333,0.1629 -0.14124,0.26935c-0.0481,0.05228 -0.11646,0.08502 -0.18604,0.11398c-0.07166,0.02982 -0.14783,0.05145 -0.22205,0.078c-0.07312,0.02612 -0.1532,0.04385 -0.25867,0.14133c-0.05225,0.04834 -0.08557,0.11795 -0.11841,0.19052c-0.03528,0.07806 -0.06665,0.16479 -0.1095,0.25348c-0.04602,0.09515 -0.0946,0.20258 -0.27209,0.38934c-0.10205,0.10736 -0.23328,0.20184 -0.37195,0.29999c-0.14404,0.10193 -0.29529,0.1991 -0.44397,0.30002c-0.146,0.09912 -0.29614,0.18527 -0.51733,0.39999c-0.0968,0.09396 -0.16833,0.1976 -0.22351,0.29999c-0.05273,0.09787 -0.08899,0.20001 -0.12451,0.30002l-0.03357,0.10001l-0.03442,0.09998" id="svg_3" stroke-width="20" stroke="#000000" fill="none"/>
+ </g>
+</svg>
diff --git a/client/public/images/pieces/Hiddenqueen/wt.svg b/client/public/images/pieces/Hiddenqueen/wt.svg
new file mode 100644
index 00000000..87c11cae
--- /dev/null
+++ b/client/public/images/pieces/Hiddenqueen/wt.svg
@@ -0,0 +1,8 @@
+<svg width="2048" height="2048" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
+ <g class="layer">
+  <title>Layer 1</title>
+  <path id="svg_1" fill="#000" transform="translate(0,2048) scale(1,-1)" fill-rule="nonzero" d="m1024,273l491,0q21,72 21,141q0,156 -86,283t-223,187q-66,5 -66,72q0,53 67,78q93,65 93,172q0,77 -52,135t-126,67q-60,5 -60,68q0,28 22,52q54,42 54,110q0,56 -40,96t-95,40q-57,0 -96,-40t-40,-96q0,-67 54,-110q22,-22 22,-52q0,-63 -59,-68q-75,-9 -126,-67t-52,-135q0,-107 93,-172q67,-26 67,-78q0,-67 -67,-72q-136,-60 -222,-187t-86,-283q0,-74 21,-141l491,0zm0,-68l-540,0q-40,100 -40,209q0,185 105,332t270,210q-71,33 -115,99t-45,151q0,105 70,182t172,89q-81,61 -81,161q0,84 59,144t145,60q84,0 144,-60t60,-144q0,-100 -81,-161q102,-12 172,-89t70,-182q0,-84 -45,-150t-116,-100q165,-63 270,-210t105,-332q0,-108 -39,-209l-540,0z"/>
+  <path id="svg_2" fill="#fff" fill-rule="nonzero" d="m1024,1775l491,0q21,-72 21,-141q0,-156 -86,-283t-223,-187q-66,-5 -66,-72q0,-53 67,-78q93,-65 93,-172q0,-77 -52,-135t-126,-67q-60,-5 -60,-68q0,-28 22,-52q54,-42 54,-110q0,-56 -40,-96t-95,-40q-57,0 -96,40t-40,96q0,67 54,110q22,22 22,52q0,63 -59,68q-75,9 -126,67t-52,135q0,107 93,172q67,26 67,78q0,67 -67,72q-136,60 -222,187t-86,283q0,74 21,141l491,0z"/>
+  <path d="m819.99966,388.28527c-1.10864,-2.65115 -1.43005,-3.20636 -1.81732,-3.81818c-0.43079,-0.68066 -0.92487,-1.41653 -1.48804,-2.2005c-0.60889,-0.8476 -1.27008,-1.75565 -2.86133,-3.64798c-0.87073,-1.03552 -1.84528,-2.10236 -2.89648,-3.24301c-1.13385,-1.23032 -2.37537,-2.5477 -3.71552,-3.98099c-1.45422,-1.5553 -3.04144,-3.23602 -6.55463,-7.10934c-1.97681,-2.17944 -4.06763,-4.53577 -6.26703,-7.047c-2.3103,-2.63788 -4.69867,-5.40512 -7.14899,-8.289c-2.52118,-2.96729 -5.09711,-6.00662 -10.25067,-12.33066c-2.61664,-3.21088 -5.22595,-6.49396 -7.86749,-9.84302c-2.69867,-3.42151 -5.44696,-6.94714 -8.27252,-10.58099c-2.91949,-3.75473 -5.93329,-7.65588 -12.35999,-15.90933c-3.41547,-4.38628 -6.95422,-8.9063 -10.56299,-13.5345c-3.65521,-4.68777 -7.31976,-9.39703 -10.94104,-14.1015c-3.57062,-4.63864 -7.07538,-9.15788 -13.49597,-17.864c-2.97205,-4.03 -5.71832,-7.89087 -8.29053,-11.57249c-2.44452,-3.49889 -4.73553,-6.86145 -6.91345,-10.08751c-2.09222,-3.09909 -4.07996,-6.11176 -7.96271,-11.84c-1.88171,-2.77608 -3.75427,-5.48759 -5.6145,-8.13901c-1.82922,-2.60718 -3.64941,-5.15764 -5.46149,-7.653c-1.78436,-2.45724 -3.54993,-4.87331 -7.09064,-9.54132c-1.73474,-2.28705 -3.47064,-4.52077 -5.1825,-6.7155c-1.68158,-2.1559 -3.3396,-4.2627 -4.95752,-6.32851c-1.58038,-2.01788 -3.13312,-3.97557 -6.02667,-7.78934c-1.37946,-1.81818 -2.68964,-3.59576 -3.92999,-5.33399c-1.19934,-1.68072 -2.33246,-3.32444 -3.39001,-4.938c-1.02209,-1.55947 -2.00916,-3.07068 -3.67999,-6.06133c-0.7948,-1.42258 -1.50128,-2.83826 -2.1615,-4.2285c-0.6449,-1.35799 -1.23981,-2.70664 -1.81049,-4.0395c-0.5636,-1.3162 -1.09601,-2.63194 -2.1947,-5.232c-0.5498,-1.30115 -1.11273,-2.59476 -1.68146,-3.8775c-0.56335,-1.27058 -1.12866,-2.51943 -1.69055,-3.7425c-0.54913,-1.19524 -1.08734,-2.35553 -2.12799,-4.54666c-0.48743,-1.02637 -0.95947,-2.00164 -1.401,-2.93401c-0.41974,-0.88636 -0.81396,-1.72973 -1.16699,-2.53799c-0.33398,-0.7646 -0.66193,-1.48513 -1.09863,-2.86134c-0.19977,-0.62952 -0.33636,-1.23968 -0.44702,-1.8195c-0.10492,-0.54971 -0.17834,-1.07628 -0.24902,-1.5765c-0.06726,-0.47612 -0.10406,-0.93633 -0.30396,-1.77066c-0.09442,-0.39422 -0.2287,-0.76503 -0.37201,-1.119c-0.13953,-0.34473 -0.2948,-0.67261 -0.44403,-0.993c-0.14545,-0.31228 -0.30652,-0.60992 -0.51733,-1.22134c-0.10205,-0.29589 -0.16907,-0.59618 -0.21899,-0.891c-0.04852,-0.28667 -0.07629,-0.56709 -0.09296,-0.837c-0.01587,-0.25748 -0.0202,-0.50133 -0.02136,-0.93867c-0.00049,-0.19017 -0.00055,-0.36139 0.00452,-0.5145c0.00452,-0.13624 0.01184,-0.25707 0.03149,-0.3615c0.01727,-0.09199 0.03271,-0.18232 0.13068,-0.29067c0.04773,-0.05276 0.11749,-0.08546 0.19049,-0.114c0.0777,-0.03036 0.16376,-0.05228 0.25348,-0.078c0.09399,-0.02693 0.19531,-0.04832 0.38934,-0.14133c0.10291,-0.04932 0.20178,-0.11667 0.3045,-0.186c0.10663,-0.07198 0.21503,-0.14935 0.33148,-0.222c0.11987,-0.07477 0.24329,-0.15697 0.5307,-0.25867c0.15192,-0.05376 0.31689,-0.08492 0.48596,-0.114c0.1723,-0.02964 0.34753,-0.05153 0.52203,-0.078c0.17285,-0.02621 0.34607,-0.04227 0.65863,-0.14133c0.14832,-0.04701 0.28595,-0.11616 0.42303,-0.186c0.14026,-0.07146 0.28375,-0.15067 0.44098,-0.222c0.16809,-0.07627 0.3526,-0.16115 0.80267,-0.25867c0.26227,-0.05682 0.55566,-0.08547 0.87152,-0.1095c0.33618,-0.02557 0.69092,-0.03843 1.06049,-0.0465c0.38141,-0.00833 0.77197,-0.00999 1.56799,-0.01067c0.40015,-0.00034 0.80133,0 1.20453,0c0.40613,0 0.81628,0 1.23145,0c0.4212,0 0.84937,-0.00032 1.73071,0c0.45496,0.00017 0.92004,-0.0002 1.39496,0.009c0.48511,0.0094 0.98041,0.0271 1.48505,0.063c0.51538,0.03666 1.04401,0.07384 2.12,0.26134c0.55768,0.09718 1.12451,0.23282 1.70398,0.39c0.59943,0.1626 1.21448,0.35448 1.84802,0.57c0.65924,0.22427 1.34271,0.46952 2.78131,1.04c0.76727,0.30426 1.56073,0.63686 2.38501,0.9855c0.85577,0.36196 1.74017,0.74325 2.65497,1.1385c0.94519,0.40839 1.91895,0.83327 3.96002,1.70933c1.06439,0.45686 2.16107,0.92152 3.28497,1.4085c1.15613,0.50095 2.34265,1.02319 3.55505,1.5795c1.24774,0.57254 2.53369,1.16103 5.15997,2.512c1.37213,0.70581 2.76324,1.47058 4.18048,2.27551c1.45355,0.82556 2.92798,1.69667 4.42352,2.6085c1.5282,0.9317 3.08209,1.89312 6.22931,3.94933c1.6156,1.05553 3.23999,2.15211 4.88104,3.2715c1.66034,1.13257 3.3288,2.28886 5.00696,3.4605c1.68921,1.17935 3.38171,2.37145 6.77869,4.768c1.69983,1.19923 3.39618,2.39762 5.091,3.5865c1.68658,1.18311 3.36505,2.35431 5.03699,3.5055c1.6554,1.13979 3.29022,2.26878 6.5387,4.408c1.58313,1.04253 3.14508,2.0392 4.66949,2.997c1.47174,0.92471 2.89087,1.79814 4.24646,2.619c1.27759,0.77361 2.47131,1.49071 4.58405,2.71734c0.89435,0.51924 1.68896,0.96973 2.39099,1.3575c0.61285,0.33851 1.14874,0.62532 1.617,0.8625c0.40271,0.20399 0.74957,0.37872 1.32532,0.61333c0.2334,0.09511 0.44122,0.16673 0.62402,0.2145c0.15613,0.0408 0.2926,0.06414 0.40796,0.0615c0.09772,-0.00224 0.19232,-0.01271 0.30133,-0.10933c0.05328,-0.04719 0.08551,-0.11752 0.11401,-0.19051c0.03033,-0.07771 0.05231,-0.16378 0.078,-0.25349c0.02692,-0.09395 0.04828,-0.1953 0.14136,-0.38934c0.04974,-0.10377 0.12097,-0.20825 0.19946,-0.327c0.09076,-0.13728 0.19836,-0.29673 0.31653,-0.489c0.13855,-0.22553 0.2995,-0.49072 0.65063,-1.184c0.21619,-0.42685 0.44244,-0.91831 0.68555,-1.47c0.26801,-0.60817 0.54779,-1.27835 0.8385,-2.01c0.31323,-0.78824 0.64423,-1.63514 1.30933,-3.52c0.36224,-1.02657 0.72198,-2.11224 1.09045,-3.2475c0.38232,-1.17804 0.76605,-2.39761 1.1535,-3.6525c0.3963,-1.28342 0.79492,-2.59207 1.58936,-5.26666c0.40228,-1.35437 0.80133,-2.72 1.20453,-4.095c0.40613,-1.385 0.81488,-2.78042 1.23145,-4.185c0.4198,-1.41542 0.84082,-2.84263 1.73071,-5.72c0.45032,-1.45618 0.9165,-2.91892 1.38599,-4.3905c0.47186,-1.47909 0.94879,-2.9632 1.422,-4.4535c0.47412,-1.49336 0.9541,-2.98681 1.85864,-5.98933c0.45117,-1.4976 0.88354,-2.99462 1.30054,-4.4865c0.4137,-1.48014 0.80902,-2.94961 1.18347,-4.4055c0.36914,-1.43515 0.72906,-2.84781 1.34937,-5.608c0.29956,-1.33287 0.56592,-2.63854 0.828,-3.9105c0.25525,-1.23871 0.49957,-2.44492 0.75598,-3.6135c0.24908,-1.13507 0.47559,-2.24248 1.08264,-4.30933c0.28955,-0.9857 0.62317,-1.92178 0.97205,-2.811c0.33435,-0.85207 0.68585,-1.65151 1.04395,-2.397c0.3371,-0.70169 0.66272,-1.35289 1.31738,-2.45867c0.28168,-0.47579 0.55511,-0.88977 0.81445,-1.248c0.23071,-0.31871 0.45068,-0.59049 0.6615,-0.816c0.18634,-0.19935 0.35773,-0.37338 0.69067,-0.60267c0.14063,-0.09685 0.27814,-0.1688 0.40955,-0.2055c0.11896,-0.03321 0.23987,-0.03585 0.3465,0.0015c0.11121,0.03895 0.2276,0.11518 0.41064,0.37067c0.11273,0.1573 0.20728,0.36102 0.32251,0.5895c0.13153,0.26081 0.27795,0.55835 0.45752,0.8865c0.20166,0.36848 0.42743,0.78229 1.05328,1.69067c0.36353,0.52759 0.79254,1.08141 1.26154,1.6755c0.50275,0.6368 1.0498,1.30461 1.63049,2.0085c0.61029,0.73983 1.25537,1.50788 2.60797,3.14933c0.71198,0.86404 1.44379,1.76202 2.19452,2.6985c0.77875,0.97145 1.57971,1.98637 2.40149,3.0495c0.85474,1.10578 1.74194,2.25875 3.57068,4.752c0.97137,1.32429 1.9599,2.71151 2.97601,4.1475c1.04535,1.47729 2.10828,2.99764 3.19202,4.5525c1.10364,1.58347 2.21851,3.1953 4.49866,6.46666c1.15356,1.65499 2.31482,3.31571 3.495,4.968c1.17981,1.65173 2.37048,3.28915 3.58496,4.896c1.20563,1.59515 2.39581,3.1812 4.92004,6.13599c1.23303,1.44332 2.50171,2.81114 3.77698,4.12051c1.2478,1.28116 2.50366,2.49554 3.75897,3.64349c1.21979,1.11549 2.41473,2.18547 4.79736,4.06934c1.12189,0.88708 2.23187,1.69363 3.31049,2.4435c1.03241,0.71777 2.03918,1.37619 3.01349,1.9845c0.92957,0.58038 1.82465,1.11858 3.50934,2.072c0.77728,0.4399 1.51813,0.84354 2.22003,1.215c0.6582,0.34834 1.27777,0.66451 1.85999,0.94501c0.53796,0.25919 1.03192,0.50042 1.91998,0.84c0.37726,0.14425 0.72229,0.25057 1.03351,0.3285c0.2771,0.06938 0.52838,0.11395 0.75452,0.1395c0.20306,0.02295 0.388,0.03037 0.71198,0.032c0.14532,0.00073 0.2829,0.0005 0.414,-0.009c0.12762,-0.00925 0.25403,-0.02747 0.37799,-0.063c0.12903,-0.03699 0.26672,-0.0854 0.54138,-0.26134c0.16071,-0.10296 0.32758,-0.24139 0.513,-0.4035c0.21228,-0.18555 0.44647,-0.40778 0.711,-0.66451c0.30096,-0.29211 0.63763,-0.62768 1.44263,-1.432c0.47485,-0.47447 0.99738,-0.99733 1.56604,-1.56599c0.61267,-0.61267 1.26733,-1.26734 1.96198,-1.96201c0.73267,-0.73267 1.50134,-1.50134 3.13867,-3.13866c0.86536,-0.86534 1.7627,-1.76268 2.69397,-2.694c0.96735,-0.96735 1.97272,-1.97268 3.01801,-3.018c1.08734,-1.08735 2.21893,-2.21844 4.62134,-4.62134c1.27863,-1.27888 2.62988,-2.6301 4.06952,-4.083c1.55658,-1.57095 3.24609,-3.28898 5.08649,-5.181c2.02295,-2.07968 4.24658,-4.37392 9.34399,-9.736c2.92596,-3.07789 6.03973,-6.38836 9.29553,-9.849c3.33484,-3.54467 6.68225,-7.11063 9.98846,-10.623c3.19751,-3.39692 6.21265,-6.62256 11.54938,-12.19467c2.17334,-2.26921 4.04279,-4.17982 5.62799,-5.7885c1.33252,-1.35226 2.46021,-2.47758 3.396,-3.4395c0.79883,-0.82113 1.51447,-1.53076 2.64264,-2.93867c0.5636,-0.70339 1.08447,-1.46054 1.59601,-2.2305c0.50983,-0.76745 0.98962,-1.53894 1.45203,-2.2935c0.44482,-0.72584 0.84723,-1.42617 1.61865,-2.64267c0.32935,-0.51934 0.63495,-0.96974 0.92401,-1.3485c0.25079,-0.32861 0.48267,-0.59973 0.70801,-0.7995c0.18939,-0.16791 0.36847,-0.3327 0.70129,-0.352c0.14667,-0.00851 0.29425,0.07086 0.41852,0.189c0.14679,0.13955 0.27588,0.3489 0.40948,0.603c0.15674,0.29814 0.31427,0.65612 0.672,1.54133c0.21375,0.529 0.44244,1.12308 0.69,1.7835c0.27271,0.7275 0.56311,1.52791 0.87,2.4045c0.33337,0.95232 0.69098,1.98444 1.44,4.312c0.41595,1.29255 0.84204,2.67498 1.28552,4.1415c0.46735,1.54543 0.94672,3.17011 1.43848,4.8705c0.51202,1.77058 1.03931,3.60962 2.10938,7.488c0.55951,2.02777 1.12061,4.11183 1.69501,6.243c0.58563,2.17282 1.17834,4.38244 1.78497,6.621c0.61334,2.26345 1.22723,4.54758 2.52002,9.136c0.64807,2.30014 1.31146,4.58801 1.98151,6.855c0.66199,2.23965 1.32611,4.43817 1.99048,6.585c0.64673,2.08981 1.27368,4.11269 2.52802,7.89333c0.58167,1.75317 1.15356,3.40543 1.71448,4.959c0.52893,1.46498 1.04681,2.83647 1.56152,4.113c0.48224,1.19596 0.93231,2.31645 1.89063,4.26133c0.42816,0.86893 0.86761,1.6503 1.2915,2.358c0.38892,0.64931 0.76733,1.22779 1.12054,1.746c0.31824,0.4669 0.62366,0.86937 1.08795,1.56267c0.18573,0.27739 0.33002,0.52288 0.44702,0.7335c0.09869,0.17757 0.17432,0.33115 0.24902,0.4545c0.06384,0.10543 0.12195,0.20972 0.30396,0.312c0.10327,0.05804 0.23651,0.08549 0.38104,0.10049c0.15704,0.0163 0.32825,0.01071 0.50696,-0.01649c0.18896,-0.02877 0.39148,-0.06638 0.77869,-0.25067c0.20679,-0.09841 0.40912,-0.23763 0.61798,-0.39899c0.22894,-0.17691 0.46753,-0.39027 0.72601,-0.633c0.28717,-0.26969 0.59808,-0.5779 1.32269,-1.30133c0.42023,-0.41956 0.87933,-0.87936 1.37549,-1.38c0.53448,-0.53931 1.10486,-1.11881 1.7085,-1.74c0.64014,-0.65874 1.3161,-1.35488 2.74933,-2.88c0.76758,-0.81677 1.55847,-1.67493 2.37598,-2.56651c0.84393,-0.92039 1.70789,-1.8705 2.59204,-2.8455c0.9032,-0.99599 1.82062,-2.0126 3.69867,-4.088c0.95477,-1.05514 1.91956,-2.1203 2.89948,-3.19051c0.98932,-1.08048 1.9931,-2.16671 3.01648,-3.25349c1.03296,-1.09692 2.07532,-2.20453 4.25067,-4.38934c1.10242,-1.10724 2.23413,-2.20329 3.37653,-3.3045c1.1496,-1.10815 2.31201,-2.21525 3.47552,-3.3315c1.16748,-1.12007 2.34521,-2.23594 4.64795,-4.53067c1.15198,-1.14801 2.28473,-2.31539 3.414,-3.486c1.12939,-1.17073 2.25165,-2.34833 3.37799,-3.522c1.12634,-1.17366 2.24493,-2.35493 4.54138,-4.65866c1.14734,-1.151 2.30817,-2.27869 3.47247,-3.3825c1.14917,-1.08948 2.29272,-2.14458 3.42749,-3.1575c1.10376,-0.98527 2.17261,-1.93874 4.26666,-3.62667c0.97021,-0.78205 1.91144,-1.48949 2.81104,-2.1345c0.84222,-0.60386 1.64233,-1.14418 2.39697,-1.6215c0.69318,-0.43842 1.32764,-0.83558 2.45868,-1.41067c0.46533,-0.23659 0.88171,-0.41553 1.24805,-0.543c0.31165,-0.10843 0.58374,-0.17735 0.81592,-0.201c0.19397,-0.01976 0.36914,-0.0284 0.60266,0.07734c0.09778,0.04424 0.17627,0.12757 0.24158,0.2355c0.08203,0.1355 0.15552,0.32652 0.25049,0.5685c0.11963,0.3049 0.25757,0.68717 0.67468,1.696c0.26929,0.65125 0.59412,1.39353 0.95691,2.2275c0.3999,0.91938 0.83643,1.91761 1.29907,2.9925c0.49219,1.1434 1.01465,2.34841 2.07727,4.94667c0.56104,1.37177 1.12195,2.7929 1.68604,4.257c0.57727,1.49854 1.15234,3.03282 1.72205,4.599c0.57776,1.58847 1.15833,3.19687 2.25867,6.47733c0.55457,1.65329 1.08887,3.32907 1.63196,5.0265c0.55286,1.72789 1.11401,3.49566 1.70398,5.3055c0.60791,1.86454 1.22998,3.79445 2.66406,7.83467c0.75928,2.13908 1.57361,4.31734 2.4209,6.50249c0.8407,2.1682 1.68945,4.27454 2.54712,6.2775c0.80713,1.88511 1.50684,3.64718 3.03198,6.38667c0.57886,1.03983 1.11865,1.84015 1.67542,2.316c0.42456,0.36288 0.90552,0.5074 1.28857,0.372c0.42041,-0.14861 0.80811,-0.56215 1.53601,-1.688c0.43811,-0.6776 0.84973,-1.47434 1.3125,-2.3415c0.50415,-0.94471 1.03735,-1.97327 1.62744,-3.0705c0.63135,-1.17395 1.29346,-2.43169 2.89331,-5.088c0.86743,-1.44024 1.82788,-2.92381 2.86951,-4.452c1.08716,-1.59499 2.26123,-3.2261 3.52649,-4.884c1.31067,-1.71733 2.67908,-3.48627 5.77075,-6.99734c1.61597,-1.83516 3.36023,-3.67007 5.20947,-5.544c1.93298,-1.95882 4.00867,-3.96764 6.22644,-6.048c2.34143,-2.19634 4.84216,-4.49507 10.39734,-9.408c3.02747,-2.67745 6.22412,-5.44318 9.52954,-8.2905c3.37061,-2.90344 6.78088,-5.81615 10.18652,-8.7135c3.35742,-2.85629 6.63428,-5.63268 12.78394,-10.82933c2.80103,-2.36692 5.41101,-4.57083 7.84509,-6.612c2.2594,-1.89463 4.35828,-3.64407 6.31494,-5.244c1.80701,-1.47762 3.46753,-2.84967 6.50671,-5.144c1.33899,-1.01079 2.59399,-1.8974 3.75452,-2.6775c1.04968,-0.7056 2.01038,-1.31144 2.88147,-1.8225c0.76611,-0.44949 1.43506,-0.83699 2.53064,-1.33333c0.40198,-0.1821 0.73047,-0.30577 0.99451,-0.3525c0.20081,-0.03555 0.36877,-0.0188 0.48145,0.0525c0.10913,0.06904 0.17664,0.19733 0.35742,0.46667c0.10645,0.1586 0.24097,0.32856 0.39001,0.5265c0.17114,0.22729 0.3645,0.49132 0.56995,0.8055c0.23523,0.35979 0.50098,0.77438 1.04004,1.83467c0.32202,0.63338 0.6438,1.3535 0.97192,2.151c0.35535,0.86363 0.7063,1.80338 1.04407,2.817c0.35767,1.07362 0.72644,2.21051 1.31726,4.69867c0.31433,1.32382 0.57288,2.71218 0.83252,4.1475c0.26733,1.47801 0.51929,2.99874 0.78748,4.5525c0.27344,1.58459 0.53113,3.20057 1.21338,6.46667c0.34644,1.6587 0.74695,3.32093 1.17151,4.9905c0.42749,1.68116 0.88586,3.36508 1.36047,5.0535c0.47644,1.69527 0.97021,3.3912 1.96802,6.78933c0.4989,1.69927 0.99756,3.39233 1.49548,5.073c0.4928,1.66332 0.98132,3.30269 1.46851,4.911c0.47668,1.57368 0.93835,3.10791 1.86938,6.016c0.43909,1.3717 0.87451,2.68053 1.30493,3.9255c0.40991,1.18564 0.81323,2.30623 1.21509,3.3585c0.37854,0.99129 0.7312,1.92355 1.47998,3.54934c0.33228,0.72144 0.66992,1.36883 1.00049,1.94849c0.30103,0.52802 0.59619,0.99416 0.88342,1.39951c0.25732,0.36324 0.4928,0.68489 0.94934,1.152c0.18347,0.18772 0.35791,0.3323 0.51904,0.438c0.13843,0.09083 0.27063,0.15202 0.39294,0.186c0.11084,0.03082 0.21875,0.04066 0.42139,0.04266c0.10022,0.00098 0.20215,0.00011 0.30444,-0.018c0.1073,-0.019 0.22046,-0.05828 0.33154,-0.126c0.12622,-0.07695 0.26538,-0.18421 0.53064,-0.52267c0.16663,-0.21259 0.32886,-0.48297 0.52649,-0.789c0.22778,-0.35268 0.48962,-0.75601 0.80554,-1.203c0.35779,-0.50618 0.76392,-1.07651 1.83472,-2.34133c0.62634,-0.73981 1.3457,-1.51669 2.1239,-2.3475c0.8269,-0.88274 1.70862,-1.79908 2.62805,-2.75249c0.94983,-0.98494 1.9314,-1.98754 3.91467,-4.06667c1.00342,-1.05191 2.00281,-2.11852 3.00903,-3.1905c1.01245,-1.07869 2.0304,-2.1657 3.06299,-3.2535c1.04016,-1.09588 2.08459,-2.20452 4.26135,-4.38933c1.10242,-1.10656 2.23108,-2.2011 3.37646,-3.2865c1.14661,-1.08663 2.30603,-2.15651 3.47546,-3.2055c1.16162,-1.042 2.31592,-2.07125 4.64807,-4.008c1.13684,-0.94411 2.27148,-1.84489 3.396,-2.706c1.09705,-0.84008 2.18091,-1.63645 3.25195,-2.382c1.03662,-0.72154 2.03967,-1.41763 4.01868,-2.57867c0.92432,-0.5423 1.82825,-1.01189 2.6925,-1.4295c0.80945,-0.39111 1.57471,-0.72556 2.28748,-1.0065c0.64587,-0.25457 1.224,-0.48334 2.18665,-0.73067c0.35852,-0.09212 0.65649,-0.14838 0.88049,-0.102c0.18323,0.03793 0.32654,0.17619 0.40356,0.366c0.0957,0.23591 0.12646,0.55707 0.21594,1.40266c0.05713,0.53934 0.11938,1.15658 0.2085,1.8465c0.09839,0.76218 0.22107,1.59238 0.37952,2.4855c0.17004,0.95806 0.35388,1.98043 0.91199,4.168c0.3009,1.17933 0.66772,2.3977 1.0575,3.6615c0.40344,1.30828 0.83862,2.65094 1.28259,4.0305c0.45435,1.41144 0.9325,2.84613 1.82666,5.808c0.45483,1.50674 0.88635,3.03596 1.30945,4.581c0.42615,1.55629 0.83911,3.12661 1.24646,4.707c0.40906,1.58695 0.81018,3.18112 1.61072,6.37867c0.40051,1.59956 0.79932,3.19753 1.19995,4.791c0.39929,1.58786 0.79858,3.1677 1.20007,4.737c0.39856,1.55804 0.79272,3.10323 1.59998,6.13866c0.39612,1.48961 0.79443,2.95013 1.19104,4.374c0.38477,1.38145 0.76355,2.71046 1.13696,3.978c0.354,1.20173 0.68262,2.33142 1.33862,4.31467c0.28235,0.85369 0.5542,1.61133 0.81909,2.277c0.23474,0.59005 0.46179,1.10358 0.69299,1.53899c0.20288,0.38214 0.38403,0.7267 0.82129,1.18401c0.18628,0.19478 0.39404,0.33678 0.59998,0.438c0.19495,0.09581 0.39856,0.15316 0.59998,0.186c0.19897,0.03245 0.40002,0.04196 0.80005,0.04266c0.20361,0.00036 0.43103,-0.00565 0.69897,-0.054c0.33826,-0.06103 0.7627,-0.18649 1.29297,-0.378c0.67017,-0.24206 1.49463,-0.57139 3.67468,-1.568c1.41711,-0.64782 3.05115,-1.44051 4.9126,-2.3715c2.10583,-1.05322 4.44727,-2.26373 7.02747,-3.6405c2.84204,-1.51651 5.94604,-3.19109 12.89331,-7.15466c3.88953,-2.21906 7.98352,-4.63321 12.28955,-7.12051c4.44983,-2.5703 9.00696,-5.17938 13.6665,-7.7235c4.66357,-2.54635 9.2655,-5.13206 18.54395,-9.32267c4.39563,-1.9853 8.71301,-3.63119 12.86548,-5.0685c3.93323,-1.36141 7.68689,-2.489 11.21851,-3.4395c3.2666,-0.87918 6.27405,-1.60926 11.41602,-2.65867c2.08557,-0.42564 3.87341,-0.74588 5.38647,-0.9765c1.2594,-0.19196 2.29968,-0.31667 3.14551,-0.3555c0.6759,-0.03104 1.22949,-0.05536 1.96802,0.16533c0.28003,0.08368 0.50122,0.22145 0.65698,0.3765c0.14014,0.13953 0.22937,0.30721 0.27905,0.4755c0.04822,0.16359 0.05994,0.33192 0.06396,0.648c0.00183,0.14549 0,0.284 0,0.4185c0,0.1335 0,0.269 0,0.4095c0,0.1485 0.00037,0.308 0,0.672c-0.00024,0.21067 -0.00037,0.4454 -0.00903,0.708c-0.00977,0.29477 -0.02893,0.62566 -0.06299,0.996c-0.03821,0.41507 -0.08582,0.87933 -0.26135,1.96267c-0.10229,0.63109 -0.23608,1.31918 -0.3855,2.0655c-0.16101,0.80439 -0.34253,1.66391 -0.53845,2.5785c-0.20764,0.96909 -0.43103,1.99059 -0.9093,4.18934c-0.25549,1.17429 -0.51929,2.39513 -0.79956,3.657c-0.28894,1.30082 -0.59167,2.63575 -0.9165,3.999c-0.33154,1.39146 -0.66687,2.80872 -1.45068,5.67733c-0.39868,1.45918 -0.83472,2.93 -1.29443,4.422c-0.46948,1.52406 -0.97156,3.07958 -1.50146,4.674c-0.54626,1.64365 -1.12109,3.33888 -2.37073,6.904c-0.66162,1.8877 -1.36182,3.85163 -2.11206,5.8965c-0.7854,2.14059 -1.62854,4.37799 -2.54395,6.7155c-0.96216,2.45705 -1.98096,5.0402 -4.34399,10.55467c-1.27417,2.97346 -2.65234,6.04797 -4.10095,9.204c-1.47925,3.22279 -3.01123,6.46889 -4.58704,9.70799c-1.56824,3.22357 -3.11731,6.40527 -6.31201,12.42134c-1.5105,2.84445 -3.02661,5.5379 -4.49695,8.11499c-1.41272,2.47609 -2.79761,4.84164 -4.11902,7.125c-1.27319,2.20004 -2.53516,4.3051 -4.71741,8.42667c-1.0415,1.96703 -1.98254,3.91573 -2.87097,5.82451c-0.86609,1.86076 -1.67371,3.69499 -2.45703,5.4915c-0.76733,1.75986 -1.48962,3.50052 -3.00525,6.85066c-0.74231,1.6409 -1.51074,3.24519 -2.28149,4.82401c-0.76147,1.55984 -1.53064,3.09286 -2.29053,4.608c-0.7511,1.49753 -1.5083,2.97073 -2.92798,5.90132c-0.69812,1.44099 -1.36584,2.87599 -2.01001,4.30051c-0.63586,1.4062 -1.24573,2.80124 -1.83008,4.1835c-0.57556,1.36147 -1.13574,2.7045 -2.15991,5.34933c-0.49805,1.28621 -0.96326,2.55313 -1.41907,3.78749c-0.44275,1.19897 -0.86768,2.36023 -1.29297,3.4725c-0.40759,1.06599 -0.7793,2.09109 -1.62134,3.90666c-0.38245,0.82463 -0.78906,1.57663 -1.20447,2.26651c-0.39465,0.6553 -0.80762,1.26083 -1.23157,1.8255c-0.41272,0.54962 -0.83911,1.07426 -1.73059,2.07466c-0.44958,0.50456 -0.91626,1.00104 -1.38599,1.5c-0.47168,0.50104 -0.94788,0.99954 -1.422,1.5c-0.47327,0.49954 -0.94897,0.99309 -1.85876,2c-0.44873,0.49663 -0.88293,0.99754 -1.30493,1.5c-0.41797,0.49759 -0.82324,0.99753 -1.21509,1.5c-0.38806,0.49756 -0.76965,0.99303 -1.47998,2c-0.35022,0.49644 -0.68323,0.99823 -1.01392,1.4955c-0.328,0.49339 -0.65063,0.98509 -0.97803,1.46851c-0.32532,0.48027 -0.64331,0.96227 -1.34131,1.86934c-0.34741,0.45154 -0.71777,0.88733 -1.09509,1.323c-0.38257,0.44171 -0.78052,0.88474 -1.18494,1.341c-0.41577,0.46906 -0.85107,0.94806 -1.71997,2.00266c-0.46082,0.55933 -0.92004,1.15225 -1.3905,1.76251c-0.48035,0.62305 -0.9624,1.25934 -1.45349,1.89749c-0.49255,0.64017 -0.97742,1.28424 -1.98938,2.50665c-0.49316,0.59573 -0.99548,1.16434 -1.49097,1.71902c-0.48584,0.54395 -0.96875,1.07147 -1.43701,1.59299c-0.45898,0.51114 -0.91797,1.00507 -1.73865,2.02133c-0.39856,0.49353 -0.76733,0.9967 -1.11902,1.5c-0.34705,0.49677 -0.67566,0.99817 -0.99304,1.5c-0.31519,0.4982 -0.61938,0.99957 -1.22131,2c-0.30054,0.49945 -0.59888,0.99884 -0.90454,1.491c-0.30371,0.48917 -0.61145,0.97064 -0.93152,1.43701c-0.31641,0.461 -0.62683,0.92007 -1.33057,1.73865c-0.34424,0.40048 -0.71716,0.77097 -1.09509,1.13702c-0.38196,0.37 -0.78149,0.7363 -1.18494,1.11899c-0.41675,0.39526 -0.8584,0.79886 -1.71997,1.74399c-0.46472,0.50977 -0.92029,1.06723 -1.38159,1.6485c-0.47083,0.59335 -0.93311,1.20407 -1.3905,1.81952c-0.45361,0.61023 -0.89099,1.21533 -1.72791,2.36533c-0.39026,0.53632 -0.76514,1.04819 -1.12805,1.54199c-0.35437,0.48218 -0.70544,0.95789 -1.05603,1.43402c-0.35474,0.48187 -0.71875,0.97488 -1.48267,2.02399c-0.41016,0.56326 -0.83411,1.151 -1.27197,1.75351c-0.44482,0.61215 -0.89307,1.22684 -1.34399,1.8345c-0.44373,0.59799 -0.87207,1.18298 -1.71729,2.24533c-0.38562,0.48468 -0.76038,0.92862 -1.11902,1.3425c-0.34021,0.3927 -0.67249,0.7619 -0.99304,1.11749c-0.31201,0.34607 -0.625,0.68115 -1.22131,1.37332c-0.30334,0.35208 -0.60168,0.71732 -0.90002,1.09052c-0.30164,0.37741 -0.60095,0.76291 -0.90002,1.1535c-0.3009,0.39307 -0.60022,0.7905 -1.19995,1.58932c-0.30017,0.39978 -0.59924,0.79919 -0.90002,1.1955c-0.29919,0.39435 -0.59851,0.78479 -0.90002,1.16852c-0.29846,0.37994 -0.59314,0.75641 -1.19995,1.46933c-0.29651,0.34833 -0.59924,0.68344 -0.89551,1.01849c-0.29443,0.33298 -0.5874,0.66589 -0.86853,1.00949c-0.28259,0.34543 -0.57251,0.69363 -1.06934,1.47202c-0.25671,0.40222 -0.48584,0.83298 -0.71399,1.272c-0.23059,0.44363 -0.45105,0.89545 -0.67798,1.34399c-0.22571,0.44611 -0.43652,0.89587 -0.94128,1.71732c-0.24402,0.397 -0.51221,0.76553 -0.78149,1.11902c-0.26294,0.34515 -0.53149,0.67227 -0.79053,0.99298c-0.25195,0.31195 -0.5105,0.6058 -0.92798,1.22134c-0.19934,0.29395 -0.36768,0.59607 -0.51904,0.89551c-0.14722,0.29138 -0.27502,0.58267 -0.39294,0.8685c-0.11462,0.27792 -0.21497,0.55219 -0.42139,1.06934c-0.09814,0.24588 -0.19873,0.48187 -0.30005,0.7095c-0.09875,0.22171 -0.19922,0.43668 -0.29993,0.64648c-0.09924,0.20654 -0.19958,0.40961 -0.40002,0.81067c-0.09998,0.19995 -0.19946,0.39963 -0.30444,0.59549c-0.10437,0.19482 -0.21289,0.38593 -0.33154,0.56851c-0.11768,0.18115 -0.23486,0.36411 -0.53064,0.66934c-0.14758,0.15234 -0.31482,0.28415 -0.48157,0.414c-0.16541,0.12881 -0.33301,0.25003 -0.49048,0.37799c-0.15356,0.12479 -0.31616,0.24011 -0.52795,0.54132c-0.10315,0.14682 -0.16992,0.31708 -0.22803,0.49051c-0.05933,0.17734 -0.104,0.36404 -0.15601,0.5535c-0.05334,0.19424 -0.09607,0.40012 -0.28271,0.78934c-0.09863,0.2056 -0.23242,0.40256 -0.37646,0.60001c-0.14783,0.20267 -0.31042,0.40051 -0.47546,0.60001c-0.16589,0.2005 -0.34033,0.39362 -0.64807,0.79999c-0.14917,0.19699 -0.28381,0.39841 -0.40942,0.60001c-0.12366,0.19846 -0.23792,0.39914 -0.34656,0.60001c-0.10779,0.19916 -0.20984,0.39975 -0.41064,0.79999c-0.10022,0.19971 -0.19934,0.39896 -0.30005,0.59549c-0.09949,0.19412 -0.19861,0.38437 -0.29993,0.56851c-0.09875,0.17953 -0.19336,0.35498 -0.40002,0.66934c-0.0968,0.14722 -0.19788,0.28186 -0.29553,0.40948c-0.09314,0.1217 -0.18457,0.2356 -0.26843,0.3465c-0.07983,0.10547 -0.16162,0.20331 -0.26941,0.41068c-0.05054,0.09726 -0.08411,0.19818 -0.11401,0.2955c-0.02869,0.09341 -0.0509,0.1842 -0.078,0.26849c-0.02551,0.07938 -0.04333,0.1629 -0.14124,0.26935c-0.0481,0.05228 -0.11646,0.08502 -0.18604,0.11398c-0.07166,0.02982 -0.14783,0.05145 -0.22205,0.078c-0.07312,0.02612 -0.1532,0.04385 -0.25867,0.14133c-0.05225,0.04834 -0.08557,0.11795 -0.11841,0.19052c-0.03528,0.07806 -0.06665,0.16479 -0.1095,0.25348c-0.04602,0.09515 -0.0946,0.20258 -0.27209,0.38934c-0.10205,0.10736 -0.23328,0.20184 -0.37195,0.29999c-0.14404,0.10193 -0.29529,0.1991 -0.44397,0.30002c-0.146,0.09912 -0.29614,0.18527 -0.51733,0.39999c-0.0968,0.09396 -0.16833,0.1976 -0.22351,0.29999c-0.05273,0.09787 -0.08899,0.20001 -0.12451,0.30002l-0.03357,0.10001l-0.03442,0.09998" id="svg_3" stroke-width="20" stroke="#000000" fill="none"/>
+ </g>
+</svg>
diff --git a/client/public/images/pieces/Knightmate/bn.svg b/client/public/images/pieces/Knightmate/bk.svg
similarity index 100%
rename from client/public/images/pieces/Knightmate/bn.svg
rename to client/public/images/pieces/Knightmate/bk.svg
diff --git a/client/public/images/pieces/Knightmate/wn.svg b/client/public/images/pieces/Knightmate/wk.svg
similarity index 100%
rename from client/public/images/pieces/Knightmate/wn.svg
rename to client/public/images/pieces/Knightmate/wk.svg
diff --git a/client/src/base_rules.js b/client/src/base_rules.js
index 8b49436c..149bb4d2 100644
--- a/client/src/base_rules.js
+++ b/client/src/base_rules.js
@@ -1114,30 +1114,17 @@ export const ChessRules = class ChessRules {
     return 3;
   }
 
-  // NOTE: works also for extinction chess because depth is 3...
   getComputerMove() {
     const maxeval = V.INFINITY;
     const color = this.turn;
     // Some variants may show a bigger moves list to the human (Switching),
     // thus the argument "computer" below (which is generally ignored)
-    let moves1 = this.getAllValidMoves("computer");
+    let moves1 = this.getAllValidMoves();
 
     if (moves1.length == 0)
       // TODO: this situation should not happen
       return null;
 
-    // Can I mate in 1 ? (for Magnetic & Extinction)
-    for (let i of shuffle(ArrayFun.range(moves1.length))) {
-      this.play(moves1[i]);
-      let finish = Math.abs(this.evalPosition()) >= V.THRESHOLD_MATE;
-      if (!finish) {
-        const score = this.getCurrentScore();
-        if (["1-0", "0-1"].includes(score)) finish = true;
-      }
-      this.undo(moves1[i]);
-      if (finish) return moves1[i];
-    }
-
     // Rank moves using a min-max at depth 2
     for (let i = 0; i < moves1.length; i++) {
       // Initial self evaluation is very low: "I'm checkmated"
@@ -1149,7 +1136,7 @@ export const ChessRules = class ChessRules {
         // Initial enemy evaluation is very low too, for him
         eval2 = (color == "w" ? 1 : -1) * maxeval;
         // Second half-move:
-        let moves2 = this.getAllValidMoves("computer");
+        let moves2 = this.getAllValidMoves();
         for (let j = 0; j < moves2.length; j++) {
           this.play(moves2[j]);
           const score2 = this.getCurrentScore();
@@ -1185,6 +1172,7 @@ export const ChessRules = class ChessRules {
     moves1.sort((a, b) => {
       return (color == "w" ? 1 : -1) * (b.eval - a.eval);
     });
+//    console.log(moves1.map(m => { return [this.getNotation(m), m.eval]; }));
 
     let candidates = [0]; //indices of candidates moves
     for (let j = 1; j < moves1.length && moves1[j].eval == moves1[0].eval; j++)
@@ -1225,7 +1213,7 @@ export const ChessRules = class ChessRules {
     if (score != "*")
       return score == "1/2" ? 0 : (score == "1-0" ? 1 : -1) * maxeval;
     if (depth == 0) return this.evalPosition();
-    const moves = this.getAllValidMoves("computer");
+    const moves = this.getAllValidMoves();
     let v = color == "w" ? -maxeval : maxeval;
     if (color == "w") {
       for (let i = 0; i < moves.length; i++) {
diff --git a/client/src/translations/en.js b/client/src/translations/en.js
index ff178cd4..c8074575 100644
--- a/client/src/translations/en.js
+++ b/client/src/translations/en.js
@@ -5,6 +5,7 @@ export const translations = {
   "Accept challenge?": "Accept challenge?",
   Analyse: "Analyse",
   "Analysis mode": "Analysis mode",
+  "Analysis disabled for this variant": "Analysis disabled for this variant",
   "Any player": "Any player",
   Apply: "Apply",
   "Are you sure?": "Are you sure?",
@@ -52,7 +53,9 @@ export const translations = {
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "Logout successful!",
+  "Mispelled variant name": "Mispelled variant name",
   "Missing email": "Missing email",
+  "Missing FEN": "Missing FEN",
   "Missing instructions": "Missing instructions",
   "Missing name": "Missing name",
   "Missing solution": "Missing solution",
@@ -89,7 +92,7 @@ export const translations = {
   "participant(s):": "participant(s):",
   Refuse: "Refuse",
   Register: "Register",
-  "Registration complete! Please check your emails": "Registration complete! Please check your emails",
+  "Registration complete! Please check your emails now": "Registration complete! Please check your emails now",
   "Remove game?": "Remove game?",
   Resign: "Resign",
   "Resign the game?": "Resign the game?",
@@ -145,13 +148,16 @@ export const translations = {
   "Keep antiking in check": "Keep antiking in check",
   "King crosses the board": "King crosses the board",
   "Laws of attraction": "Laws of attraction",
+  "Long jumps over pieces": "Long jumps over pieces",
   "Lose all pieces": "Lose all pieces",
   "Mate any piece": "Mate any piece",
+  "Mate the knight": "Mate the knight",
   "Middle battle": "Middle battle",
   "Move like a knight": "Move like a knight",
   "Move twice": "Move twice",
   "Neverending rows": "Neverending rows",
   "Pawns move diagonally": "Pawns move diagonally",
+  "Queen disguised as a pawn": "Queen disguised as a pawn",
   "Reuse pieces": "Reuse pieces",
   "Reverse captures": "Reverse captures",
   "Run forward": "Run forward",
diff --git a/client/src/translations/es.js b/client/src/translations/es.js
index eb08331d..3c63ffb7 100644
--- a/client/src/translations/es.js
+++ b/client/src/translations/es.js
@@ -5,6 +5,7 @@ export const translations = {
   "Accept challenge?": "¿Acceptar el desafío?",
   Analyse: "Analizar",
   "Analysis mode": "Modo análisis",
+  "Analysis disabled for this variant": "Análisis deshabilitado para esta variante",
   "Any player": "Cualquier jugador",
   Apply: "Aplicar",
   "Are you sure?": "¿Está usted seguro?",
@@ -52,7 +53,9 @@ export const translations = {
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "¡Desconexión exitosa!",
+  "Mispelled variant name": "Variante mal escrita",
   "Missing email": "Email falta",
+  "Missing FEN": "FEN falta",
   "Missing instructions": "Instrucciones faltan",
   "Missing name": "Nombre falta",
   "Missing solution": "Solución falta",
@@ -89,7 +92,7 @@ export const translations = {
   "participant(s):": "participante(s):",
   Refuse: "Rechazar",
   Register: "Registrarse",
-  "Registration complete! Please check your emails": "¡Registro completo! Por favor revise sus correos electrónicos",
+  "Registration complete! Please check your emails now": "¡Registro completo! Revise sus correos electrónicos ahora",
   "Remove game?": "¿Eliminar la partida?",
   Resign: "Abandonar",
   "Resign the game?": "¿Abandonar la partida?",
@@ -145,13 +148,16 @@ export const translations = {
   "Keep antiking in check": "Mantener el antirey en jaque",
   "King crosses the board": "El rey cruza el tablero",
   "Laws of attraction": "Las leyes de las atracciones",
+  "Long jumps over pieces": "Saltos largos sobre las piezas",
   "Lose all pieces": "Perder todas las piezas",
   "Mate any piece": "Matar cualquier pieza",
+  "Mate the knight": "Matar el caballo",
   "Middle battle": "Batalla media",
   "Move like a knight": "Moverse como un caballo",
   "Move twice": "Mover dos veces",
   "Neverending rows": "Filas interminables",
   "Pawns move diagonally": "Peones se mueven en diagonal",
+  "Queen disguised as a pawn": "Reina disfrazada de peón",
   "Reuse pieces": "Reutilizar piezas",
   "Reverse captures": "Capturas invertidas",
   "Run forward": "Correr hacia adelante",
diff --git a/client/src/translations/fr.js b/client/src/translations/fr.js
index 6e37e605..c7246814 100644
--- a/client/src/translations/fr.js
+++ b/client/src/translations/fr.js
@@ -5,6 +5,7 @@ export const translations = {
   "Accept challenge?": "Accepter le défi ?",
   Analyse: "Analyser",
   "Analysis mode": "Mode analyse",
+  "Analysis disabled for this variant": "Analyse désactivée pour cette variante",
   "Any player": "N'importe qui",
   Apply: "Appliquer",
   "Authentication successful!": "Authentification réussie !",
@@ -52,7 +53,9 @@ export const translations = {
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "Déconnection réussie !",
+  "Mispelled variant name": "Variante mal orthographiée",
   "Missing email": "Email manquant",
+  "Missing FEN": "FEN manquante",
   "Missing instructions": "Instructions manquantes",
   "Missing name": "Nom manquant",
   "Missing solution": "Solution manquante",
@@ -89,7 +92,7 @@ export const translations = {
   "participant(s):": "participant(s) :",
   Refuse: "Refuser",
   Register: "S'enregistrer",
-  "Registration complete! Please check your emails": "Enregistrement terminé ! Allez voir vos emails",
+  "Registration complete! Please check your emails now": "Enregistrement terminé ! Allez voir vos emails maintenant",
   "Remove game?": "Supprimer la partie ?",
   Resign: "Abandonner",
   "Resign the game?": "Abandonner la partie ?",
@@ -145,13 +148,16 @@ export const translations = {
   "Keep antiking in check": "Gardez l'antiroi en échec",
   "King crosses the board": "Le roi traverse l'échiquier",
   "Laws of attraction": "Les lois de l'attraction",
+  "Long jumps over pieces": "Sauts longs par dessus les pièces",
   "Lose all pieces": "Perdez toutes les pièces",
-  "Mate any piece": "Mater n'importe quelle pièce",
+  "Mate any piece": "Matez n'importe quelle pièce",
+  "Mate the knight": "Matez le cavalier",
   "Middle battle": "Bataille du milieu",
   "Move like a knight": "Bougez comme un cavalier",
   "Move twice": "Jouer deux coups",
   "Neverending rows": "Rangées sans fin",
   "Pawns move diagonally": "Les pions vont en diagonale",
+  "Queen disguised as a pawn": "Reine déguisée en pion",
   "Reuse pieces": "Réutiliser les pièces",
   "Reverse captures": "Captures inversées",
   "Run forward": "Courir vers l'avant",
diff --git a/client/src/translations/rules/Enpassant/en.pug b/client/src/translations/rules/Enpassant/en.pug
index 7ec2cc2e..c2136cf0 100644
--- a/client/src/translations/rules/Enpassant/en.pug
+++ b/client/src/translations/rules/Enpassant/en.pug
@@ -29,6 +29,17 @@ figure.diagram-container
     Possible knightrider moves after 1.d3 g6 2.Nc3 Bg7.
     If 3.Nxd7, 3...Bxe5 e.p. is possible.
 
+p.
+  Due to the extended knight movement, a capture, check or even checkmate
+  could be played at move 1. On the following diagram 1.Nxe7 is mate,
+  and black in turn could play 1...Nxg2 trapping the queen.
+  Consequently, captures are disabled at move 1.
+
+figure.diagram-container
+  .diagram
+    | fen:nbqnbrkr/pppppppp/8/8/8/8/PPPPPPPP/RNKBQNBR:
+  figcaption 1.Nxe7# and 1...Nxg2: "knightriders' anomalies".
+
 h3 Source
 
 p
diff --git a/client/src/translations/rules/Enpassant/es.pug b/client/src/translations/rules/Enpassant/es.pug
index 1c501597..cb4dc791 100644
--- a/client/src/translations/rules/Enpassant/es.pug
+++ b/client/src/translations/rules/Enpassant/es.pug
@@ -31,6 +31,18 @@ figure.diagram-container
     Posibles jugadas de caballero después de 1.d3 g6 2.Nc3 Bg7.
     Si 3.Nxd7, 3...Bxe5 e.p. es posible.
 
+p.
+  Los movimientos del caballo se incrementan, una captura,
+  un jaque o incluso un jaque mate sería posible en el primer movimiento.
+  En el diagrama a continuación 1.Nxe7 es mate, y las negras al turno
+  podría jugar 1...Nxg2 atrapando a la dama.
+  Es por eso que las capturas solo están autorizadas desde el segundo movimiento.
+
+figure.diagram-container
+  .diagram
+    | fen:nbqnbrkr/pppppppp/8/8/8/8/PPPPPPPP/RNKBQNBR:
+  figcaption 1.Nxe7# y 1...Nxg2: "anomalías de caballeros".
+
 h3 Fuente
 
 p
diff --git a/client/src/translations/rules/Enpassant/fr.pug b/client/src/translations/rules/Enpassant/fr.pug
index 6dd1e14f..a4178bf4 100644
--- a/client/src/translations/rules/Enpassant/fr.pug
+++ b/client/src/translations/rules/Enpassant/fr.pug
@@ -31,6 +31,18 @@ figure.diagram-container
     Possibles coups de chevalier après 1.d3 g6 2.Nc3 Bg7.
     Si 3.Nxd7, 3...Bxe5 e.p. est possible.
 
+p.
+  Les déplacements du cavalier étant augmentés, une capture,
+  un échec ou même un mat seraient possibles au premier coup.
+  Sur le diagramme ci-dessous 1.Nxe7 fait mat, et les noirsau trait
+  pourraient jouer 1...Nxg2 piégeant la dame.
+  C'est pourquoi les captures ne sont autorisées qu'à partir du second coup.
+
+figure.diagram-container
+  .diagram
+    | fen:nbqnbrkr/pppppppp/8/8/8/8/PPPPPPPP/RNKBQNBR:
+  figcaption 1.Nxe7# et 1...Nxg2 : "anomalies de chevaliers".
+
 h3 Source
 
 p
diff --git a/client/src/translations/rules/Grasshopper/en.pug b/client/src/translations/rules/Grasshopper/en.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Grasshopper/en.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Grasshopper/es.pug b/client/src/translations/rules/Grasshopper/es.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Grasshopper/es.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Grasshopper/fr.pug b/client/src/translations/rules/Grasshopper/fr.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Grasshopper/fr.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Hiddenqueen/en.pug b/client/src/translations/rules/Hiddenqueen/en.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Hiddenqueen/en.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Hiddenqueen/es.pug b/client/src/translations/rules/Hiddenqueen/es.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Hiddenqueen/es.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Hiddenqueen/fr.pug b/client/src/translations/rules/Hiddenqueen/fr.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Hiddenqueen/fr.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Knightmate/en.pug b/client/src/translations/rules/Knightmate/en.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Knightmate/en.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Knightmate/es.pug b/client/src/translations/rules/Knightmate/es.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Knightmate/es.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Knightmate/fr.pug b/client/src/translations/rules/Knightmate/fr.pug
new file mode 100644
index 00000000..4f56997b
--- /dev/null
+++ b/client/src/translations/rules/Knightmate/fr.pug
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Rifle/en.pug b/client/src/translations/rules/Rifle/en.pug
index 1b0248de..f168ce9b 100644
--- a/client/src/translations/rules/Rifle/en.pug
+++ b/client/src/translations/rules/Rifle/en.pug
@@ -14,7 +14,7 @@ figure.diagram-container
 
 p.
   This "small" difference alters the strategy a lot: guarding pieces is useless,
-  for example, and the king cannot escape a check by capturing.
+  for example, and the king cannot escape a distant check by capturing.
 
 h3 Source
 
diff --git a/client/src/translations/rules/Rifle/es.pug b/client/src/translations/rules/Rifle/es.pug
index 7e714ed3..5314cfcd 100644
--- a/client/src/translations/rules/Rifle/es.pug
+++ b/client/src/translations/rules/Rifle/es.pug
@@ -14,7 +14,7 @@ figure.diagram-container
 
 p.
   Esta "pequeña" diferencia altera enormemente la estrategia: defender las piezas
-  es inútil, por ejemplo, y el rey no puede escapar un jaque capturando.
+  es inútil, por ejemplo, y el rey no puede escapar un jaque remota capturando.
 
 h3 Fuente
 
diff --git a/client/src/translations/rules/Rifle/fr.pug b/client/src/translations/rules/Rifle/fr.pug
index cc9bf481..0f0bb3a7 100644
--- a/client/src/translations/rules/Rifle/fr.pug
+++ b/client/src/translations/rules/Rifle/fr.pug
@@ -14,7 +14,7 @@ figure.diagram-container
 
 p.
   Cette "petite" différence altère beaucoup la stratégie : défendre les pièces
-  est inutile, par exemple, et le roi ne pas échapper à un échec en capturant.
+  est inutile, par exemple, et le roi ne pas échapper à un échec distant en capturant.
 
 h3 Source
 
diff --git a/client/src/translations/rules/Wormhole/es.pug b/client/src/translations/rules/Wormhole/es.pug
index 0dd6dd6f..1ba5ae02 100644
--- a/client/src/translations/rules/Wormhole/es.pug
+++ b/client/src/translations/rules/Wormhole/es.pug
@@ -19,9 +19,9 @@ p.
   El rey negro puede ir a c6: se mueve hacia la casilla no desaparecida
   más cercano (si lo hay).
 
-figure.diagram de contenedores
+figure.diagram-container
   .diagram
-    | fen: rbkxxxbn / ppxppppx / 2qxxB2 / 4x2p / 3P1x2 / 3n1x2 / PPPxPPPP / RBxxxNKR b2, f2, b4, c5, g5, f6:
+    | fen:rbkxxxbn/ppxppppx/2qxxB2/4x2p/3P1x2/3n1x2/PPPxPPPP/RBxxxNKR b2,f2,b4,c5,g5,f6:
   figcaption Posibles movimientos para el caballo en d3.
 
 p.
diff --git a/client/src/variants/Alice.js b/client/src/variants/Alice.js
index a92338f7..aa956928 100644
--- a/client/src/variants/Alice.js
+++ b/client/src/variants/Alice.js
@@ -282,14 +282,17 @@ export const VariantRules = class AliceRules extends ChessRules {
   }
 
   static get VALUES() {
-    return Object.assign(ChessRules.VALUES, {
-      s: 1,
-      u: 5,
-      o: 3,
-      c: 3,
-      t: 9,
-      l: 1000
-    });
+    return Object.assign(
+      {
+        s: 1,
+        u: 5,
+        o: 3,
+        c: 3,
+        t: 9,
+        l: 1000
+      },
+      ChessRules.VALUES
+    );
   }
 
   getNotation(move) {
diff --git a/client/src/variants/Antiking.js b/client/src/variants/Antiking.js
index f07f6268..21e37f4b 100644
--- a/client/src/variants/Antiking.js
+++ b/client/src/variants/Antiking.js
@@ -145,7 +145,10 @@ export const VariantRules = class AntikingRules extends ChessRules {
   }
 
   static get VALUES() {
-    return Object.assign(ChessRules.VALUES, { a: 1000 });
+    return Object.assign(
+      { a: 1000 },
+      ChessRules.VALUES
+    );
   }
 
   static GenRandInitFen() {
diff --git a/client/src/variants/Enpassant.js b/client/src/variants/Enpassant.js
index 374a620c..3f8f3b2e 100644
--- a/client/src/variants/Enpassant.js
+++ b/client/src/variants/Enpassant.js
@@ -67,6 +67,52 @@ export const VariantRules = class EnpassantRules extends ChessRules {
     return res.slice(0, -1); //remove last comma
   }
 
+  getPotentialMovesFrom([x, y]) {
+    let moves = super.getPotentialMovesFrom([x,y]);
+    // Add en-passant captures from this square:
+    const L = this.epSquares.length;
+    if (!this.epSquares[L - 1]) return moves;
+    const squares = this.epSquares[L - 1];
+    const S = squares.length;
+    // Object describing the removed opponent's piece:
+    const pipoV = new PiPo({
+      x: squares[S-1].x,
+      y: squares[S-1].y,
+      c: V.GetOppCol(this.turn),
+      p: this.getPiece(squares[S-1].x, squares[S-1].y)
+    });
+    // Check if existing non-capturing moves could also capture en passant
+    moves.forEach(m => {
+      if (
+        m.appear[0].p != V.PAWN && //special pawn case is handled elsewhere
+        m.vanish.length <= 1 &&
+        [...Array(S-1).keys()].some(i => {
+          return m.end.x == squares[i].x && m.end.y == squares[i].y;
+        })
+      ) {
+        m.vanish.push(pipoV);
+      }
+    });
+    // Special case of the king knight's movement:
+    if (this.getPiece(x, y) == V.KING) {
+      V.steps[V.KNIGHT].forEach(step => {
+        const endX = x + step[0];
+        const endY = y + step[1];
+        if (
+          V.OnBoard(endX, endY) &&
+          [...Array(S-1).keys()].some(i => {
+            return endX == squares[i].x && endY == squares[i].y;
+          })
+        ) {
+          let enpassantMove = this.getBasicMove([x, y], [endX, endY]);
+          enpassantMove.vanish.push(pipoV);
+          moves.push(enpassantMove);
+        }
+      });
+    }
+    return moves;
+  }
+
   // TODO: this getPotentialPawnMovesFrom() is mostly duplicated:
   // it could be split in "capture", "promotion", "enpassant"...
   getPotentialPawnMoves([x, y]) {
@@ -144,11 +190,19 @@ export const VariantRules = class EnpassantRules extends ChessRules {
   }
 
   // Remove the "onestep" condition: knight promote to knightrider:
-
   getPotentialKnightMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT]);
   }
 
+  filterValid(moves) {
+    const filteredMoves = super.filterValid(moves);
+    // If at least one full move made, everything is allowed:
+    if (this.movesCount >= 2)
+      return filteredMoves;
+    // Else, forbid captures:
+    return filteredMoves.filter(m => m.vanish.length == 1);
+  }
+
   isAttackedByKnight(sq, colors) {
     return this.isAttackedBySlideNJump(
       sq,
@@ -158,52 +212,6 @@ export const VariantRules = class EnpassantRules extends ChessRules {
     );
   }
 
-  getPotentialMovesFrom([x, y]) {
-    let moves = super.getPotentialMovesFrom([x,y]);
-    // Add en-passant captures from this square:
-    const L = this.epSquares.length;
-    if (!this.epSquares[L - 1]) return moves;
-    const squares = this.epSquares[L - 1];
-    const S = squares.length;
-    // Object describing the removed opponent's piece:
-    const pipoV = new PiPo({
-      x: squares[S-1].x,
-      y: squares[S-1].y,
-      c: V.GetOppCol(this.turn),
-      p: this.getPiece(squares[S-1].x, squares[S-1].y)
-    });
-    // Check if existing non-capturing moves could also capture en passant
-    moves.forEach(m => {
-      if (
-        m.appear[0].p != V.PAWN && //special pawn case is handled elsewhere
-        m.vanish.length <= 1 &&
-        [...Array(S-1).keys()].some(i => {
-          return m.end.x == squares[i].x && m.end.y == squares[i].y;
-        })
-      ) {
-        m.vanish.push(pipoV);
-      }
-    });
-    // Special case of the king knight's movement:
-    if (this.getPiece(x, y) == V.KING) {
-      V.steps[V.KNIGHT].forEach(step => {
-        const endX = x + step[0];
-        const endY = y + step[1];
-        if (
-          V.OnBoard(endX, endY) &&
-          [...Array(S-1).keys()].some(i => {
-            return endX == squares[i].x && endY == squares[i].y;
-          })
-        ) {
-          let enpassantMove = this.getBasicMove([x, y], [endX, endY]);
-          enpassantMove.vanish.push(pipoV);
-          moves.push(enpassantMove);
-        }
-      });
-    }
-    return moves;
-  }
-
   static get VALUES() {
     return {
       p: 1,
diff --git a/client/src/variants/Grand.js b/client/src/variants/Grand.js
index d804f614..d3659af8 100644
--- a/client/src/variants/Grand.js
+++ b/client/src/variants/Grand.js
@@ -307,8 +307,8 @@ export const VariantRules = class GrandRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
-      ChessRules.VALUES,
-      { c: 5, m: 7 } //experimental
+      { c: 5, m: 7 }, //experimental
+      ChessRules.VALUES
     );
   }
 
diff --git a/client/src/variants/Grasshopper.js b/client/src/variants/Grasshopper.js
new file mode 100644
index 00000000..043c0fc4
--- /dev/null
+++ b/client/src/variants/Grasshopper.js
@@ -0,0 +1,133 @@
+import { ChessRules } from "@/base_rules";
+import { ArrayFun } from "@/utils/array";
+import { randInt } from "@/utils/alea";
+
+export const VariantRules = class GrasshopperRules extends ChessRules {
+  static get GRASSHOPPER() {
+    return "g";
+  }
+
+  static get PIECES() {
+    return ChessRules.PIECES.concat([V.GRASSHOPPER]);
+  }
+
+  getPpath(b) {
+    return (b[1] == V.GRASSHOPPER ? "Grasshopper/" : "") + b;
+  }
+
+  getPotentialMovesFrom([x, y]) {
+    switch (this.getPiece(x, y)) {
+      case V.GRASSHOPPER:
+        return this.getPotentialGrasshopperMoves([x, y]);
+      default:
+        return super.getPotentialMovesFrom([x, y]);
+    }
+  }
+
+  getPotentialGrasshopperMoves([x, y]) {
+    let moves = [];
+    // Look in every direction until an obstacle (to jump) is met
+    for (const step of V.steps[V.ROOK].concat(V.steps[V.BISHOP])) {
+      let i = x + step[0];
+      let j = y + step[1];
+      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
+        i += step[0];
+        j += step[1];
+      }
+      // Move is valid if the next square is empty or occupied by enemy
+      const nextSq = [i+step[0], j+step[1]];
+      if (V.OnBoard(nextSq[0], nextSq[1]) && this.canTake([x, y], nextSq))
+        moves.push(this.getBasicMove([x, y], nextSq));
+    }
+    return moves;
+  }
+
+  isAttacked(sq, colors) {
+    return (
+      super.isAttacked(sq, colors) ||
+      this.isAttackedByGrasshopper(sq, colors)
+    );
+  }
+
+  isAttackedByGrasshopper([x, y], colors) {
+    // Reversed process: is there an adjacent obstacle,
+    // and a grasshopper next in the same line?
+    for (const step of V.steps[V.ROOK].concat(V.steps[V.BISHOP])) {
+      const nextSq = [x+step[0], y+step[1]];
+      if (
+        V.OnBoard(nextSq[0], nextSq[1]) &&
+        this.board[nextSq[0]][nextSq[1]] != V.EMPTY
+      ) {
+        let i = nextSq[0] + step[0];
+        let j = nextSq[1] + step[1];
+        while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
+          i += step[0];
+          j += step[1];
+        }
+        if (
+          V.OnBoard(i, j) &&
+          this.getPiece(i, j) == V.GRASSHOPPER &&
+          colors.includes(this.getColor(i, j))
+        ) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  static get VALUES() {
+    return Object.assign(
+      // TODO: grasshoppers power decline when less pieces on board...
+      { g: 3 },
+      ChessRules.VALUES
+    );
+  }
+
+  static GenRandInitFen() {
+    let pieces = { w: new Array(10), b: new Array(10) };
+    for (let c of ["w", "b"]) {
+      let positions = ArrayFun.range(8);
+
+      // Get random squares for grasshoppers (unconstrained)
+      let randIndex = randInt(8);
+      const grasshopper1Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+      randIndex = randInt(7);
+      const grasshopper2Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      // Knights
+      randIndex = randInt(6);
+      let knight1Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+      randIndex = randInt(5);
+      let knight2Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      // Queen
+      randIndex = randInt(4);
+      let queenPos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      let rook1Pos = positions[0];
+      let kingPos = positions[1];
+      let rook2Pos = positions[2];
+
+      pieces[c][rook1Pos] = "r";
+      pieces[c][knight1Pos] = "n";
+      pieces[c][grasshopper1Pos] = "g";
+      pieces[c][queenPos] = "q";
+      pieces[c][kingPos] = "k";
+      pieces[c][grasshopper2Pos] = "g";
+      pieces[c][knight2Pos] = "n";
+      pieces[c][rook2Pos] = "r";
+    }
+    return (
+      pieces["b"].join("") +
+      "/pppppppp/8/8/8/8/PPPPPPPP/" +
+      pieces["w"].join("").toUpperCase() +
+      " w 0 1111 -"
+    );
+  }
+};
diff --git a/client/src/variants/Hiddenqueen.js b/client/src/variants/Hiddenqueen.js
new file mode 100644
index 00000000..fe34fb28
--- /dev/null
+++ b/client/src/variants/Hiddenqueen.js
@@ -0,0 +1,155 @@
+import { ChessRules, PiPo, Move } from "@/base_rules";
+import { ArrayFun } from "@/utils/array";
+import { randInt } from "@/utils/alea";
+
+export const VariantRules = class HiddenqueenRules extends ChessRules {
+  // Analyse in Hiddenqueen mode makes no sense
+  static get CanAnalyze() {
+    return false;
+  }
+
+  static get HIDDEN_QUEEN() {
+    return 't';
+  }
+
+  static get PIECES() {
+    return ChessRules.PIECES.concat(Object.values(V.HIDDEN_CODE));
+  }
+
+  getPiece(i, j) {
+    const piece = this.board[i][j].charAt(1);
+    if (
+      piece != V.HIDDEN_QUEEN ||
+      // 'side' is used to determine what I see: a pawn or a (hidden)queen?
+      this.getColor(i, j) == this.side
+    ) {
+      return piece;
+    }
+    return V.PAWN;
+  }
+
+  getPpath(b, color, score) {
+    if (b[1] == V.HIDDEN_QUEEN) {
+      // Supposed to be hidden.
+      if (score == "*" && (!color || color != b[0]))
+        return b[0] + "p";
+      return "Hiddenqueen/" + b[0] + "t";
+    }
+    return b;
+  }
+
+  isValidPawnMove(move) {
+    const color = move.vanish[0].c;
+    const pawnShift = color == "w" ? -1 : 1;
+    const startRank = color == "w" ? V.size.x - 2 : 1;
+    const lastRank = color == "w" ? 0 : V.size.x - 1;
+    return (
+      // The queen is discovered if she reaches the 8th rank,
+      // even if this would be a technically valid pawn move.
+      move.end.x != lastRank &&
+      (
+        (
+          move.end.x - move.start.x == pawnShift &&
+          (
+            (
+              // Normal move
+              move.end.y == move.start.y &&
+              this.board[move.end.x][move.end.y] == V.EMPTY
+            )
+            ||
+            (
+              // Capture
+              Math.abs(move.end.y - move.start.y) == 1 &&
+              this.board[move.end.x][move.end.y] != V.EMPTY
+            )
+          )
+        )
+        ||
+        (
+          // Two-spaces initial jump
+          move.start.x == startRank &&
+          move.end.y == move.start.y &&
+          move.end.x - move.start.x == 2 * pawnShift &&
+          this.board[move.end.x][move.end.y] == V.EMPTY
+        )
+      )
+    );
+  }
+
+  getPotentialMovesFrom([x, y]) {
+    if (this.getPiece(x, y) == V.HIDDEN_QUEEN) {
+      const pawnMoves = super.getPotentialPawnMoves([x, y]);
+      let queenMoves = super.getPotentialQueenMoves([x, y]);
+      // Remove from queen moves those corresponding to a pawn move:
+      queenMoves = queenMoves
+        .filter(m => !this.isValidPawnMove(m))
+        // Hidden queen is revealed if moving like a queen:
+        .map(m => {
+          m.appear[0].p = V.QUEEN;
+          return m;
+        });
+      return pawnMoves.concat(queenMoves);
+    }
+    return super.getPotentialMovesFrom([x, y]);
+  }
+
+  getPossibleMovesFrom(sq) {
+    this.side = this.turn;
+    return this.filterValid(this.getPotentialMovesFrom(sq));
+  }
+
+  static GenRandInitFen() {
+    let fen = ChessRules.GenRandInitFen();
+    // Place hidden queens at random:
+    let hiddenQueenPos = randInt(8);
+    let pawnRank = "PPPPPPPP".split("");
+    pawnRank[hiddenQueenPos] = "T";
+    fen = fen.replace("PPPPPPPP", pawnRank.join(""));
+    hiddenQueenPos = randInt(8);
+    pawnRank = "pppppppp".split("");
+    pawnRank[hiddenQueenPos] = "t";
+    fen = fen.replace("pppppppp", pawnRank.join(""));
+    return fen;
+  }
+
+  updateVariables(move) {
+    super.updateVariables(move);
+    if (move.vanish.length == 2 && move.vanish[1].p == V.KING)
+      // We took opponent king
+      this.kingPos[this.turn] = [-1, -1];
+  }
+
+  unupdateVariables(move) {
+    super.unupdateVariables(move);
+    const c = move.vanish[0].c;
+    const oppCol = V.GetOppCol(c);
+    if (this.kingPos[oppCol][0] < 0)
+      // Last move took opponent's king:
+      this.kingPos[oppCol] = [move.vanish[1].x, move.vanish[1].y];
+  }
+
+  getCurrentScore() {
+    const color = this.turn;
+    if (this.kingPos[color][0] < 0)
+      // King disappeared
+      return color == "w" ? "0-1" : "1-0";
+    return super.getCurrentScore();
+  }
+
+  // Search is biased, so not really needed to explore deeply
+  static get SEARCH_DEPTH() {
+    return 2;
+  }
+
+  static get VALUES() {
+    return Object.assign(
+      { t: 9 },
+      ChessRules.VALUES
+    );
+  }
+
+  getComputerMove() {
+    this.side = this.turn;
+    return super.getComputerMove();
+  }
+};
diff --git a/client/src/variants/Knightmate.js b/client/src/variants/Knightmate.js
new file mode 100644
index 00000000..c0e84c63
--- /dev/null
+++ b/client/src/variants/Knightmate.js
@@ -0,0 +1,132 @@
+import { ChessRules } from "@/base_rules";
+import { ArrayFun } from "@/utils/array";
+import { randInt } from "@/utils/alea";
+
+export const VariantRules = class KnightmateRules extends ChessRules {
+  static get COMMONER() {
+    return "c";
+  }
+
+  static get PIECES() {
+    return ChessRules.PIECES.concat([V.COMMONER]);
+  }
+
+  getPpath(b) {
+    return ([V.KING, V.COMMONER].includes(b[1]) ? "Knightmate/" : "") + b;
+  }
+
+  static GenRandInitFen() {
+    let pieces = { w: new Array(8), b: new Array(8) };
+    // Shuffle pieces on first and last rank
+    for (let c of ["w", "b"]) {
+      let positions = ArrayFun.range(8);
+
+      // Get random squares for bishops
+      let randIndex = 2 * randInt(4);
+      const bishop1Pos = positions[randIndex];
+      let randIndex_tmp = 2 * randInt(4) + 1;
+      const bishop2Pos = positions[randIndex_tmp];
+      positions.splice(Math.max(randIndex, randIndex_tmp), 1);
+      positions.splice(Math.min(randIndex, randIndex_tmp), 1);
+
+      // Get random squares for commoners
+      randIndex = randInt(6);
+      const commoner1Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+      randIndex = randInt(5);
+      const commoner2Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      // Get random square for queen
+      randIndex = randInt(4);
+      const queenPos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      // Rooks and king positions are now fixed,
+      // because of the ordering rook-king-rook
+      const rook1Pos = positions[0];
+      const kingPos = positions[1];
+      const rook2Pos = positions[2];
+
+      // Finally put the shuffled pieces in the board array
+      pieces[c][rook1Pos] = "r";
+      pieces[c][commoner1Pos] = "c";
+      pieces[c][bishop1Pos] = "b";
+      pieces[c][queenPos] = "q";
+      pieces[c][kingPos] = "k";
+      pieces[c][bishop2Pos] = "b";
+      pieces[c][commoner2Pos] = "c";
+      pieces[c][rook2Pos] = "r";
+    }
+    // Add turn + flags + enpassant
+    return (
+      pieces["b"].join("") +
+      "/pppppppp/8/8/8/8/PPPPPPPP/" +
+      pieces["w"].join("").toUpperCase() +
+      " w 0 1111 -"
+    );
+  }
+
+  getPotentialMovesFrom([x, y]) {
+    switch (this.getPiece(x, y)) {
+      case V.COMMONER:
+        return this.getPotentialCommonerMoves([x, y]);
+      default:
+        return super.getPotentialMovesFrom([x, y]);
+    }
+  }
+
+  getPotentialCommonerMoves(sq) {
+    return this.getSlideNJumpMoves(
+      sq,
+      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
+      "oneStep"
+    );
+  }
+
+  getPotentialKingMoves(sq) {
+    return super.getPotentialKnightMoves(sq).concat(super.getCastleMoves(sq));
+  }
+
+  isAttacked(sq, colors) {
+    return (
+      this.isAttackedByCommoner(sq, colors) ||
+      this.isAttackedByPawn(sq, colors) ||
+      this.isAttackedByRook(sq, colors) ||
+      this.isAttackedByBishop(sq, colors) ||
+      this.isAttackedByQueen(sq, colors) ||
+      this.isAttackedByKing(sq, colors)
+    );
+  }
+
+  isAttackedByKing(sq, colors) {
+    return this.isAttackedBySlideNJump(
+      sq,
+      colors,
+      V.KING,
+      V.steps[V.KNIGHT],
+      "oneStep"
+    );
+  }
+
+  isAttackedByCommoner(sq, colors) {
+    return this.isAttackedBySlideNJump(
+      sq,
+      colors,
+      V.COMMONER,
+      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
+      "oneStep"
+    );
+  }
+
+  static get VALUES() {
+    return {
+      p: 1,
+      r: 5,
+      c: 5, //the commoner is valuable
+      b: 3,
+      q: 9,
+      k: 1000
+    };
+  }
+};
diff --git a/client/src/variants/Wildebeest.js b/client/src/variants/Wildebeest.js
index 1634f494..fa89cb21 100644
--- a/client/src/variants/Wildebeest.js
+++ b/client/src/variants/Wildebeest.js
@@ -235,8 +235,8 @@ export const VariantRules = class WildebeestRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
-      ChessRules.VALUES,
-      { c: 3, w: 7 } //experimental
+      { c: 3, w: 7 }, //experimental
+      ChessRules.VALUES
     );
   }
 
diff --git a/client/src/variants/Wormhole.js b/client/src/variants/Wormhole.js
index b04efa94..76f6d127 100644
--- a/client/src/variants/Wormhole.js
+++ b/client/src/variants/Wormhole.js
@@ -264,6 +264,8 @@ export const VariantRules = class WormholeRules extends ChessRules {
     return this.isAttackedByJump(sq, colors, V.KING, V.steps[V.KING]);
   }
 
+  // NOTE: altering move in getBasicMove doesn't work and wouldn't be logical.
+  // This is a side-effect on board generated by the move.
   static PlayOnBoard(board, move) {
     board[move.vanish[0].x][move.vanish[0].y] = V.HOLE;
     for (let psq of move.appear) board[psq.x][psq.y] = psq.c + psq.p;
diff --git a/client/src/views/Analyse.vue b/client/src/views/Analyse.vue
index 4307b9d0..0a66ffc1 100644
--- a/client/src/views/Analyse.vue
+++ b/client/src/views/Analyse.vue
@@ -41,15 +41,34 @@ export default {
   // then it doesn't trigger BaseGame.re_init() and the result is weird.
   created: function() {
     this.gameRef.vname = this.$route.params["vname"];
-    this.gameRef.fen = this.$route.query["fen"].replace(/_/g, " ");
-    this.initialize();
+    const routeFen = this.$route.query["fen"];
+    if (!routeFen) this.alertAndQuit("Missing FEN");
+    else {
+      this.gameRef.fen = routeFen.replace(/_/g, " ");
+      this.initialize();
+    }
   },
   methods: {
+    alertAndQuit: function(text, wrongVname) {
+      // Soon after component creation, st.tr might be uninitialized.
+      // Set a timeout to let a chance for the message to show translated.
+      const newUrl = "/variants" + (wrongVname ? "" : "/" + this.gameRef.vname);
+      setTimeout(() => {
+        alert(this.st.tr[text] || text);
+        this.$router.replace(newUrl);
+      }, 500);
+    },
     initialize: async function() {
       // Obtain VariantRules object
-      const vModule = await import("@/variants/" + this.gameRef.vname + ".js");
-      window.V = vModule.VariantRules;
-      this.loadGame();
+      await import("@/variants/" + this.gameRef.vname + ".js")
+      .then((vModule) => {
+        window.V = vModule.VariantRules;
+        if (!V.CanAnalyze)
+          // Late check, in case the user tried to enter URL by hand
+          this.alertAndQuit("Analysis disabled for this variant");
+        else this.loadGame();
+      })
+      .catch((err) => { this.alertAndQuit("Mispelled variant name", true); });
     },
     loadGame: function() {
       // NOTE: no need to set score (~unused)
diff --git a/client/src/views/Rules.vue b/client/src/views/Rules.vue
index c05e1843..556ea863 100644
--- a/client/src/views/Rules.vue
+++ b/client/src/views/Rules.vue
@@ -112,9 +112,20 @@ export default {
       return getDiagram(args);
     },
     re_setVariant: async function(vname) {
-      const vModule = await import("@/variants/" + vname + ".js");
-      this.V = window.V = vModule.VariantRules;
-      this.gameInfo.vname = vname;
+      await import("@/variants/" + vname + ".js")
+      .then((vModule) => {
+        this.V = window.V = vModule.VariantRules;
+        this.gameInfo.vname = vname;
+      })
+      .catch((err) => {
+        // Soon after component creation, st.tr might be uninitialized.
+        // Set a timeout to let a chance for the message to show translated.
+        const text = "Mispelled variant name";
+        setTimeout(() => {
+          alert(this.st.tr[text] || text);
+          this.$router.replace("/variants");
+        }, 500);
+      });
     },
     startGame: function(mode) {
       if (this.gameInProgress) return;
diff --git a/server/db/populate.sql b/server/db/populate.sql
index 2accc888..6ddedf69 100644
--- a/server/db/populate.sql
+++ b/server/db/populate.sql
@@ -20,7 +20,10 @@ insert or ignore into Variants (name,description) values
   ('Enpassant', 'Capture en passant'),
   ('Extinction', 'Capture all of a kind'),
   ('Grand', 'Big board'),
+  ('Grasshopper', 'Long jumps over pieces'),
   ('Hidden', 'Unidentified pieces'),
+  ('Hiddenqueen', 'Queen disguised as a pawn'),
+  ('Knightmate', 'Mate the knight'),
   ('Knightrelay', 'Move like a knight'),
   ('Losers', 'Lose all pieces'),
   ('Magnetic', 'Laws of attraction'),
diff --git a/server/models/User.js b/server/models/User.js
index f3adb31d..5117c175 100644
--- a/server/models/User.js
+++ b/server/models/User.js
@@ -141,13 +141,20 @@ const UserModel =
     const day = 86400000;
     db.serialize(function() {
       const query =
-        "SELECT id, sessionToken, created " +
+        "SELECT id, sessionToken, created, name, email " +
         "FROM Users";
       db.all(query, (err, users) => {
         users.forEach(u => {
-          // Remove unlogged users for >1 day
+          // Remove unlogged users for > 24h
           if (!u.sessionToken && tsNow - u.created > day)
+          {
+            notify(
+              u,
+              "Your account has been deleted because " +
+              "you didn't log in for 24h after registration"
+            );
             db.run("DELETE FROM Users WHERE id = " + u.id);
+          }
         });
       });
     });
-- 
2.44.0