summaryrefslogtreecommitdiff
path: root/kartik/views
diff options
context:
space:
mode:
Diffstat (limited to 'kartik/views')
-rw-r--r--kartik/views/.DS_Storebin0 -> 8196 bytes
-rwxr-xr-xkartik/views/background.jpgbin0 -> 28626 bytes
-rwxr-xr-xkartik/views/common/blur.css3
-rwxr-xr-xkartik/views/common/bold.ttfbin0 -> 58416 bytes
-rwxr-xr-xkartik/views/common/compatibilityMode.css8
-rwxr-xr-xkartik/views/common/fonts.css23
-rwxr-xr-xkartik/views/common/index.css29
-rwxr-xr-xkartik/views/common/light.ttfbin0 -> 58584 bytes
-rwxr-xr-xkartik/views/common/load-channel.otfbin0 -> 59108 bytes
-rwxr-xr-xkartik/views/common/load-new.ttfbin0 -> 50172 bytes
-rwxr-xr-xkartik/views/common/load-version.otfbin0 -> 63240 bytes
-rwxr-xr-xkartik/views/common/mouse.css3
-rwxr-xr-xkartik/views/common/race.svg1
-rwxr-xr-xkartik/views/common/regular.ttfbin0 -> 58548 bytes
-rwxr-xr-xkartik/views/credits.html201
-rwxr-xr-xkartik/views/game.css152
-rwxr-xr-xkartik/views/game.html154
-rwxr-xr-xkartik/views/hero.svg3
-rwxr-xr-xkartik/views/intro.css33
-rwxr-xr-xkartik/views/intro.html36
-rwxr-xr-xkartik/views/intro.mp4bin0 -> 317055 bytes
-rwxr-xr-xkartik/views/load.html52
-rwxr-xr-xkartik/views/loader.html46
-rwxr-xr-xkartik/views/menu.css248
-rwxr-xr-xkartik/views/menu.html109
-rwxr-xr-xkartik/views/menu.jpgbin0 -> 155471 bytes
-rwxr-xr-xkartik/views/online.html40
-rwxr-xr-xkartik/views/rain/snow.js666
-rwxr-xr-xkartik/views/script/client_fullscreen.js9
-rwxr-xr-xkartik/views/script/core_chart.js74
-rwxr-xr-xkartik/views/script/core_compatlayer.js0
-rwxr-xr-xkartik/views/script/core_crash.js15
-rwxr-xr-xkartik/views/script/core_fullscreen.js0
-rwxr-xr-xkartik/views/script/core_head.js31
-rwxr-xr-xkartik/views/script/core_music.js35
-rwxr-xr-xkartik/views/script/core_notification.js12
-rwxr-xr-xkartik/views/script/core_viewer.js33
-rwxr-xr-xkartik/views/script/credits_global.js54
-rwxr-xr-xkartik/views/script/credits_libs.js0
-rwxr-xr-xkartik/views/script/credits_music.js2
-rwxr-xr-xkartik/views/script/credits_technical.js12
-rwxr-xr-xkartik/views/script/game_debug.js138
-rwxr-xr-xkartik/views/script/game_global.js45
-rwxr-xr-xkartik/views/script/game_music.js8
-rwxr-xr-xkartik/views/script/game_online.js9
-rwxr-xr-xkartik/views/script/game_select.js131
-rwxr-xr-xkartik/views/script/global_compatlayer.js0
-rwxr-xr-xkartik/views/script/global_levelsapi.js47
-rwxr-xr-xkartik/views/script/intro_global.js21
-rwxr-xr-xkartik/views/script/intro_media.js2
-rwxr-xr-xkartik/views/script/intro_message.js7
-rwxr-xr-xkartik/views/script/loader_global.js132
-rwxr-xr-xkartik/views/script/menu_copyright.js5
-rwxr-xr-xkartik/views/script/menu_global.js127
-rwxr-xr-xkartik/views/script/menu_gpuinfo.js0
-rwxr-xr-xkartik/views/script/menu_login.js1
-rwxr-xr-xkartik/views/script/menu_music.js5
-rwxr-xr-xkartik/views/script/menu_system.js33
-rwxr-xr-xkartik/views/script/online_play.js2
-rwxr-xr-xkartik/views/script/settings_global.js104
-rwxr-xr-xkartik/views/script/settings_load.js10
-rwxr-xr-xkartik/views/script/win_global.js22
-rwxr-xr-xkartik/views/script/win_message.js9
-rwxr-xr-xkartik/views/script/win_music.js2
-rwxr-xr-xkartik/views/script/win_play.js0
-rwxr-xr-xkartik/views/script/win_quit.js0
-rwxr-xr-xkartik/views/settings.html49
-rwxr-xr-xkartik/views/splash.svg2831
-rwxr-xr-xkartik/views/stats.html66
-rwxr-xr-xkartik/views/win.html40
70 files changed, 5930 insertions, 0 deletions
diff --git a/kartik/views/.DS_Store b/kartik/views/.DS_Store
new file mode 100644
index 0000000..a0a897c
--- /dev/null
+++ b/kartik/views/.DS_Store
Binary files differ
diff --git a/kartik/views/background.jpg b/kartik/views/background.jpg
new file mode 100755
index 0000000..1129efc
--- /dev/null
+++ b/kartik/views/background.jpg
Binary files differ
diff --git a/kartik/views/common/blur.css b/kartik/views/common/blur.css
new file mode 100755
index 0000000..f904c12
--- /dev/null
+++ b/kartik/views/common/blur.css
@@ -0,0 +1,3 @@
+#intro, #laps-inner-car0, #laps-inner-car1, #paused, #credits, #gpuinfo, #warning {
+ backdrop-filter: blur(10px);
+} \ No newline at end of file
diff --git a/kartik/views/common/bold.ttf b/kartik/views/common/bold.ttf
new file mode 100755
index 0000000..a7e7b1e
--- /dev/null
+++ b/kartik/views/common/bold.ttf
Binary files differ
diff --git a/kartik/views/common/compatibilityMode.css b/kartik/views/common/compatibilityMode.css
new file mode 100755
index 0000000..60c28a2
--- /dev/null
+++ b/kartik/views/common/compatibilityMode.css
@@ -0,0 +1,8 @@
+*:not(#gpuinfo-outer):not(#gpuinfo-inner) {
+ backdrop-filter: none !important;
+ opacity: 1 !important;
+}
+
+.rain {
+ display: none !important;
+} \ No newline at end of file
diff --git a/kartik/views/common/fonts.css b/kartik/views/common/fonts.css
new file mode 100755
index 0000000..af3ecab
--- /dev/null
+++ b/kartik/views/common/fonts.css
@@ -0,0 +1,23 @@
+@font-face {
+ font-family: "Comfortaa";
+ src: url("regular.ttf");
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: "Comfortaa";
+ src: url("bold.ttf");
+ font-weight: bold;
+}
+
+*, body, html, div {
+ font-family: "Comfortaa", -apple-system, sans-serif;
+}
+
+#gpuinfo-inner, #gpuinfo-inner * {
+ font-family: monospace !important;
+}
+
+* {
+ cursor: default !important;
+} \ No newline at end of file
diff --git a/kartik/views/common/index.css b/kartik/views/common/index.css
new file mode 100755
index 0000000..f9ff24e
--- /dev/null
+++ b/kartik/views/common/index.css
@@ -0,0 +1,29 @@
+#titlebar-minimize, #titlebar-close {
+ background-color: transparent;
+ transition: background-color 200ms;
+ border-radius: 10px;
+}
+
+#titlebar-minimize:hover {
+ background-color: rgba(99, 99, 99, .5);
+}
+
+#titlebar-minimize:focus, #titlebar-minimize:active {
+ background-color: rgba(99, 99, 99, .75);
+}
+
+#titlebar-close:hover {
+ background-color: rgba(255, 0, 0, .5);
+}
+
+#titlebar-close:focus, #titlebar-close:active {
+ background-color: rgba(255, 0, 0, .75);
+}
+
+*::selection {
+ background-color: transparent;
+}
+
+*::inactive-selection {
+ background-color: transparent;
+} \ No newline at end of file
diff --git a/kartik/views/common/light.ttf b/kartik/views/common/light.ttf
new file mode 100755
index 0000000..5e4bfc7
--- /dev/null
+++ b/kartik/views/common/light.ttf
Binary files differ
diff --git a/kartik/views/common/load-channel.otf b/kartik/views/common/load-channel.otf
new file mode 100755
index 0000000..1968a8e
--- /dev/null
+++ b/kartik/views/common/load-channel.otf
Binary files differ
diff --git a/kartik/views/common/load-new.ttf b/kartik/views/common/load-new.ttf
new file mode 100755
index 0000000..d2a94dc
--- /dev/null
+++ b/kartik/views/common/load-new.ttf
Binary files differ
diff --git a/kartik/views/common/load-version.otf b/kartik/views/common/load-version.otf
new file mode 100755
index 0000000..d112022
--- /dev/null
+++ b/kartik/views/common/load-version.otf
Binary files differ
diff --git a/kartik/views/common/mouse.css b/kartik/views/common/mouse.css
new file mode 100755
index 0000000..7670e90
--- /dev/null
+++ b/kartik/views/common/mouse.css
@@ -0,0 +1,3 @@
+*::selection {
+ background: none;
+} \ No newline at end of file
diff --git a/kartik/views/common/race.svg b/kartik/views/common/race.svg
new file mode 100755
index 0000000..197387b
--- /dev/null
+++ b/kartik/views/common/race.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><rect fill="none" height="24" width="24" y="0"/></g><g><path d="M12,2c-4.2,0-8,3.22-8,8.2c0,3.18,2.45,6.92,7.34,11.23c0.38,0.33,0.95,0.33,1.33,0 C17.55,17.12,20,13.38,20,10.2C20,5.22,16.2,2,12,2z M12,12c-1.1,0-2-0.9-2-2c0-1.1,0.9-2,2-2c1.1,0,2,0.9,2,2 C14,11.1,13.1,12,12,12z" enable-background="new"/></g></svg> \ No newline at end of file
diff --git a/kartik/views/common/regular.ttf b/kartik/views/common/regular.ttf
new file mode 100755
index 0000000..89d36f8
--- /dev/null
+++ b/kartik/views/common/regular.ttf
Binary files differ
diff --git a/kartik/views/credits.html b/kartik/views/credits.html
new file mode 100755
index 0000000..1862f50
--- /dev/null
+++ b/kartik/views/credits.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="menu.css">
+ <title>Kartik</title>
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+
+ <style>
+ body::-webkit-scrollbar {
+ display: none;
+ }
+ </style>
+</head>
+<body style="color:white;text-align:center;font-size:20px;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+
+ <div style="position:fixed;inset:0;background:black;display:none;z-index:-1;" id="box"></div>
+ <div style="height:100vh;"></div>
+
+ <!-- START credits -->
+
+ <h2>Kartik, a 2D car racing game</h2>
+ <p>© Minteck. All assets are licensed under their original license rather than Kartik's license.</p>
+ <p class="technical"><script src="./script/credits_technical.js"></script></p>
+
+ made by<br>
+ <img id="banner" src="../logo/vendor.png" style="width:128px;">
+
+ <p class="cred-title">Project Lead</p>
+ <p class="cred-content">Minteck</p>
+
+ <p class="cred-title">Base Assets</p>
+ <p class="cred-content">Minteck<br>redman 054</p>
+
+ <p class="cred-title">Narrator Character</p>
+ <p class="cred-content"><b>Averi</b> by fiddle (@fiddleafox on Twitter)</p>
+
+ <p class="cred-title">Music</p>
+ <p class="cred-content">Anuke<br>YonKaGor</p>
+
+ <p class="cred-title">Sound Effects and Additional Assets</p>
+ <div class="cred-content" style="display:grid;grid-template-columns: 1fr 1fr 1fr; text-align:center;">
+ <div>Prosta4okua</div>
+ <div>Felix Corvus</div>
+ <div>Vanguard</div>
+ <div>Timmeey86</div>
+ <div>Epowerj</div>
+ <div>Baltazár Radics</div>
+ <div>Dexapnow</div>
+ <div>Milinai</div>
+ <div>키에르</div>
+ <div>skybldev</div>
+ <div>Leone25</div>
+ <div>Gureumi</div>
+ <div>VizardAlpha</div>
+ <div>LQ</div>
+ <div>Commodore64x</div>
+ <div>iczero</div>
+ <div>Krzysztof Skrzętnicki</div>
+ <div>Baramos666</div>
+ <div>theshadowknight</div>
+ <div>elmenda452</div>
+ <div>Predator127</div>
+ <div>Sonnicon</div>
+ <div>CinExPL</div>
+ <div>toushangyouxiang</div>
+ <div>xgamezs</div>
+ <div>William So</div>
+ <div>beito</div>
+ <div>BeefEX</div>
+ <div>Lorex</div>
+ <div>老滑稽</div>
+ <div>Spico The Spirit Guy</div>
+ <div>TunacanGamer</div>
+ <div>kemalinanc13</div>
+ <div>Zachary</div>
+ <div>Fenr1r</div>
+ <div>Jaiun Lee</div>
+ <div>Gab_351</div>
+ <div>Carter Gale</div>
+ <div>Jan Polák</div>
+ <div>JustYanns</div>
+ <div>BasedUser</div>
+ <div>BLucky-gh</div>
+ <div>DinoWattz</div>
+ <div>Jae</div>
+ <div>angelickite</div>
+ <div>ScriptHosT12</div>
+ <div>Senventise</div>
+ <div>SkeptiC</div>
+ <div>Deyvid67</div>
+ <div>Damlon</div>
+ <div>DaGamerFiles</div>
+ <div>Trigg</div>
+ <div>Uriel</div>
+ <div>VXF</div>
+ <div>Valen. H</div>
+ <div>Valentin Sonin</div>
+ <div>Clarence "Sparr" Risher</div>
+ <div>bei2</div>
+ <div>AceEllysium</div>
+ <div>Cedric L'homme</div>
+ <div>Michał “Neoqueto”</div>
+ <div>indielm</div>
+ <div>Ameb</div>
+ <div>player20033</div>
+ <div>Ignacy</div>
+ <div>J-VdS</div>
+ <div>Kenny</div>
+ <div>Franciszek Zaranowicz</div>
+ <div>Andreas Heiskanen</div>
+ <div>Doyoung Gwak</div>
+ <div>MMG</div>
+ <div>Math2128</div>
+ <div>Michael Plotke</div>
+ <div>Niko</div>
+ <div>Paul T</div>
+ <div>Dominik</div>
+ <div>Arkanic</div>
+ <div>Potion</div>
+ <div>Markus G</div>
+ <div>itskatt</div>
+ <div>Agent-Laevain</div>
+ <div>AzariasB</div>
+ <div>amrsoll</div>
+ <div>ねらひかだ</div>
+ <div>Draco</div>
+ <div>Quezler</div>
+ <div>killall -q</div>
+ <div>Alicila</div>
+ <div>Daniel Dusek</div>
+ <div>DeltaNedas</div>
+ <div>GioIacca9</div>
+ <div>SnakkiZXZ</div>
+ <div>sk7725</div>
+ <div>The Slaylord</div>
+ <div>ThePlayerA</div>
+ <div>YellOw139</div>
+ <div>NgLamVN</div>
+ <div>JINODK</div>
+ <div>PetrGasparik</div>
+ <div>LeoDog896</div>
+ <div>Summet</div>
+ <div>MEEP of Faith</div>
+ <div>jalastram (freesound.org)</div>
+ <div>newlocknew (freesound.org)</div>
+ <div>dsmolenaers (freesound.org)</div>
+ <div>Headphaze (freesound.org)</div>
+ <div>Nikolass</div>
+ <div>VolasYouKnow</div>
+ <div>Quick-Korx</div>
+ <div>Ángel Rodríguez Aguilera</div>
+ <div>Catchears</div>
+ <div>younggam</div>
+ <div>simba-fs</div>
+ <div>RedRadiation</div>
+ <div>Marko Zajc</div>
+ <div>CPX MC</div>
+ <div>Phinner</div>
+ <div>BTA_Susideur</div>
+ <div>nilq</div>
+ <div>AsgerHB</div>
+ <div>AzCraft</div>
+ <div>foo</div>
+ <div>Skat</div>
+ <div>WilloIzCitron</div>
+ <div>Nintendo</div>
+ <div>Unsplash</div>
+ <div>Google</div>
+ </div>
+
+ <p class="cred-title">Testing</p>
+ <p class="cred-content">Minteck<br>Romain<br>Oxymillion</p>
+
+ <p class="cred-title">Early Access Testing</p>
+ <p class="cred-content">Ayann<br>Retsuno<br>Amirus66</p>
+
+ <!-- END credits -->
+
+ <div style="height:100vh;"></div>
+
+ <script src="./script/credits_music.js"></script>
+<script>info("OptnWindow", "Menu opened");</script>
+</body>
+<script src="./script/credits_global.js"></script>
+<script src="./script/client_fullscreen.js"></script>
+</html>
diff --git a/kartik/views/game.css b/kartik/views/game.css
new file mode 100755
index 0000000..e72a786
--- /dev/null
+++ b/kartik/views/game.css
@@ -0,0 +1,152 @@
+#paused {
+ z-index: 5;
+ position: fixed;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+#paused > div {
+ background: #262626;
+ border-radius: 10px;
+ padding: 20px;
+ box-shadow: 1px 1px 12px rgba(0, 0, 0, 0.25);
+}
+
+#paused * {
+ color: white;
+}
+
+.services li {
+ padding: 10px;
+ font-size: 28px;
+ width: 256px;
+ list-style: none;
+ color: transparent;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border-radius: 10px;
+}
+
+.services li a {
+ color: white !important;
+ text-decoration: none;
+ transition: color 200ms;
+}
+
+.services li.selected a {
+ color: black !important;
+ text-decoration: none;
+}
+
+.services li.selected {
+ background-color: #00ff99;
+}
+
+.services li {
+ background-color: #383838;
+ transition: margin-left 200ms, background-color 200ms;
+}
+
+#circuit.hitboxes, #circuit.hitboxes * {
+ outline: 1px dashed blue;
+}
+
+#car0, #car1 {
+ transition: top 600ms, bottom 600ms, left 600ms, right 600ms, transform 500ms;
+}
+
+#box.paused {
+ opacity: .5;
+}
+
+circuit {
+ display: none;
+}
+
+#credits-inner {
+ position: fixed;
+ z-index: 9;
+ background: #171717;
+ color: white;
+ padding: 20px;
+ display: grid;
+ font-size: 11px;
+ top: 200px;
+ left: 0;
+ right: 0;
+}
+
+#credits .big {
+ font-size: 15px;
+ font-weight: bold;
+}
+
+#credits #race, #credits #musicb {
+ display: grid;
+ grid-template-columns: 48px 1fr;
+}
+
+#credits-inner > * > * {
+ vertical-align: middle;
+}
+
+#credits img {
+ filter: invert(100%);
+}
+
+#credits .cbox {
+ width: max-content;
+}
+
+#laps-inner-car0 {
+ background: rgba(0, 0, 0, .5);
+ position: fixed;
+ bottom: 20px;
+ left: 20px;
+ z-index: 9;
+ border-radius: 9999px;
+ width: 40px;
+ height: 43px;
+ text-align: center;
+ color: white;
+ padding: 7px 10px 10px;
+}
+
+#laps-inner-car1 {
+ background: rgba(0, 0, 0, .5);
+ position: fixed;
+ bottom: 20px;
+ right: 20px;
+ z-index: 9;
+ border-radius: 9999px;
+ width: 40px;
+ height: 43px;
+ text-align: center;
+ color: white;
+ padding: 7px 10px 10px;
+}
+
+.laps-inner-sep {
+ margin: 5px;
+ border: none;
+ border-top: 2px solid white;
+}
+
+#oil img {
+ position: fixed;
+ width: 32px;
+ z-index: 5;
+ opacity: .9;
+}
+
+#credits {
+ background: rgba(0, 0, 0, .5);
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 9999;
+} \ No newline at end of file
diff --git a/kartik/views/game.html b/kartik/views/game.html
new file mode 100755
index 0000000..13dbd32
--- /dev/null
+++ b/kartik/views/game.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="game.css">
+ <title>Kartik</title>
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script>
+ global.online = false;
+ global.paused = false;
+ global.keysEnabled = true;
+ global.started = false;
+ global.startHooks = [];
+ </script>
+ <script>
+ _sfx = false;
+
+
+ </script>
+</head>
+<body>
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="bg" style="display: none;background:black;position:fixed;top:0;left:0;right:0;bottom:0;z-index:1;">
+ <div id="box" style="display: none;background-color: #545454;position:fixed;top:0;left:0;right:0;bottom:0;z-index:2;">
+
+ <div id="online-login" style="display: none;position: fixed;top: 0;left: 0;bottom: 0;right: 0;background: transparent;z-index: 99999;padding: 50px;color: white;text-align: center;background:#111;">
+ <p id="serverinfo" style="display: grid; grid-template-columns: 32px 1fr; position: fixed;bottom: 20px;margin: 0;padding: 0;left: 20px;"><img src="../logo/logo.png" id="servericon" style="width: 32px; display: flex; align-content: center; justify-items: center;"> <span id="serverdata" style="text-align:left;margin-left:10px;display:inline-block;"><span id="servername" style="vertical-align: middle;">...</span><br><span id="serveraddr" style="opacity:.75;">0.0.0.0:0000</span></span></p>
+ <p id="connecting"><script id="pf1">document.write(lang.online.connecting);document.getElementById('pf1').outerHTML='';</script></p>
+ <p id="loading" style="display:none;"><script id="pf2">document.write(lang.online.loading);document.getElementById('pf2').outerHTML='';</script></p>
+ <div id="intro" style="display:none;">
+ <h2><script>document.write(lang.online.intro.create);</script></h2>
+ <p><script>document.write(lang.online.intro.pcreate);</script></p>
+ <span id="yourid" style="font-family:monospace;font-size:48px;">########</span>
+
+ <hr style="border-bottom: 0;">
+
+ <h2><script>document.write(lang.online.intro.join);</script></h2>
+ <p><script>document.write(lang.online.intro.pjoin);</script></p>
+ <input onchange="checkOnlineLogin();" onkeyup="checkOnlineLogin();" onkeydown="checkOnlineLogin();" id="theirid" style="font-family:monospace;font-size:48px;border:1px solid black;width: 5em;padding: 0;margin: 0;background: transparent;color: white;outline: none;" maxlength="8" placeholder="--------" length="8" spellcheck="false">
+ <script>document.getElementById('theirid').focus(); global.focuser = setInterval(() => { document.getElementById('theirid').focus(); }, 1);</script>
+ </div>
+ </div>
+
+ <div id="ping-chart" style="position: fixed;top: 4px;left: 4px;z-index: 9999999998;display: flex;width: 70px;height: 50px;justify-content: flex-end;align-items: flex-end;"></div>
+ <div id="ping-outer" style="position: fixed;top: 4px;left: 4px;z-index: 9999999999;display: flex;width: 70px;height: 50px;align-items: center;justify-content: center;">
+ <div id="ping" style="font-family:monospace;color: white;text-shadow: 1px 1px 5px black;font-size: 8px;">- ms</div>
+ </div>
+
+ <script>
+ if (!window.online) {
+ document.getElementById('ping-chart').style.display = "none";
+ document.getElementById('ping-outer').style.display = "none";
+ }
+ </script>
+
+ <div id="laps">
+ <span id="laps-inner-car0"><span id="laps-car0">0</span><hr class="laps-inner-sep">5</span>
+ <span id="laps-inner-car1"><span id="laps-car1">0</span><hr class="laps-inner-sep">5</span>
+ </div>
+ <div id="credits"><div id="credits-inner">
+ <div id="credits-race" style="
+ display: grid;
+ grid-template-columns: 1fr;
+ text-align: center;
+"><div id="race">
+ <img src="common/race.svg" style="vertical-align: middle;">
+ <div class="cbox"><span><span class="big" id="race-title">...</span><br><script>document.write(lang.game.credits.by);</script> <span id="race-author">...</span></span></div>
+ </div>
+ </div><div id="credits-cars" style="
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ margin-top: 16px;
+ text-align: center;
+"><div id="cars-p1" style="
+ display: grid;
+ grid-template-columns: 48px 1fr;
+">
+ <img src="../icons/gamepad.svg" style="vertical-align: middle;filter: brightness(0) invert(1) !important;width: 24px;">
+ <div class="cbox"><span><span class="big" id="cars-n1">1</span><br><img src="/" style="
+ width: 72px;
+ filter: none !important;
+" id="cars-p1-inner"></span></div>
+ </div><div style="
+ display: grid;
+ grid-template-columns: 48px 1fr;
+">
+ <img src="../icons/gamepad.svg" style="vertical-align: middle;filter: brightness(0) invert(1) !important;width: 24px;">
+ <div class="cbox"><span><span class="big" id="cars-n2">2</span><br><img src="/" style="
+ width: 72px;
+ filter: none !important;
+" id="cars-p2-inner"></span></div>
+ </div></div></div></div>
+ <div id="circuit" style="background-size: cover;background-position: center center;position: fixed;inset: 0;z-index: 2;background-color: rgb(255, 255, 255);width: 720px;height: 540px;">
+ ...
+ </div>
+
+ <script src="./script/game_select.js"></script>
+ </div>
+
+ <div id="paused" style="z-index:5;display:none;">
+ <div>
+ <h2 style="text-align:center;"><!--<script>document.write(lang.game.gpause.title);</script>--><img alt="full-logo" src="../logo/full.png" style="height: 96px;"></h2>
+ <div class="services">
+ <div class="items">
+ <ul style="padding:0;">
+ <li class="selected"><a href="#" id="continue"><script>document.write(lang.game.gpause.continueg);</script></a></li>
+ <li><a href="#" id="hitboxes"><script>document.write(lang.game.gpause.showhb);</script></a></li>
+ <li><a href="#" id="quit"><script>document.write(lang.game.gpause.quit);</script></a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <script src="../race/pause.js"></script>
+
+ <div id="debug" style="z-index:99999999999999999;position: fixed;display:none;font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;">
+ <span id="debug-left" style="position:fixed;left:2px;top:2px;text-align:left;color:white;font-size:10px;">
+ Kartik
+ </span>
+ <span id="debug-right" style="position:fixed;right:2px;top:2px;text-align:right;color:white;font-size:10px;">
+ Kartik
+ </span>
+ </div>
+
+ <script src="./script/game_music.js"></script>
+ <script>info("GameWindow", "Game started");</script>
+
+ </div>
+</body>
+<script src="../race/cars/car0.js"></script>
+<script src="../race/cars/car1.js"></script>
+<script src="../race/cars/car1ai.js"></script>
+<script src="../race/cars/keymap.js"></script>
+
+<script src="./script/game_global.js"></script>
+<script src="./script/game_debug.js"></script>
+<script src="./script/game_online.js"></script>
+
+<script src="./script/client_fullscreen.js"></script>
+
+</html>
diff --git a/kartik/views/hero.svg b/kartik/views/hero.svg
new file mode 100755
index 0000000..e19252e
--- /dev/null
+++ b/kartik/views/hero.svg
@@ -0,0 +1,3 @@
+<svg width="534" height="360" xmlns="http://www.w3.org/2000/svg">
+ <path d="M534 14.718A964.663 964.663 0 0 0 517.678 0H534v14.718zm0 1.524v21.47C520.671 24.453 506.625 11.881 493.247 0h22.741c5.997 5.287 12.036 10.7 18.012 16.242zm0 23.029v22.492c-16.968-18.565-36.071-35.9-53.74-51.934a5535.863 5535.863 0 0 1-6.31-5.732c-1.492-1.351-3.002-2.73-4.495-4.097h22.125c13.903 12.344 28.569 25.438 42.42 39.27zm0 24.118v23.68c-18.826-23.443-42.231-45.148-63.476-64.85-1.892-1.754-3.771-3.496-5.631-5.225a2037.489 2037.489 0 0 1-5.8-5.4c-4.146-3.87-8.35-7.793-12.583-11.594h21.325c1.788 1.639 3.608 3.304 5.404 4.933 2.083 1.895 4.189 3.806 6.31 5.732 17.923 16.262 37.322 33.87 54.451 52.724zm0 25.417v25.45c-19.336-29.199-47.757-56.111-73.004-80.02-1.679-1.59-3.345-3.168-4.997-4.736-1.588-1.501-3.175-3.008-4.758-4.512C442.118 16.323 432.714 7.392 423.329 0h21.553c4.54 4.052 9.051 8.26 13.496 12.41 1.902 1.775 3.867 3.61 5.803 5.402 1.86 1.729 3.739 3.471 5.631 5.226 21.529 19.964 45.273 41.99 64.188 65.768zm0 27.389v29.594a158.194 158.194 0 0 0-8.725-16.497c-18.574-30.497-47.85-58.768-73.679-83.711l-4.318-4.172c-1.191-1.148-2.38-2.296-3.567-3.443-10.514-10.157-20.446-19.751-30.766-27.821a166.548 166.548 0 0 0-2.48-1.888c-3.284-2.467-6.386-4.797-8.863-8.099L401.486 0h20.092c9.713 7.524 19.483 16.798 28.949 25.79 1.584 1.504 3.17 3.012 4.76 4.514 1.65 1.567 3.318 3.145 4.997 4.735C485.87 59.269 514.722 86.59 534 116.195zm0 32.156v39.53c-4.68-16.084-10.184-32.639-20.458-49.71-17.948-29.762-46.236-57.57-71.193-82.103-1.204-1.182-2.399-2.358-3.588-3.528l-2.083-2.042c-10.637-10.437-20.684-20.295-31.1-28.726a213.188 213.188 0 0 0-1.947-1.55c-3.457-2.733-6.722-5.313-9.193-8.993-2.398-3.57-4.603-7.383-6.715-11.229h12.456c.198.275.397.55.599.82 2.569 3.421 5.875 5.907 9.074 8.309.812.61 1.65 1.24 2.464 1.875 10.277 8.036 20.189 17.612 30.683 27.75 1.187 1.146 2.377 2.295 3.568 3.442 1.428 1.382 2.869 2.773 4.318 4.172 25.783 24.898 55.006 53.118 73.508 83.497 3.782 6.223 6.919 12.385 9.607 18.486zm0 43.266v36.71c-3.114-6.133-5.663-12.722-7.811-20.137a2817.08 2817.08 0 0 1-.955-3.39c-5.307-18.86-10.796-38.359-22.901-58.624-17.425-29.11-44.855-56.495-69.055-80.656l-2.781-2.777-.05-.05c-10.986-10.934-21.363-21.263-32.08-30.2-.492-.412-.989-.82-1.484-1.227-3.612-2.97-7.023-5.776-9.453-9.795-3.23-5.342-6.057-11.138-8.791-16.744-.76-1.56-1.534-3.144-2.32-4.727h10.218c2.211 4.046 4.523 8.07 7.053 11.837 2.566 3.816 6.048 6.568 9.416 9.23.638.503 1.296 1.023 1.937 1.543 10.376 8.4 20.407 18.242 31.026 28.66l2.082 2.042c1.188 1.17 2.384 2.345 3.587 3.528 24.912 24.49 53.15 52.247 71.027 81.893C523.6 156.904 529.11 174.525 534 191.617zm0 38.94v20.675a100.678 100.678 0 0 1-6.38-8.957c-5.397-8.538-9.438-17.877-12.717-29.382-5.035-18.109-10.742-38.632-22.9-59.23-16.974-28.68-43.828-55.839-67.522-79.801l-1.695-1.714c-10.679-10.763-21.146-21.177-31.805-30.274-.268-.23-.537-.458-.806-.686-3.714-3.154-7.222-6.133-9.563-10.41-2.69-4.914-5.03-10.181-7.291-15.274-1.56-3.51-3.17-7.137-4.886-10.627A995.835 995.835 0 0 0 366.034 0h9.135c.867 1.74 1.72 3.485 2.557 5.203 2.746 5.626 5.584 11.445 8.839 16.827 2.522 4.172 6.163 7.167 9.683 10.062.493.405.987.812 1.479 1.222 10.68 8.908 21.043 19.221 32.012 30.139l2.83 2.825c24.157 24.119 51.537 51.456 68.895 80.452 12.032 20.143 17.5 39.572 22.79 58.363.318 1.135.637 2.266.956 3.395 2.373 8.19 5.23 15.383 8.79 22.069zm0 22.302v14.36c-6.567-6.271-12.003-12.83-16.443-19.822-5.44-8.568-9.378-17.652-12.767-29.453-4.789-17.106-10.747-38.396-23.485-59.588-16.76-27.827-42.655-54.272-65.503-77.604l-.392-.4c-11.414-11.616-21.008-21.08-30.726-29.515l-.825-.714c-3.713-3.207-7.552-6.521-9.813-11.075-2.432-4.898-4.538-10.084-6.573-15.098-1.586-3.906-3.225-7.944-5.02-11.854-1.845-4.03-3.732-8.075-5.623-12.096h8.068a1464.55 1464.55 0 0 1 2.638 5.346c1.706 3.473 3.314 7.093 4.869 10.592 2.271 5.113 4.62 10.4 7.331 15.352 2.433 4.446 6.178 7.626 9.8 10.703l.804.684c10.628 9.073 21.08 19.47 31.742 30.216l1.694 1.713c23.651 23.92 50.458 51.03 67.366 79.599 12.086 20.477 17.773 40.929 22.792 58.977 3.308 11.61 7.387 21.035 12.84 29.662A101.99 101.99 0 0 0 534 252.86zm0 15.756v10.775c-.378-.296-.753-.594-1.126-.895-11.337-9.17-19.926-18.697-26.261-29.125-3.301-5.434-7.628-13.55-11.815-28.19-5.03-18.022-10.923-37.272-22.653-57.039-16.536-27.798-42.735-54.757-63.786-76.418-8.957-9.185-19.564-19.845-30.316-29.273l-.597-.523c-3.826-3.343-7.783-6.801-9.94-11.556-2.066-4.546-3.82-9.338-5.515-13.97-1.415-3.863-2.876-7.857-4.527-11.741-2.924-6.898-5.992-13.84-9.038-20.66h7.293c1.961 4.166 3.919 8.361 5.832 12.539 1.784 3.888 3.419 7.915 5 11.81 2.043 5.032 4.156 10.237 6.607 15.17 2.354 4.74 6.272 8.124 10.062 11.395l.823.712c9.693 8.414 19.27 17.862 30.666 29.46l.391.4c22.809 23.292 48.66 49.692 65.357 77.415 12.664 21.07 18.601 42.284 23.373 59.333 3.42 11.904 7.396 21.073 12.892 29.73 4.636 7.3 10.346 14.13 17.278 20.65zm0 12.054v9.105c-4.606-2.717-8.987-5.69-13.1-8.984-11.206-8.995-19.691-18.377-25.944-28.68-6.148-10.135-9.392-20.071-11.53-27.592-4.624-16.668-10.515-36.096-21.956-55.73-14.914-25.529-37.519-49.916-61.327-74.73-11.808-12.263-20.962-21.197-29.683-28.965l-.369-.328c-3.896-3.463-7.924-7.044-9.924-11.962-1.77-4.349-3.244-8.897-4.67-13.296-1.301-4.012-2.648-8.162-4.231-12.222-3.552-9.133-7.4-18.34-11.155-27.285h7.226c3.107 6.954 6.24 14.035 9.223 21.073 1.639 3.858 3.097 7.84 4.506 11.69 1.702 4.65 3.463 9.46 5.544 14.043 2.25 4.957 6.29 8.488 10.196 11.903l.597.522c10.726 9.405 21.314 20.047 30.258 29.217 21.014 21.624 47.166 48.534 63.64 76.228 11.666 19.658 17.535 38.832 22.547 56.79 2.219 7.755 5.579 17.996 11.927 28.447 6.397 10.53 15.062 20.142 26.49 29.386.572.462 1.15.918 1.735 1.37zm0 10.27v6.426c-11.695-5.307-21.055-11.05-29.065-17.8-23.404-19.788-29.998-38.183-34.341-53.867-4.414-16.318-10.42-35.579-21.506-54.709-14.596-25.111-37.137-49.771-58.975-72.877-9.991-10.532-19.23-19.643-28.245-27.852-3.824-3.477-7.779-7.073-9.576-12.077-1.496-4.163-2.706-8.49-3.876-12.674-1.158-4.142-2.356-8.426-3.852-12.652-3.454-9.796-7.319-19.695-11.057-29.268l-.397-1.016c-.328-.848-.655-1.71-.982-2.573h6.917c3.805 9.064 7.714 18.404 11.314 27.663 1.575 4.032 2.915 8.166 4.211 12.164 1.432 4.416 2.913 8.983 4.697 13.366 2.088 5.137 6.206 8.797 10.187 12.337l.368.326c8.701 7.751 17.839 16.669 29.627 28.912 23.764 24.769 46.325 49.107 61.183 74.54 11.38 19.529 17.247 38.88 21.856 55.49 2.155 7.586 5.427 17.608 11.64 27.847 6.314 10.407 14.876 19.874 26.172 28.942 4.297 3.443 8.878 6.535 13.7 9.352zm0 7.52v4.232a251.471 251.471 0 0 1-11.503-4.551c-13.42-5.724-23.694-11.791-32.335-19.094-10.317-8.751-18.007-17.829-23.508-27.75-5.018-9.048-7.766-18.003-9.988-26.329-3.508-13.503-9.533-33.79-21.308-53.96-14.283-24.394-36.17-48.728-55.566-69.622-8.896-9.549-17.578-18.239-26.54-26.567-3.583-3.325-7.646-7.093-9.205-12.174-1.173-3.82-2.085-7.757-2.967-11.565-.946-4.084-1.924-8.307-3.244-12.515-3.282-10.496-7.11-21.108-10.81-31.367-.546-1.524-1.09-3.1-1.619-4.624-.295-.856-.593-1.714-.893-2.573h6.577c.372.986.746 1.973 1.123 2.945l.396 1.019c3.735 9.566 7.595 19.456 11.045 29.237 1.484 4.194 2.678 8.46 3.832 12.586 1.175 4.202 2.39 8.547 3.898 12.744 1.882 5.241 5.93 8.92 9.843 12.479 8.997 8.192 18.22 17.287 28.193 27.801 21.797 23.063 44.294 47.673 58.837 72.692 11.027 19.029 17.008 38.21 21.404 54.467 2.149 7.76 5.094 16.984 10.649 26.558 5.751 9.915 13.605 19.012 24.013 27.811 8.168 6.885 17.717 12.725 29.676 18.12zm0 5.281v2.782c-23.545-8.055-45.41-16.441-61.59-31.001-20.303-18.343-25.648-34.298-30.108-51.768-4.91-19.756-11.444-36.665-19.975-51.694-12.978-22.787-32.614-45.621-51.901-66.904-8.158-8.97-16.797-17.79-26.411-26.962-3.866-3.68-7.162-7.094-8.36-11.586-1.014-3.807-1.727-7.726-2.416-11.516-.754-4.143-1.533-8.427-2.724-12.735-2.626-9.542-5.717-19.048-9.195-29.592a447.974 447.974 0 0 1-1.476-4.63c-.854-2.714-1.72-5.46-2.663-8.134h6.316c.34.97.676 1.939 1.01 2.905a486.437 486.437 0 0 0 1.622 4.633c3.697 10.252 7.521 20.852 10.796 31.328 1.31 4.173 2.283 8.376 3.224 12.44.887 3.827 1.803 7.782 2.987 11.635 1.639 5.337 5.802 9.201 9.476 12.61 8.946 8.312 17.611 16.986 26.49 26.517 19.36 20.856 41.204 45.14 55.437 69.449 5.61 9.609 13.911 25.63 21.205 53.709 2.238 8.391 5.01 17.417 10.08 26.56 5.56 10.027 13.323 19.193 23.732 28.023 8.716 7.366 19.068 13.48 32.576 19.244 3.86 1.646 7.819 3.195 11.868 4.687zm0 3.811v2.302a496.694 496.694 0 0 1-6.42-2.32c-2.881-1.048-5.763-2.082-8.55-3.083-25.398-9.119-47.333-16.993-63.873-32.563-18.576-17.576-23.355-32.744-27.301-49.339-4.294-18.56-10.685-35.583-18.996-50.598-12.66-22.779-31.652-45.348-50.29-66.344-8.485-9.522-16.672-17.69-23.561-24.425-3.63-3.542-6.966-7.09-7.91-11.562-.736-3.48-1.195-7.029-1.639-10.46-.52-4.021-1.058-8.179-2.05-12.421-2.212-9.512-4.983-18.995-7.867-28.68-.437-1.481-.874-3.027-1.298-4.521-1.302-4.588-2.629-9.266-4.304-13.537h6.233c.985 2.764 1.885 5.617 2.773 8.436a404.6 404.6 0 0 0 1.479 4.642c3.473 10.532 6.56 20.024 9.18 29.546 1.18 4.264 1.954 8.527 2.704 12.648.693 3.81 1.409 7.748 2.435 11.595 1.366 5.127 5.565 9.125 8.629 12.045 9.597 9.156 18.22 17.959 26.362 26.911 19.25 21.241 38.845 44.026 51.776 66.73 8.486 14.95 14.986 31.777 19.876 51.447 2.037 7.978 4.408 16.506 8.98 25.342 4.945 9.557 11.952 18.36 21.421 26.915C488.172 291 510.25 299.433 534 307.551zm0 3.322V360H0v-71.7a68.936 68.936 0 0 0 6.655 3.673c4.535 2.166 8.816 3.487 12.75 3.94l-.22-.066c-3.868-.478-8.068-1.79-12.512-3.913A68.865 68.865 0 0 1 0 288.251v-2.653c3.603 2.625 7.108 4.831 10.485 6.595 3.028 1.581 5.934 2.799 8.7 3.652.096.012.192.021.289.031-2.846-.853-5.84-2.098-8.966-3.73-3.384-1.768-6.896-3.98-10.508-6.613v-3.675c15.108 12.545 25.831 15.825 32.36 16.266l.003-.064c-6.525-.44-17.247-3.723-32.363-16.284v-4.671c.508.47 1.018.938 1.53 1.4 17.432 15.717 29.582 19.615 36.705 20.117l.005-.076c-7.11-.5-19.245-4.394-36.66-20.098-.53-.477-1.056-.96-1.58-1.446v-5.588a181.396 181.396 0 0 0 7.675 7.347c17.325 15.612 29.4 19.508 36.477 20.027l.006-.087c-12.8-.939-26.875-11.397-36.428-20.006-2.63-2.368-5.21-4.849-7.73-7.403v-6.464c4.417 4.854 9.07 9.57 13.881 13.9 9.495 8.551 23.484 18.95 36.205 19.922l.007-.098c-12.695-.971-26.665-11.357-36.149-19.899-4.835-4.35-9.508-9.09-13.944-13.97v-7.273c6.164 7.283 12.968 14.576 20.126 21.016 9.416 8.48 23.287 18.8 35.891 19.811l.009-.109c-12.576-1.009-26.426-11.316-35.83-19.784-7.185-6.464-14.013-13.789-20.196-21.1v-8.022c7.681 9.697 16.718 19.965 26.383 28.663 9.328 8.404 23.066 18.642 35.54 19.7l.008-.121c-12.441-1.054-26.157-11.279-35.472-19.67C16.762 269.066 7.696 258.757 0 249.03v-8.709c8.808 11.825 20.212 25.624 32.635 36.814 7.164 6.459 13.992 11.412 20.293 14.723 5.379 2.826 10.379 4.464 14.861 4.87l.012-.133c-12.295-1.11-25.864-11.25-35.082-19.56C20.256 265.81 8.817 251.955 0 240.106v-9.33c9.278 13.215 23.244 31.329 38.768 45.353 7.137 6.452 13.925 11.4 20.177 14.706 5.298 2.803 10.23 4.442 14.657 4.872l.013-.142c-4.41-.43-9.326-2.063-14.607-4.857-6.241-3.302-13.02-8.243-20.149-14.687C23.283 261.949 9.273 243.754 0 230.533v-9.891a450.788 450.788 0 0 0 3.62 5.362c6.58 9.626 13.773 19.125 20.801 27.47 8.136 9.66 16.041 17.807 23.496 24.214 11.904 10.242 22.48 15.92 31.435 16.876l.015-.154c-8.924-.953-19.473-6.62-31.355-16.843-8.115-6.975-24.657-22.96-44.27-51.653A448.124 448.124 0 0 1 0 220.368v-10.33a465.277 465.277 0 0 0 9.663 14.659c6.57 9.604 13.75 19.091 20.764 27.436 8.153 9.7 16.061 17.876 23.507 24.303 11.782 10.182 22.244 15.869 31.096 16.903l.019-.166c-8.821-1.03-19.255-6.704-31.013-16.865-8.093-6.986-24.6-22.994-44.241-51.707A466.28 466.28 0 0 1 0 209.735v-10.693a475.61 475.61 0 0 0 15.854 24.594c6.552 9.55 13.705 18.988 20.686 27.293 8.136 9.683 16.02 17.848 23.428 24.268 11.618 10.077 21.936 15.756 30.667 16.879l.022-.177c-8.699-1.119-18.987-6.784-30.58-16.838-8.04-6.967-24.457-22.925-44.083-51.528A474.176 474.176 0 0 1 0 198.706v-11.038a472.861 472.861 0 0 0 23.597 37.204c8.133 11.633 24.438 33.47 42.25 48.995 11.644 10.158 21.56 15.701 30.318 16.95l.026-.186c-8.722-1.243-18.61-6.774-30.226-16.907-17.797-15.513-34.091-37.336-42.22-48.963A472.418 472.418 0 0 1 0 187.297v-11.375c9.006 16.773 19.811 34.163 31.3 50.233 7.784 10.94 23.378 31.515 40.352 46.404 11.506 10.098 21.311 15.675 29.974 17.046l.03-.197c-8.626-1.366-18.4-6.927-29.878-17.002-16.959-14.875-32.543-35.436-40.323-46.369C19.9 209.874 9.035 192.373 0 175.511v-11.834c9.981 20.037 22.9 41.392 37.083 61.205 7.792 10.931 23.388 31.497 40.3 46.43 11.368 10.043 21.062 15.66 29.637 17.17l.035-.208c-8.538-1.504-18.2-7.105-29.54-17.123-16.897-14.919-32.481-35.47-40.268-46.393C22.984 204.833 10 183.348 0 163.215v-12.462c.317.713.641 1.431.973 2.157 9.876 21.74 25.119 47.545 41.816 70.8 7.799 10.918 23.4 31.472 40.255 46.457 11.229 9.988 20.819 15.654 29.317 17.32l.04-.218c-8.46-1.659-18.017-7.308-29.216-17.27-16.84-14.972-32.429-35.511-40.223-46.421-16.69-23.244-31.923-49.036-41.795-70.763-.4-.875-.788-1.74-1.167-2.596v-14.511c2.005 5.895 4.666 12.39 7.898 19.252 10.376 22.136 25.417 47.078 42.355 70.234 7.787 10.7 23.313 30.8 39.796 45.2 10.651 9.31 19.425 14.478 27.609 16.263l.046-.228c-8.146-1.777-16.887-6.93-27.51-16.214-16.466-14.385-31.98-34.47-39.762-45.162-16.683-22.81-32.112-48.394-42.33-70.194-3.344-7.097-6.077-13.803-8.102-19.854V98.419c.63 4.074.903 7.765 1.167 11.35.369 4.984.75 10.139 2.082 16.433 1.812 8.353 5.79 19.051 11.503 30.936 10.244 21.433 25.89 46.85 42.93 69.73 13.172 17.784 27.498 33.797 39.307 43.934 13 11.168 21.03 14.04 25.94 15.228l.054-.238c-4.887-1.183-12.882-4.043-25.843-15.179-11.796-10.125-26.11-26.124-39.27-43.895-17.03-22.868-32.669-48.27-42.906-69.688-5.704-11.868-9.676-22.547-11.484-30.88-1.328-6.277-1.708-11.423-2.076-16.4-.296-4.003-.601-8.142-1.404-12.801v-18.07C2.244 86.077 4.325 93.2 5.618 99.534c1.026 5.02 1.457 9.39 1.873 13.615.494 5.012 1.004 10.195 2.504 16.566 1.88 7.786 5.475 17.196 10.682 27.97 4.718 9.78 11.378 21.594 19.795 35.113 7.411 11.914 14.842 22.842 22.72 33.409 13.189 17.754 27.506 33.784 39.283 43.979 12.845 11.126 20.828 14.148 25.715 15.452l.062-.247c-4.865-1.3-12.813-4.309-25.619-15.402-11.764-10.182-26.068-26.198-39.245-43.938-7.873-10.56-15.301-21.483-22.708-33.392-8.413-13.51-15.068-25.316-19.782-35.088-5.2-10.758-8.788-20.15-10.664-27.918-1.495-6.353-2.004-11.526-2.498-16.53-.416-4.231-.848-8.608-1.876-13.64C4.52 92.914 2.336 85.506 0 78.045V65.453a913.718 913.718 0 0 0 3.4 10.35c3.135 9.428 6.379 19.174 8.24 27.453 1.126 5.02 1.664 9.364 2.184 13.564.573 4.622 1.165 9.402 2.54 15.136 2.09 8.524 6.304 19.08 12.186 30.525 10.232 19.995 24.549 42.573 40.314 63.572 13.167 17.638 27.438 33.61 39.153 43.82 12.514 10.913 20.173 14.088 25.447 15.635l.071-.257c-5.249-1.54-12.875-4.702-25.35-15.583-11.702-10.199-25.959-26.156-39.115-43.78-15.756-20.988-30.065-43.552-40.29-63.534-5.872-11.427-10.08-21.96-12.164-30.464-1.37-5.72-1.962-10.49-2.533-15.105-.522-4.206-1.06-8.557-2.188-13.591-1.864-8.293-5.11-18.046-8.251-27.478C2.416 72.027 1.16 68.252 0 64.598V52.185c.657 2.69 1.645 5.678 2.57 8.474.315.958.615 1.862.897 2.74C5.158 68.844 7.214 74.763 9.2 80.488c3.163 9.108 6.433 18.524 8.425 26.532 1.276 5.13 1.922 9.507 2.548 13.741.683 4.621 1.388 9.4 2.912 15.176 2.04 7.56 5.946 17.088 11.295 27.555 4.943 9.7 11.94 21.5 20.794 35.07 6.885 10.567 13.739 20.296 20.951 29.74 7.428 9.757 22.155 28.119 37.344 41.465 12.379 10.88 20.02 14.217 25.294 15.906l.08-.266c-5.249-1.683-12.857-5.005-25.199-15.852-15.171-13.332-29.886-31.677-37.307-41.427-7.208-9.438-14.058-19.161-20.94-29.724-8.849-13.561-15.84-25.351-20.779-35.043-5.34-10.45-9.238-19.96-11.273-27.5-1.521-5.76-2.225-10.531-2.907-15.144-.626-4.24-1.273-8.626-2.552-13.768-1.997-8.02-5.269-17.443-8.434-26.557-1.986-5.723-4.041-11.64-5.731-17.08-.283-.88-.582-1.785-.899-2.744C1.77 57.376.631 53.934 0 50.987V44.53c.63-1.427 1.745-2.072 2.832-2.7l.165-.095c.295-.167.594-.331.894-.497 3.438-1.894 6.994-3.853 7.988-10.453C13.152 21.66 11.85 8.453 8.846 0h2.683a57.635 57.635 0 0 1 1.712 4.504c2.77 8.515 4 21.158 2.923 30.065-.863 6.616-4.292 8.543-7.608 10.406-.288.161-.574.323-.86.486l-.177.105c-1.311.768-2.796 1.64-3.17 4.164a7.29 7.29 0 0 0-.078 1.11c0 3.507 1.93 9.13 3.653 14.153.326.95.634 1.848.923 2.712 1.825 5.639 4.059 11.796 6.218 17.75 3.048 8.405 6.2 17.096 8.285 24.533 1.592 5.685 2.406 10.391 3.194 14.943.732 4.237 1.49 8.617 2.873 13.776 2.159 7.86 6.275 17.625 11.904 28.236 10.323 19.574 25.739 42.96 42.294 64.162 7.043 9.069 21.007 26.182 35.404 38.914 12.215 10.802 19.835 14.295 25.107 16.132l.09-.274c-5.25-1.828-12.837-5.308-25.015-16.078-14.38-12.717-28.332-29.815-35.368-38.875-16.545-21.19-31.95-44.56-42.266-64.12-5.619-10.595-9.728-20.337-11.88-28.176-1.379-5.145-2.136-9.518-2.867-13.749-.788-4.559-1.604-9.272-3.201-14.972-2.086-7.449-5.24-16.145-8.29-24.554C13.17 79.4 10.937 73.246 9.113 67.61c-.29-.867-.598-1.765-.924-2.717-1.907-5.56-4.07-11.861-3.563-15.12.354-2.387 1.714-3.185 3.031-3.958l.179-.104c.282-.162.568-.323.855-.484 3.378-1.897 6.87-3.86 7.752-10.623 1.08-8.946-.155-21.644-2.937-30.193A59.678 59.678 0 0 0 11.842 0h2.263c1.306 2.609 2.615 5.557 3.64 8.823 2.732 8.937 3.96 22.06 2.853 30.523-.863 6.093-4.024 7.916-7.082 9.678-.443.255-.902.52-1.342.792l-.04.025c-1.156.734-2.468 1.565-2.779 3.884-.47 3.328 1.762 9.643 3.732 15.213.322.912.637 1.8.929 2.648 2.017 6.016 4.509 12.606 6.919 18.979 3.066 8.108 6.237 16.492 8.408 23.66 1.757 5.792 2.687 10.519 3.585 15.092.837 4.254 1.702 8.653 3.23 13.873 2.247 7.504 6.365 16.88 11.912 27.113 4.719 8.727 11.382 19.495 19.805 32.004 7.001 10.41 13.923 19.967 21.16 29.214 7.068 9.058 21.077 26.17 35.487 39.001 12.037 10.717 19.416 14.328 25.045 16.447l.1-.284c-5.606-2.11-12.953-5.707-24.955-16.391-14.393-12.815-28.388-29.912-35.45-38.963-7.233-9.242-14.15-18.792-21.147-29.196-8.417-12.502-15.076-23.261-19.791-31.98-5.536-10.214-9.647-19.57-11.888-27.053-1.523-5.206-2.387-9.598-3.222-13.845-.9-4.58-1.831-9.315-3.593-15.121-2.175-7.178-5.348-15.567-8.416-23.68-2.409-6.37-4.9-12.958-6.915-18.97-.292-.849-.607-1.738-.93-2.65-1.958-5.538-4.178-11.814-3.716-15.068.292-2.18 1.487-2.937 2.644-3.67l.038-.024c.435-.269.892-.532 1.333-.787 3.12-1.798 6.345-3.657 7.229-9.899 1.111-8.502-.12-21.681-2.865-30.657C17.01 5.504 15.721 2.586 14.434 0h2.347a76.684 76.684 0 0 1 5.204 12.557c2.748 8.992 4.108 22.282 3.16 30.911-.751 6.245-3.849 8.09-6.844 9.874-.433.258-.88.524-1.307.798l-.057.037c-1.113.73-2.375 1.559-2.611 3.905-.367 3.384 2.019 9.88 4.125 15.612.332.904.655 1.783.955 2.616 2.177 6.238 4.872 13.072 7.479 19.68 3.103 7.866 6.31 16 8.55 22.918 1.898 5.874 2.95 10.621 3.966 15.211.851 3.84 1.73 7.813 3.1 12.4 2.211 7.26 6.097 15.998 11.547 25.973 4.987 9.154 12.367 20.85 21.34 33.82 6.489 9.393 12.8 17.966 19.293 26.205 7.075 9.007 21.093 26.039 35.48 38.91 11.905 10.65 19.296 14.426 24.955 16.714l.11-.29c-5.635-2.28-12.997-6.04-24.867-16.659-14.37-12.857-28.374-29.872-35.444-38.87-6.49-8.236-12.797-16.803-19.281-26.191-8.968-12.963-16.342-24.648-21.323-33.793-5.363-9.816-9.348-18.776-11.523-25.913-1.366-4.574-2.244-8.54-3.093-12.375-1.018-4.598-2.07-9.353-3.974-15.241-2.242-6.927-5.452-15.066-8.556-22.937-2.605-6.605-5.3-13.436-7.474-19.669-.3-.835-.623-1.715-.957-2.62-1.99-5.417-4.467-12.158-4.106-15.468.22-2.197 1.365-2.948 2.472-3.675l.056-.036c.423-.27.867-.535 1.298-.791 3.06-1.822 6.225-3.708 6.993-10.108.954-8.668-.41-22.014-3.174-31.043A76.946 76.946 0 0 0 17.126 0h1.962c2.829 4.886 5.434 10.931 7.285 17.026 2.69 9.108 4.083 22.014 3.309 30.683-.631 6.412-3.671 8.294-6.611 10.115-.418.26-.852.527-1.265.803l-.068.046c-1.073.73-2.288 1.56-2.449 3.946a7.14 7.14 0 0 0-.017.498c0 3.348 2.134 9.015 4.026 14.044.331.88.655 1.74.956 2.56 2.447 6.823 5.541 14.359 8.535 21.647 3.212 7.821 6.246 15.208 8.561 21.821 2.18 6.231 3.388 11.15 4.556 15.908.903 3.677 1.836 7.48 3.209 11.833 2.349 7.292 6.472 16.227 11.923 25.838 9.81 17.402 25.198 39.602 41.165 59.382 7.038 8.77 20.94 25.33 34.971 37.687 11.074 9.752 17.898 13.382 23.623 15.851l.12-.298c-5.7-2.46-12.499-6.077-23.54-15.8-14.013-12.34-27.901-28.883-34.933-37.648-15.956-19.767-31.334-41.95-41.136-59.337-5.44-9.593-9.554-18.505-11.896-25.776-1.369-4.341-2.302-8.139-3.203-11.811-1.17-4.766-2.38-9.692-4.565-15.938-2.319-6.622-5.354-14.013-8.568-21.839-2.991-7.283-6.085-14.816-8.53-21.634-.301-.822-.625-1.681-.957-2.563-1.978-5.255-4.22-11.211-3.989-14.4.15-2.227 1.247-2.976 2.31-3.7l.066-.045c.408-.271.839-.538 1.255-.796 3.007-1.863 6.115-3.787 6.763-10.362.778-8.707-.62-21.665-3.322-30.812C24.835 10.881 22.257 4.88 19.452 0h1.687c1.915 2.874 3.358 5.991 5.04 9.757 1.617 3.618 3.289 7.56 4.562 11.864 2.69 9.372 4.153 22.712 3.403 31.03-.615 6.12-3.489 7.978-6.268 9.773-.42.27-.852.55-1.266.839l-.073.052c-1.034.74-2.207 1.58-2.288 4.015-.04 1.27.246 2.946.851 4.98.9 3.031 2.208 6.42 3.474 9.699.364.943.727 1.883 1.08 2.814 2.633 7.045 5.964 14.827 9.185 22.352 3.142 7.34 6.11 14.274 8.457 20.52 2.494 6.637 3.866 11.74 5.194 16.675.941 3.499 1.915 7.117 3.275 11.221 2.424 7.16 6.67 16.041 12.28 25.68 4.341 7.472 10.385 16.687 18.475 28.172 7.62 10.83 15.241 20.866 23.302 30.682 11.86 14.489 24.423 27.79 34.468 36.49 10.78 9.343 17.189 12.644 22.348 15.005l.132-.307c-5.14-2.352-11.522-5.64-22.271-14.954-10.032-8.69-22.58-21.976-34.428-36.45-8.056-9.81-15.673-19.841-23.288-30.664-8.085-11.477-14.122-20.683-18.458-28.147-5.599-9.62-9.835-18.478-12.252-25.617-1.357-4.095-2.329-7.707-3.269-11.201-1.33-4.944-2.705-10.055-5.205-16.707-2.349-6.253-5.319-13.19-8.462-20.536-3.22-7.522-6.549-15.3-9.18-22.337-.353-.932-.717-1.874-1.08-2.816-1.263-3.272-2.57-6.655-3.465-9.674-.595-1.998-.876-3.636-.838-4.87.075-2.267 1.13-3.022 2.149-3.75l.072-.052c.406-.283.818-.55 1.254-.831 2.713-1.752 5.787-3.739 6.42-10.025.752-8.355-.716-21.75-3.416-31.159-1.28-4.325-2.957-8.279-4.578-11.907C24.823 5.917 23.4 2.84 21.532 0h1.324c.864 1.221 1.744 2.475 2.542 3.722 1.963 3.057 3.4 6.302 5.075 10.23 1.518 3.558 3.249 7.732 4.557 12.212 2.732 9.647 4.283 23.114 3.609 31.324-.551 5.947-3.27 7.808-5.898 9.608-.478.328-.974.666-1.438 1.022l-.029.022c-.993.78-2.116 1.664-2.061 4.24.056 3.301 2.41 9.126 4.488 14.266.365.902.72 1.78 1.05 2.617 2.9 7.499 6.596 15.799 10.172 23.826 3.22 7.23 6.262 14.058 8.693 20.193 2.66 6.73 4.162 11.855 5.614 16.813.908 3.102 1.847 6.31 3.059 9.862 2.419 6.954 6.465 15.27 12.025 24.716 4.603 7.84 11.379 17.943 20.14 30.025 7.138 9.864 14.146 18.924 21.42 27.7 6.975 8.44 20.725 24.377 34.437 36.29 10.674 9.275 17.14 12.74 22.361 15.26l.142-.314c-5.203-2.51-11.644-5.963-22.287-15.212-13.694-11.897-27.43-27.818-34.399-36.25-7.27-8.77-14.273-17.825-21.407-27.683-8.754-12.074-15.523-22.165-20.121-29.997-5.55-9.427-9.585-17.721-11.996-24.652-1.209-3.543-2.147-6.748-3.054-9.847-1.454-4.965-2.957-10.099-5.624-16.844-2.434-6.142-5.477-12.974-8.699-20.207-3.574-8.023-7.27-16.32-10.165-23.812-.333-.838-.688-1.718-1.053-2.62-2.065-5.112-4.407-10.905-4.463-14.14-.054-2.399.955-3.192 1.93-3.957l.026-.022c.457-.348.926-.67 1.423-1.01 2.57-1.76 5.48-3.753 6.046-9.866.678-8.249-.88-21.77-3.62-31.454-1.315-4.5-3.05-8.685-4.573-12.253-1.68-3.942-3.124-7.201-5.102-10.28A92.939 92.939 0 0 0 23.271 0h1.375c.772 1.237 1.593 2.452 2.404 3.653.887 1.309 1.803 2.664 2.628 4.008 1.988 3.229 3.402 6.558 5.045 10.575 1.677 4.097 3.289 8.14 4.571 12.56 2.787 9.926 4.438 23.516 3.84 31.612-.497 5.851-3.113 7.743-5.642 9.573-.43.31-.873.63-1.293.964l-.06.05c-1.012.825-2.16 1.758-1.943 4.6.084 1.093.39 2.479.91 4.12 1.044 3.304 2.654 7.162 4.211 10.893.391.937.78 1.865 1.152 2.772 3.052 7.522 6.909 15.828 10.637 23.858 3.07 6.612 5.969 12.856 8.37 18.529 3.115 7.35 4.835 12.777 6.498 18.025.955 3.014 1.943 6.13 3.18 9.558 2.423 6.579 6.299 14.341 11.52 23.072 6.292 10.555 15.36 23.155 21.859 31.867 6.593 8.857 12.973 16.953 19.503 24.75 6.988 8.369 20.756 24.19 34.456 36.114 10.598 9.226 17.135 12.857 22.432 15.536l.152-.321c-5.278-2.67-11.795-6.288-22.362-15.488-13.682-11.907-27.436-27.713-34.418-36.074-6.525-7.792-12.901-15.882-19.49-24.733-6.495-8.705-15.555-21.295-21.84-31.837-5.208-8.712-9.075-16.455-11.49-23.011-1.234-3.42-2.22-6.533-3.175-9.544-1.666-5.258-3.388-10.693-6.51-18.058-2.404-5.679-5.304-11.925-8.375-18.539-3.726-8.028-7.58-16.328-10.63-23.843-.374-.909-.762-1.836-1.153-2.774-1.555-3.723-3.161-7.573-4.2-10.863-.511-1.613-.812-2.972-.894-4.036-.2-2.65.823-3.485 1.812-4.29l.06-.048c.411-.327.832-.631 1.277-.954 2.474-1.789 5.278-3.816 5.79-9.836.6-8.135-1.057-21.78-3.854-31.742-1.288-4.44-2.903-8.492-4.584-12.599-1.649-4.032-3.07-7.374-5.073-10.626-.828-1.35-1.746-2.71-2.633-4.024A126.236 126.236 0 0 1 25.059 0h1.88c1.21 2.67 2.862 5.227 4.479 7.729.836 1.293 1.7 2.631 2.482 3.952 2.05 3.457 3.546 7.125 5.29 11.56 1.591 4.05 3.122 8.033 4.343 12.258 2.763 9.849 4.507 23.013 4.149 31.3-.324 6.136-2.882 8.139-5.356 10.075-.413.324-.84.658-1.243 1.004l-.12.105c-.954.838-2.036 1.786-1.794 4.573.27 3.229 2.599 8.63 4.652 13.396.384.892.76 1.763 1.11 2.595 3.474 8.4 8.006 17.798 12.388 26.886 3.16 6.554 6.146 12.744 8.64 18.35 3.297 7.419 5.133 12.821 6.908 18.045.983 2.891 1.998 5.88 3.246 9.159 2.615 6.736 6.664 14.525 12.034 23.151 4.803 7.727 11.906 17.857 20.542 29.293 6.55 8.686 12.976 16.739 19.646 24.616 7.01 8.307 20.817 24.024 34.527 35.968 10.54 9.182 16.928 12.856 22.569 15.831l.143-.29c2.408 1.522 4.571 2.743 6.637 3.873l.089-.174c-.635-.41-1.285-.839-1.951-1.29-5.265-2.972-11.403-6.9-20.67-14.973-12.955-11.292-26.097-25.948-32.776-33.68-7.348-8.483-14.428-17.192-21.646-26.624-8.336-10.877-14.806-19.896-19.229-26.804-5.736-8.945-10.036-16.97-12.78-23.85-1.06-2.709-1.986-5.253-2.881-7.715-2.064-5.671-4.198-11.536-8.121-19.852-2.442-5.175-5.274-10.813-8.272-16.782-4.558-9.075-9.271-18.459-12.925-26.873-.385-.876-.777-1.758-1.168-2.64-1.381-3.108-2.81-6.323-3.935-9.287-.833-2.194-1.326-3.981-1.46-5.31-.249-2.469.62-3.322 1.457-4.149l.082-.08c.433-.415.886-.799 1.365-1.205 2.285-1.935 4.875-4.128 5.143-10.283.274-7.93-1.512-20.979-4.247-31.03-1.231-4.386-2.751-8.472-4.33-12.62l-.172-.452c-1.641-4.314-3.059-8.04-5.111-11.666-.815-1.446-1.72-2.9-2.595-4.305C33.743 8.033 31.33 4.155 30.34 0h3.518a18.52 18.52 0 0 0 .452 4.044c.985 4.333 3.409 8.363 5.752 12.26.894 1.486 1.818 3.023 2.646 4.55 1.895 3.485 3.21 7.038 4.732 11.153l.295.795c1.51 4.074 3.072 8.287 4.34 12.743 2.937 10.664 4.853 24.028 4.556 31.775-.27 5.53-2.476 7.561-4.61 9.526-.578.532-1.124 1.034-1.634 1.605-.766.884-1.72 1.983-1.215 4.949.2 1.165.64 2.645 1.312 4.4 1.203 3.147 2.828 6.657 4.399 10.052.43.93.858 1.854 1.275 2.766 3.932 8.699 8.994 18.388 13.89 27.76 3.007 5.756 5.847 11.192 8.322 16.196 2.426 4.968 5.145 10.641 6.925 15.04.867 2.141 1.575 4.102 2.26 5.999.788 2.178 1.601 4.429 2.639 6.898 7.066 16.935 27.49 45.69 53.297 75.042 15.62 17.848 27.29 28.631 32.856 33.472 5.67 4.93 10.133 8.318 14.005 10.94.666.451 1.316.88 1.95 1.29 2.496 1.61 4.769 2.929 7.01 4.194l.035-.067c-1.047-.691-2.16-1.45-3.348-2.295-5.14-3.058-10.918-6.981-19.408-14.36-12.95-11.261-26.12-25.782-32.818-33.437-25.782-29.321-46.178-58.034-53.23-74.933-1.034-2.46-1.81-4.607-2.632-6.88-.686-1.9-1.397-3.864-2.266-6.012-1.785-4.411-4.507-10.091-6.937-15.067-2.477-5.008-5.318-10.447-8.326-16.204-4.893-9.366-9.954-19.052-13.88-27.74-.419-.914-.846-1.84-1.277-2.77-1.568-3.388-3.19-6.891-4.388-10.026-.662-1.73-1.097-3.185-1.292-4.324-.473-2.78.376-3.757 1.123-4.618.494-.555 1.033-1.051 1.604-1.576 2.091-1.924 4.46-4.106 4.738-9.801.297-7.784-1.625-21.2-4.57-31.901-1.274-4.473-2.838-8.693-4.35-12.774l-.295-.796c-1.528-4.128-2.848-7.694-4.756-11.204-.832-1.535-1.759-3.075-2.654-4.565-2.328-3.87-4.735-7.873-5.705-12.143A17.751 17.751 0 0 1 34.23 0h4.368c-.324 1.263-.468 2.634-.468 3.984 0 1.328.138 2.635.376 3.79.913 4.502 3.356 8.696 5.72 12.75.836 1.436 1.701 2.922 2.481 4.391 1.973 3.708 3.333 7.461 4.907 11.807l.377 1.038c1.525 4.202 3.103 8.546 4.388 13.111 2.945 10.804 4.889 23.68 4.729 31.312-.171 5.584-2.28 7.725-4.319 9.794-.513.521-.997 1.013-1.453 1.561l-.06.073c-.768.947-1.64 2.02-1.172 4.835.24 1.433.858 3.335 1.837 5.652 1.356 3.209 2.993 6.629 4.575 9.936.381.797.763 1.594 1.14 2.39 4.231 8.988 9.66 18.983 14.912 28.65 3.013 5.545 5.858 10.784 8.37 15.63 2.638 5.155 5.333 10.508 7.176 14.739 1.066 2.44 1.906 4.626 2.72 6.737.838 2.181 1.705 4.435 2.799 6.905 2.733 6.137 6.784 13.268 12.042 21.197 4.12 6.224 10.489 14.783 18.933 25.439a588.521 588.521 0 0 0 21.958 26.2c8.228 9.275 20.625 22.576 32.956 33.265 4.935 4.276 9.021 7.445 12.476 9.9 1.189.844 2.3 1.604 3.348 2.295 2.694 1.778 4.955 3.107 6.928 4.251l.004.003c.161.095.32.187.478.278l.179-.33-.303-.203a159.899 159.899 0 0 1-4.767-2.853 131.682 131.682 0 0 0 4.413 3.108l.477.278-.478-.278c2.692 1.814 4.975 3.2 6.976 4.392a145.138 145.138 0 0 1-5.215-3.716l.011.007a143.86 143.86 0 0 0 5.204 3.708c3.063 2.08 5.622 3.637 7.838 4.977l.005.004c3.221 2.195 5.913 3.848 8.235 5.273l.014-.025c3.307 2.268 6.12 4.014 8.66 5.591l.045-.078a179.96 179.96 0 0 1-4.885-3.499c-4.965-3.22-11.083-7.527-19.431-14.606-11.664-9.894-23.43-21.8-31.247-30.045-6.65-7.002-13.203-14.23-20.038-22.096-6.553-7.53-15.667-18.278-21.875-26.727-5.591-7.598-9.77-14.231-13.153-20.876l-1.116-2.238c-3.894-7.817-7.572-15.2-15.296-27.728-2.428-3.94-5.029-8.072-7.782-12.446-7.059-11.215-14.358-22.812-19.994-33.153-.467-.85-.935-1.697-1.402-2.543-1.82-3.297-3.705-6.706-5.332-9.954-1.106-2.205-1.864-3.993-2.317-5.464-.99-3.233-.406-4.576.062-5.652.426-.942.954-1.773 1.513-2.654 1.486-2.339 3.168-4.99 3.032-10.399-.278-8.241-3.18-21.722-5.935-31.427-1.239-4.235-2.676-8.363-4.066-12.354-.306-.878-.61-1.752-.91-2.62l-.453-1.32c-1.516-4.411-2.825-8.22-4.727-12.114-.787-1.617-1.66-3.246-2.503-4.82-2.23-4.166-4.536-8.472-5.485-12.964-.915-4.244-.451-8.844 1.13-11.189.683-1.015 1.552-1.603 2.583-1.748 1.997-.3 4.186.526 6.303 1.326l.108.04c1.029.388 2.075.808 3.087 1.215 1.683.675 3.422 1.374 5.16 1.956 3.876 1.3 7.312 1.92 10.504 1.9.59-.002 1.181.005 1.807.012 2.485.029 5.054.059 7.444-.56 3.234-.856 5.056-3.464 6.016-5.5 1.221-2.594 1.756-5.82 1.465-8.85-.089-.914-.23-1.803-.41-2.671h1.853c.638 1.966 1.124 4.023 1.325 6.225.5 5.553-1.679 12.343-6.692 14-2.242.727-4.704.782-7.087.837-.673.015-1.309.029-1.944.058-3.135.145-6.51-.365-10.316-1.561-1.84-.577-3.687-1.297-5.474-1.994-.882-.344-1.794-.7-2.692-1.033l-.179-.066c-2.12-.788-4.31-1.601-6.364-1.282-1.084.158-2 .775-2.72 1.834-1.185 1.742-1.65 4.412-1.65 7.035 0 1.514.155 3.014.418 4.308.953 4.814 3.397 9.42 5.762 13.876.94 1.772 1.913 3.605 2.777 5.426 1.686 3.534 2.91 7.114 4.207 10.904.25.732.505 1.475.767 2.233.357 1.027.72 2.063 1.085 3.106 1.292 3.683 2.628 7.492 3.809 11.37 2.773 9.388 6.147 23.457 6.525 32.21.174 5.002-1.215 7.491-2.557 9.897-.597 1.071-1.161 2.082-1.579 3.287-.48 1.447-.814 3.023.358 6.346.485 1.37 1.25 3.063 2.275 5.035 1.572 3.025 3.397 6.205 5.16 9.28.563.98 1.126 1.963 1.685 2.946 6.136 10.883 14.141 23.12 21.884 34.956 2.845 4.35 5.534 8.46 8.052 12.387 8.5 13.25 12.482 20.926 16.697 29.052l.38.731c3.788 7.176 8.216 13.955 14.355 21.984 5.846 7.655 14.562 17.693 20.844 24.767 6.9 7.783 13.498 14.924 20.172 21.835 11.438 11.86 21.995 21.872 31.374 29.757 4.047 3.4 7.591 6.181 10.749 8.522 1.825 1.184 3.497 2.222 5.063 3.195l-.177.304v.001l.178-.304c-.783-.487-1.593-.99-2.434-1.518.841.529 1.65 1.031 2.434 1.518l-.177.304a176.52 176.52 0 0 0 0 0c3.577 2.47 6.609 4.37 9.334 6.076l.078-.134a193.424 193.424 0 0 1-4.378-3.127 348.755 348.755 0 0 0 4.531 2.869l-.152.26a190.325 190.325 0 0 1-4.382-3.13h.003a348.755 348.755 0 0 0 4.531 2.87l-.152.26a190.325 190.325 0 0 1-4.382-3.13h.003l-.004-.002c-5.205-3.363-11.616-7.82-20.385-15.19-9.368-7.875-19.913-17.876-31.341-29.726-6.67-6.906-13.264-14.043-20.16-21.82-6.277-7.069-14.985-17.099-20.823-24.742-6.123-8.007-10.538-14.768-14.313-21.918l-.378-.73c-4.22-8.134-8.206-15.819-16.718-29.089-2.52-3.928-5.21-8.038-8.056-12.39-7.737-11.83-15.739-24.062-21.868-34.932-.56-.983-1.124-1.967-1.686-2.947-1.762-3.071-3.584-6.248-5.152-9.265-1.015-1.953-1.772-3.627-2.249-4.975-1.122-3.183-.808-4.673-.356-6.037.403-1.163.957-2.157 1.544-3.208 1.372-2.464 2.793-5.009 2.616-10.146-.38-8.797-3.763-22.91-6.545-32.327-1.184-3.889-2.522-7.702-3.816-11.39-.365-1.042-.728-2.077-1.085-3.104-.262-.757-.516-1.5-.766-2.232-1.301-3.803-2.53-7.397-4.228-10.954-.869-1.828-1.843-3.666-2.786-5.443-2.349-4.426-4.777-9.002-5.717-13.749-.697-3.443-.63-8.35 1.161-10.988.646-.95 1.46-1.504 2.421-1.643 1.944-.303 4.082.491 6.15 1.258l.178.066c.895.332 1.806.688 2.686 1.03 1.793.7 3.649 1.423 5.501 2.005 3.856 1.21 7.279 1.727 10.466 1.58.63-.03 1.263-.044 1.933-.059 2.413-.054 4.908-.11 7.212-.857 5.234-1.731 7.514-8.75 7.004-14.476-.199-2.19-.674-4.232-1.299-6.182h1.533c1.18 2.899 2.191 5.948 2.577 9.34.342 3.057-.057 6.33-1.095 8.98-.819 2.088-2.424 4.8-5.422 5.853-2.064.71-4.33.853-6.52.993-.663.042-1.349.085-2.004.144-3.159.287-6.518-.102-10.269-1.191-1.907-.554-3.823-1.276-5.676-1.974-.797-.3-1.62-.61-2.43-.902l-.289-.104c-2.059-.746-4.188-1.515-6.166-1.166-1.073.177-1.97.814-2.667 1.893-1.094 1.698-1.526 4.204-1.526 6.734 0 1.822.225 3.655.587 5.206 1.06 4.624 3.394 9.044 5.65 13.32.895 1.696 1.82 3.45 2.656 5.195 1.838 3.826 3.19 7.721 4.623 11.845.261.754.528 1.52.802 2.3.385 1.095.777 2.198 1.173 3.31 1.317 3.703 2.679 7.533 3.894 11.42 3.088 10.175 6.547 24.033 6.995 32.412.21 4.77-1.021 7.298-2.212 9.744-.557 1.143-1.082 2.221-1.449 3.496-.417 1.52-.69 3.16.553 6.513.506 1.36 1.278 3.002 2.364 5.024 1.866 3.473 4.089 7.177 6.238 10.76.565.94 1.129 1.882 1.689 2.821 6.41 10.838 14.686 22.998 22.691 34.758 2.834 4.164 5.51 8.096 8.041 11.877 3.846 5.798 8.196 12.395 11.145 17.329 2.099 3.51 3.614 6.399 5.08 9.192.824 1.568 1.6 3.05 2.477 4.639 3.793 6.842 8.13 13.28 14.063 20.878 4.567 5.854 11.59 14.015 20.874 24.255 6.95 7.677 13.591 14.727 20.301 21.552 11.496 11.71 22.088 21.61 31.483 29.425 4.17 3.467 7.827 6.308 11.092 8.708a359.643 359.643 0 0 0 4.534 2.871l-.152.26c3.823 2.65 7.059 4.685 9.959 6.51l.11-.187.001.001.126-.213a469.532 469.532 0 0 1-3.984-2.526c1.347.98 2.63 1.889 3.856 2.738l.002.001.063-.106-.031.053-.032.053c-1.226-.849-2.51-1.759-3.858-2.74 1.404.903 2.726 1.736 3.984 2.527l-.094.16-.032.053c-1.226-.849-2.51-1.759-3.858-2.74 1.404.903 2.726 1.736 3.984 2.527l-.063.107.063-.107a471.755 471.755 0 0 1-3.985-2.53c-5.46-3.512-12.184-8.123-21.4-15.787-9.384-7.805-19.965-17.695-31.449-29.393a712.078 712.078 0 0 1-20.289-21.54c-9.277-10.231-16.292-18.384-20.851-24.229-5.917-7.577-10.242-13.997-14.023-20.816-.873-1.583-1.65-3.063-2.472-4.63-1.469-2.799-2.988-5.694-5.093-9.215-2.954-4.941-7.308-11.546-11.157-17.348a1860.77 1860.77 0 0 0-8.043-11.88c-8-11.754-16.273-23.908-22.675-34.733-.56-.94-1.124-1.882-1.69-2.822-2.146-3.578-4.366-7.278-6.227-10.74-1.074-2.002-1.84-3.626-2.336-4.964-1.194-3.219-.938-4.778-.541-6.214.354-1.232.87-2.293 1.418-3.417 1.216-2.498 2.474-5.082 2.26-9.978-.451-8.425-3.92-22.327-7.016-32.53-1.219-3.898-2.582-7.733-3.901-11.44a610.444 610.444 0 0 1-1.973-5.607c-1.437-4.137-2.794-8.044-4.644-11.896-.84-1.754-1.768-3.51-2.664-5.212-2.242-4.248-4.56-8.64-5.607-13.205-.846-3.606-.932-8.765.875-11.569.623-.965 1.416-1.534 2.363-1.69 1.864-.328 3.938.422 5.943 1.147l.288.105c.808.291 1.63.6 2.425.9 1.861.701 3.785 1.426 5.709 1.985 3.805 1.105 7.217 1.5 10.431 1.206.65-.058 1.302-.1 1.993-.145 2.22-.14 4.514-.286 6.636-1.016 2.502-.88 4.472-2.996 5.698-6.123 1.066-2.72 1.476-6.077 1.124-9.21-.384-3.38-1.373-6.41-2.535-9.285h204.68c1.725 4.325 3.083 9.115 4.413 13.808.424 1.497.863 3.044 1.301 4.532 2.88 9.672 5.648 19.138 7.852 28.623.98 4.194 1.516 8.326 2.032 12.323.447 3.452.909 7.02 1.652 10.538 1.001 4.741 4.441 8.41 8.181 12.058 6.878 6.723 15.05 14.878 23.517 24.377 18.6 20.954 37.551 43.474 50.167 66.17 8.266 14.934 14.625 31.873 18.898 50.347 3.984 16.753 8.81 32.065 27.58 49.824 7.629 7.181 16.834 13.189 28.97 18.904 10.82 5.095 22.674 9.352 35.226 13.859 2.786 1 5.667 2.034 8.545 3.08 2.226.823 4.47 1.632 6.732 2.43zM0 43.942v-7.01c3.334-1.874 6.555-4.166 7.44-10.603C8.479 18.295 7.668 7.84 5.52 0h3.038c3.017 8.411 4.33 21.626 3.057 30.747-.973 6.46-4.468 8.386-7.849 10.25-.3.164-.6.33-.898.498l-.165.095c-.96.554-2.01 1.16-2.703 2.352zm0-7.314v-6.96c1.342-1.588 2.388-3.715 2.874-6.811C3.897 15.915 3.469 7.248 1.911 0h3.34c2.154 7.815 2.97 18.266 1.933 26.293C6.327 32.518 3.233 34.797 0 36.628zm0-7.362V0h1.657c1.562 7.23 1.994 15.886.973 22.818-.453 2.885-1.403 4.914-2.63 6.448zM27.336 0h2.626c.993 4.249 3.442 8.183 5.81 11.988.873 1.402 1.776 2.853 2.586 4.291 2.037 3.6 3.45 7.314 5.086 11.614l.171.452c1.577 4.14 3.093 8.217 4.32 12.586 2.726 10.016 4.506 23.016 4.233 30.91-.26 5.984-2.674 8.028-5.008 10.005-.484.41-.941.797-1.384 1.222l-.083.082c-.861.847-1.837 1.808-1.57 4.463.139 1.363.638 3.183 1.484 5.41 1.13 2.973 2.56 6.193 3.942 9.307.392.882.784 1.762 1.167 2.638 3.658 8.422 8.374 17.812 12.934 26.891 2.998 5.967 5.828 11.603 8.267 16.773 3.917 8.302 6.047 14.157 8.107 19.82.897 2.464 1.824 5.01 2.884 7.726 2.755 6.903 7.066 14.95 12.815 23.915 4.428 6.917 10.904 15.945 19.246 26.83 7.223 9.44 14.308 18.153 21.66 26.642 6.687 7.74 19.841 22.41 32.815 33.717 6.496 5.66 11.46 9.288 15.663 11.978-5.505-2.923-11.805-6.632-22.014-15.527-13.692-11.929-27.486-27.63-34.49-35.928-6.665-7.874-13.087-15.92-19.633-24.6-8.63-11.427-15.726-21.547-20.523-29.265-5.358-8.607-9.397-16.376-12.002-23.088-1.245-3.272-2.259-6.258-3.24-9.145-1.778-5.232-3.618-10.643-6.92-18.076-2.497-5.613-5.483-11.806-8.646-18.361-4.381-9.084-8.91-18.476-12.38-26.869a407.19 407.19 0 0 0-1.112-2.597c-2.042-4.74-4.357-10.112-4.621-13.278-.225-2.599.738-3.443 1.67-4.26l.118-.105c.394-.338.8-.656 1.229-.991 2.42-1.895 5.164-4.041 5.496-10.351.36-8.324-1.39-21.539-4.162-31.423-1.227-4.241-2.76-8.234-4.356-12.292-1.75-4.452-3.25-8.133-5.315-11.613-.785-1.327-1.652-2.669-2.49-3.967-1.577-2.44-3.186-4.932-4.38-7.524zm11.66 0h5.907a5.506 5.506 0 0 0-.832.953C42.804 2.777 42.3 5.428 42.3 8.008c0 1.372.142 2.726.39 3.924.927 4.58 3.372 8.888 5.736 13.054.926 1.631 1.883 3.318 2.733 4.993 1.698 3.337 2.938 6.845 4.25 10.56l.464 1.31.46 1.294c1.39 3.9 2.826 7.933 4.035 12.13 3.16 11.345 5.28 24.571 5.16 32.16-.144 5.333-2.108 7.516-4.005 9.628-.551.614-1.073 1.194-1.547 1.847-.683.968-1.533 2.172-.878 5.238.294 1.366.898 3.104 1.796 5.164 1.307 3 2.895 6.205 4.43 9.304.45.907.9 1.815 1.343 2.718 4.616 9.503 10.615 20.144 16.417 30.435 2.922 5.182 5.681 10.075 8.158 14.637 2.818 5.252 5.98 11.234 8.054 15.772 1.106 2.415 1.985 4.574 2.837 6.662.866 2.124 1.683 4.13 2.723 6.398 2.829 6.14 6.778 12.924 12.071 20.742 4.517 6.686 11.775 16.184 20.99 27.465 7.349 9.014 14.492 17.318 21.842 25.388 7.733 8.509 19.4 20.765 31.06 30.833 4.246 3.663 7.886 6.538 11.048 8.861a161.207 161.207 0 0 0 4.767 2.853c-4.09-2.748-9.126-6.482-15.558-12.032-11.646-10.053-23.3-22.297-31.026-30.798-7.344-8.065-14.483-16.364-21.827-25.372-9.207-11.273-16.458-20.759-20.967-27.437-5.282-7.8-9.22-14.565-12.039-20.682-1.035-2.258-1.851-4.262-2.716-6.381-.852-2.093-1.734-4.256-2.843-6.678-2.08-4.549-5.244-10.537-8.066-15.797-2.48-4.566-5.24-9.462-8.162-14.645-5.798-10.285-11.795-20.92-16.405-30.412-.445-.906-.895-1.813-1.344-2.72-1.533-3.095-3.119-6.295-4.421-9.285-.887-2.036-1.482-3.747-1.77-5.084-.617-2.884.142-3.958.81-4.903.46-.634.974-1.206 1.518-1.812 1.857-2.067 3.963-4.41 4.112-9.9.126-7.626-2.005-20.903-5.177-32.285-1.213-4.213-2.652-8.252-4.043-12.157l-.46-1.295-.465-1.309c-1.316-3.728-2.56-7.25-4.271-10.61-.854-1.684-1.815-3.375-2.742-5.01-2.349-4.137-4.776-8.415-5.69-12.93-.82-3.977-.279-8.358 1.315-10.653.344-.494.73-.891 1.156-1.191h5.939c1.938.613 3.924 1.532 5.875 2.437 1.385.642 2.693 1.25 3.957 1.734 4.29 1.632 7.833 2.512 11.151 2.77.653.05 1.303.112 1.992.18 2.446.236 4.977.48 7.38.13 2.594-.381 4.884-1.96 6.45-4.446.543-.865.979-1.81 1.31-2.805h4.253c-.587 4.753-3.403 9.268-8.083 9.995-1.043.159-2.164.184-3.634.079-.986-.07-1.974-.09-2.93-.109a58.398 58.398 0 0 1-2.82-.102c-3.015-.206-6.163-.93-9.908-2.278-1.701-.612-3.41-1.323-5.062-2.01-1.102-.459-2.241-.933-3.365-1.372l-.11-.043c-2.243-.877-4.784-1.873-7.077-1.562-1.227.153-2.26.824-3.068 1.994-1.256 1.818-1.755 4.47-1.755 7.07 0 1.422.15 2.828.407 4.071.926 4.562 3.305 8.864 5.607 13.024.86 1.555 1.75 3.163 2.547 4.758 1.83 3.642 3.091 7.265 4.552 11.46.15.435.304.874.459 1.32l.484 1.382c1.386 3.95 2.818 8.036 4.035 12.266 3.105 11.15 5.316 24.157 5.373 31.629-.005 5.477-1.86 7.78-3.653 10.008-.606.752-1.177 1.461-1.675 2.285-.742 1.271-1.293 2.567-.517 5.564.901 3.516 3.677 8.887 6.126 13.626.493.955.974 1.885 1.423 2.769 5.003 10.002 11.59 21.288 17.96 32.202 2.824 4.836 5.49 9.404 7.92 13.693 3.201 5.718 6.47 11.64 8.683 16.21 1.287 2.652 2.286 4.98 3.253 7.23.85 1.98 1.653 3.85 2.639 5.933 2.895 6.085 6.85 12.735 12.093 20.331 4.53 6.578 11.576 15.632 20.944 26.913 7.37 8.892 14.534 17.098 21.903 25.09 7.743 8.409 19.413 20.533 31.047 30.531 3.924 3.373 7.351 6.096 10.374 8.35a208.462 208.462 0 0 1-1.4-.927c-1.42-.824-2.99-1.74-4.765-2.852l-.004-.002c-4.44-2.78-10.169-6.784-18.091-13.649-12.314-10.673-24.7-23.961-32.92-33.228a587.64 587.64 0 0 1-21.943-26.182c-8.437-10.648-14.8-19.198-18.912-25.411-5.247-7.911-9.288-15.022-12.01-21.138-1.09-2.46-1.917-4.61-2.792-6.886-.815-2.117-1.656-4.304-2.725-6.755-1.847-4.24-4.546-9.6-7.188-14.762-2.514-4.852-5.36-10.092-8.374-15.64-5.248-9.66-10.675-19.65-14.9-28.629l-1.141-2.39c-1.58-3.304-3.216-6.72-4.567-9.919-.967-2.288-1.576-4.16-1.811-5.56-.437-2.631.338-3.586 1.087-4.508l.058-.072c.443-.532.922-1.018 1.429-1.533 1.995-2.027 4.258-4.323 4.435-10.07.16-7.669-1.79-20.594-4.744-31.433-1.29-4.582-2.87-8.933-4.398-13.142l-.376-1.038c-1.58-4.36-2.944-8.126-4.93-11.858-.784-1.478-1.652-2.965-2.49-4.405-2.347-4.026-4.773-8.19-5.672-12.626-.478-2.313-.544-5.233.108-7.692zm13.767 0h4.223c.314.124.628.246.942.366 4.091 1.557 7.482 2.44 10.67 2.776.612.065 1.25.14 1.869.215 2.51.3 5.106.612 7.586.369 2.555-.254 4.8-1.644 6.402-3.726h4.721c-.315.92-.72 1.793-1.216 2.58-1.5 2.384-3.693 3.897-6.17 4.262-2.357.342-4.863.1-7.287-.134-.66-.064-1.343-.13-1.998-.18-3.281-.255-6.79-1.127-11.042-2.744-1.252-.48-2.555-1.084-3.933-1.724C55.95 1.327 54.349.586 52.763 0zm5.332 0h12.179c1.445.148 2.893.22 4.307.092.237-.021.471-.052.702-.092h8.667c-1.521 1.859-3.59 3.093-5.934 3.325-2.439.24-5.014-.068-7.504-.368-.619-.074-1.258-.151-1.874-.216C65.492 2.409 62.141 1.538 58.095 0zm36.182 0h2.58c.522 7.398-3.54 12.306-7.63 13.169-1.443.298-2.931.268-4.067.21-.968-.052-1.934-.034-2.868-.016-.764.014-1.555.03-2.333.006-3.152-.098-6.46-.791-10.411-2.183-1.665-.587-3.34-1.272-4.959-1.935-.958-.393-1.949-.798-2.925-1.178l-.212-.082c-2.192-.856-4.677-1.824-6.912-1.512-1.192.155-2.193.815-2.977 1.962-1.227 1.796-1.71 4.481-1.71 7.096 0 1.506.16 2.987.43 4.261.955 4.59 3.313 8.935 5.595 13.137.891 1.642 1.813 3.34 2.638 5.03 1.76 3.589 3.031 7.291 4.377 11.21.224.653.451 1.317.685 1.992l.572 1.643c1.297 3.728 2.64 7.584 3.807 11.544 3.93 13.811 5.76 26.543 5.798 32.527-.024 5.068-1.692 7.384-3.303 9.623-.555.77-1.078 1.497-1.53 2.325l-.02.039c-.607 1.147-1.296 2.45-.484 5.553.375 1.426 1.048 3.158 2.055 5.295 1.704 3.617 3.778 7.501 5.784 11.258.405.758.81 1.516 1.211 2.272 5.174 9.817 11.812 20.767 18.231 31.357 2.86 4.718 5.562 9.175 8.044 13.384 6.693 11.338 9.981 18.232 13.462 25.531.593 1.242 1.187 2.49 1.804 3.77 3.304 6.73 7.473 13.515 13.12 21.352 6.308 8.767 15.382 19.684 21.882 27.297 6.802 7.982 13.326 15.303 19.944 22.383 7.796 8.354 19.538 20.408 31.213 30.387 3.932 3.361 7.388 6.1 10.448 8.385 2.22 1.448 4.155 2.62 5.88 3.663-4.282-2.91-9.505-6.783-16.06-12.384-11.658-9.967-23.39-22.008-31.177-30.355-6.614-7.075-13.134-14.392-19.931-22.369-6.495-7.608-15.56-18.515-21.86-27.27-5.633-7.816-9.79-14.58-13.082-21.286-.616-1.278-1.21-2.526-1.803-3.767-3.485-7.309-6.777-14.212-13.48-25.566-2.484-4.212-5.187-8.67-8.047-13.39-6.416-10.584-13.05-21.528-18.218-31.335l-1.212-2.274c-2.004-3.752-4.076-7.632-5.774-11.237-.996-2.114-1.66-3.82-2.027-5.22-.768-2.933-.151-4.101.445-5.23l.02-.035c.437-.803.953-1.519 1.499-2.277 1.576-2.19 3.362-4.671 3.387-9.884-.052-8.627-2.959-22.614-5.815-32.65-1.17-3.974-2.514-7.834-3.814-11.569l-.572-1.642c-.234-.674-.46-1.336-.685-1.99-1.35-3.933-2.625-7.648-4.397-11.262-.83-1.697-1.753-3.4-2.647-5.045-2.266-4.174-4.609-8.49-5.55-13.016-.881-4.151-.383-8.68 1.212-11.013.713-1.043 1.615-1.64 2.687-1.78 2.13-.298 4.562.65 6.707 1.487l.212.083c.972.378 1.962.783 2.918 1.176 1.624.665 3.304 1.352 4.978 1.943 3.992 1.406 7.34 2.107 10.535 2.205.788.024 1.585.009 2.353-.005.927-.017 1.886-.035 2.84.015 1.16.061 2.681.091 4.171-.217C95.015 12.392 97.668 5.706 97.28 0h2.184c.186.883.332 1.786.422 2.716.286 2.947-.233 6.084-1.421 8.606-.92 1.952-2.661 4.45-5.734 5.263-2.334.605-4.874.575-7.332.546-.628-.007-1.22-.014-1.815-.011-3.145.02-6.537-.594-10.37-1.878-1.724-.578-3.458-1.275-5.135-1.948a157.17 157.17 0 0 0-3.095-1.217l-.108-.041c-2.066-.78-4.409-1.665-6.511-1.347-1.154.16-2.123.813-2.88 1.935-1.192 1.769-1.662 4.42-1.662 7.03 0 1.589.175 3.162.465 4.51.963 4.556 3.284 8.891 5.53 13.084.84 1.57 1.71 3.195 2.494 4.805 1.89 3.869 3.195 7.665 4.705 12.063l.455 1.322c.3.868.604 1.741.91 2.62 1.388 3.986 2.823 8.109 4.058 12.33 2.746 9.677 5.64 23.113 5.917 31.313.134 5.265-1.44 7.744-2.962 10.14-.568.894-1.104 1.739-1.544 2.712-.614 1.41-1.044 2.834-.082 5.976.461 1.495 1.228 3.305 2.345 5.533 1.632 3.256 3.518 6.67 5.342 9.97.467.846.935 1.693 1.4 2.542 5.642 10.354 12.946 21.957 20.008 33.177 2.753 4.374 5.353 8.505 7.779 12.443 7.714 12.51 11.387 19.884 15.277 27.692l1.117 2.24c3.395 6.668 7.586 13.322 13.192 20.94 6.218 8.46 15.34 19.22 21.898 26.754 6.839 7.872 13.398 15.104 20.05 22.111 7.824 8.254 19.602 20.171 31.281 30.077 3.942 3.343 7.388 6.069 10.45 8.355-.735-.479-1.5-.988-2.404-1.6l-.009-.007a194.583 194.583 0 0 1-5.877-3.661l-.003-.003c-.377-.246-.763-.5-1.158-.764l.027-.048-.852-.505-.016-.01c-4.162-2.819-9.257-6.602-15.695-12.134-11.617-9.985-23.277-22.097-31.01-30.498-7.365-7.985-14.525-16.186-21.89-25.073-9.36-11.271-16.4-20.316-20.92-26.882-5.23-7.577-9.175-14.209-12.06-20.272-.98-2.076-1.782-3.942-2.631-5.918-.968-2.256-1.97-4.588-3.26-7.25-2.22-4.579-5.491-10.507-8.697-16.232-2.431-4.292-5.099-8.861-7.922-13.699-6.366-10.909-12.95-22.188-17.947-32.178-.45-.887-.932-1.818-1.425-2.773-2.439-4.72-5.202-10.067-6.091-13.536-.795-3.067-.093-4.27.47-5.233.48-.796 1.044-1.495 1.64-2.236 1.755-2.178 3.745-4.649 3.749-10.281-.059-7.508-2.275-20.563-5.391-31.747-1.221-4.244-2.655-8.335-4.043-12.292l-.484-1.382-.46-1.318c-1.464-4.21-2.73-7.845-4.572-11.512-.802-1.603-1.694-3.215-2.557-4.774-2.285-4.132-4.648-8.404-5.562-12.9-.839-4.057-.312-8.5 1.281-10.807.739-1.07 1.675-1.681 2.786-1.82 2.192-.295 4.682.68 6.88 1.539l.11.043c1.12.438 2.257.91 3.357 1.368 1.657.69 3.37 1.403 5.08 2.018 3.781 1.36 6.964 2.09 10.017 2.3.952.065 1.912.085 2.84.103.951.02 1.934.038 2.91.107 1.5.107 2.647.081 3.72-.082 2.673-.416 5.008-2.093 6.575-4.727C93.4 4.032 94.037 2.052 94.277 0zM19.405 295.912c2.503.756 4.89 1.213 7.144 1.359l.003-.054c-2.168-.139-4.46-.568-6.86-1.274-.073-.02-.146-.044-.22-.066-.095-.01-.19-.019-.288-.031l.221.066zm196.83 21.641zm51.072 32.96a555.26 555.26 0 0 1-3.36-2.129 226.09 226.09 0 0 0 3.261 2.296l.1-.167zm-60.361-38.952l-.314-.182.303.202.01-.02zM20.83 296.041l.003-.042c-.447-.028-.902-.07-1.36-.122l.22.066c.38.04.761.075 1.137.098z" fill="#000" fill-rule="nonzero"/>
+</svg> \ No newline at end of file
diff --git a/kartik/views/intro.css b/kartik/views/intro.css
new file mode 100755
index 0000000..bcda35f
--- /dev/null
+++ b/kartik/views/intro.css
@@ -0,0 +1,33 @@
+.hero-inner {
+ position: fixed;
+ inset: 0;
+ background-image: url('./hero.svg');
+ background-position: 100% 50%;
+ background-size: cover;
+ background-repeat: repeat;
+ background-attachment: scroll;
+ z-index: -1;
+}
+
+.hero {
+ color: #fff;
+ background: linear-gradient(-45deg, #64f20c, #5cfbc6, #3149ff, #63f777);
+ background-size: auto;
+ background-size: 400% 400%;
+ animation: Gradient 10s ease infinite;
+ position: fixed;
+ inset: 0;
+ z-index: -2;
+}
+
+@keyframes Gradient {
+ 0% {
+ background-position: 0 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0 50%;
+ }
+} \ No newline at end of file
diff --git a/kartik/views/intro.html b/kartik/views/intro.html
new file mode 100755
index 0000000..45cca2a
--- /dev/null
+++ b/kartik/views/intro.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="intro.css">
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <script src="./script/intro_media.js"></script>
+ <div id="box" style="display:none;position:fixed;inset:0;">
+ </div>
+
+ <script src="./script/intro_global.js"></script>
+ <script>info("LoadWindow", "Launching start-up procedure");</script>
+
+ <script src="./script/client_fullscreen.js"></script>
+ <script>
+ location.href = "menu.html";
+ </script>
+</body>
+</html>
diff --git a/kartik/views/intro.mp4 b/kartik/views/intro.mp4
new file mode 100755
index 0000000..e947f0a
--- /dev/null
+++ b/kartik/views/intro.mp4
Binary files differ
diff --git a/kartik/views/load.html b/kartik/views/load.html
new file mode 100755
index 0000000..473c1ac
--- /dev/null
+++ b/kartik/views/load.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <style>
+
+ * {
+ -webkit-app-region: drag !important;
+ }
+
+ @font-face {
+ font-family: "Milliard SB";
+ src: url("./common/load-version.otf");
+ font-weight: normal;
+ }
+
+ @font-face {
+ font-family: "Milliard";
+ src: url("./common/load-channel.otf");
+ font-weight: normal;
+ }
+
+ @font-face {
+ font-family: "HomepageBaukasten-Bold";
+ src: url("./common/load-new.ttf");
+ }
+
+ </style>
+ <script>
+ document.addEventListener('keydown', function(e) {
+ if (e.key === "F1" || e.key === "F10" || e.key === "F11") { // F11/F1/F10
+ e.preventDefault();
+ return false;
+ }
+ })
+ </script>
+</head>
+<body style="overflow:hidden;margin:0;padding:0;background-color:#4b4e50;">
+ <script>
+ document.write(require('fs').readFileSync("./views/loader.svg").toString().replaceAll("%version%", require('../package.json').version.toUpperCase()));
+
+ var ipcRenderer = require('electron').ipcRenderer;
+ ipcRenderer.on('progress', function (event, progress) {
+ document.getElementById("bar").style.width = progress + "%";
+ });
+ </script>
+ <div id="bar-container">
+ <div id="bar" style="position:fixed;bottom:0;left:0;width:0;background:white;z-index:99999;height:4px;"></div>
+ </div>
+</body>
+</html>
diff --git a/kartik/views/loader.html b/kartik/views/loader.html
new file mode 100755
index 0000000..5251ad6
--- /dev/null
+++ b/kartik/views/loader.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+
+</head>
+<body style="background-color:#064896;margin:0;height:100%;width:100%;background-size:cover;background-position:center;background-image:url('./splash.svg');">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="banner-outer" style="background-size:cover;background-position:center;background-image:url('./splash.svg');display:flex;align-items:center;justify-content:center;inset: 0;height: 100%;background-color:#064896;overflow:hidden;position:fixed;z-index:1;">
+ <div id="banner-contrast" style="z-index:2;position:fixed;background:rgba(0, 0, 0, .5);backdrop-filter:blur(10px);top:calc(50% - 95px);left:0;right:0;height:200px;"></div>
+ <img id="banner" src="../logo/full.png" alt="" style="height:auto;width:380px;z-index:3;">
+ <div id="banner-decoration" style="width: 50px;height: 162px;position: relative;left: -452px;transform: rotate(-45deg);background: #042349;filter: blur(10px);animation-name: deco;animation-duration: 2s;animation-timing-function: linear;animation-iteration-count: infinite;opacity:.5;display:none;z-index:4;"></div>
+ <style>
+ @keyframes deco {
+ 0% { left: -472px; }
+ 100% { left: 1220px; }
+ }
+ </style>
+ </div>
+ <video style="display: none;position:fixed;inset:0;width: 100%;height: 100%;background: #f4f3f4;" id="intro-video">
+ <source src="intro.mp4">
+ </video>
+ <script>
+ document.write(`<div style="position: fixed;bottom: 20px;right: 20px;font-size: 12px;padding: 10px 20px;background: lightblue;border-radius: 5px;transition: all 200ms;display:none;" id="updates">${lang.updates.wait}</div>`);
+ </script>
+ <div id="warning" style="opacity:0;transition:opacity 200ms;position: fixed;background: rgba(139,0,0,0.5);color: white;padding: 20px 10px;max-width: 40vw;text-align: center;border-radius: 10px;left: 20vw;top: 30vh;"><h2><script>document.write(lang.updates.warn[0]);</script></h2><p><script>document.write(lang.updates.warn[1]);</script></p></div>
+
+ <script src="./script/loader_global.js"></script>
+ <script>info("LoadWindow", "Launching start-up procedure");</script>
+
+ <script src="./script/client_fullscreen.js"></script>
+</body>
+</html>
diff --git a/kartik/views/menu.css b/kartik/views/menu.css
new file mode 100755
index 0000000..f9697a7
--- /dev/null
+++ b/kartik/views/menu.css
@@ -0,0 +1,248 @@
+.services li .item {
+ padding: 4px;
+ font-size: 20px;
+ width: 300px;
+ border-color: transparent;
+ margin-right: auto !important;
+ display: block;
+ text-align: left;
+ border-left-width: 3px;
+ border-left-style: solid;
+ border-color: transparent;
+}
+
+.services {
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ top: 150px;
+ padding-top: 50px;
+}
+
+.services li {
+ color: transparent;
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+.services li .item a {
+ color: white !important;
+ text-decoration: none;
+ transition: color 200ms;
+}
+
+.services li.selected .item a {
+ text-decoration: none;
+}
+
+.services:not(.services-settings) li.selected .item {
+ background-color: rgba(0, 255, 153, 0.25);
+ backdrop-filter: blur(10px);
+ border-radius: 10px;
+ animation-direction: alternate-reverse;
+ position: relative;
+ z-index: 9999999999;
+ animation-duration: 3s;
+ animation-name: border-overlay;
+ animation-fill-mode: both;
+ animation-iteration-count: infinite;
+}
+
+.services.services-settings li.selected .item {
+ border-color: #00ff99;
+ background-color: rgba(0, 255, 153, 0.25);
+ animation-direction: alternate-reverse;
+ animation-duration: 3s;
+ animation-name: border-overlay2;
+ animation-fill-mode: both;
+ animation-iteration-count: infinite;
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+}
+
+@keyframes border-overlay {
+ 0% {
+ background-color: rgba(0, 255, 102, 0.25);
+ }
+ 100% {
+ background-color: rgba(0, 204, 255, 0.25);
+ }
+}
+
+@keyframes border-overlay2 {
+ 0% {
+ border-color: #00ff66;
+ background-color: rgba(0, 255, 102, 0.25);
+ }
+ 100% {
+ border-color: #00ccff;
+ background-color: rgba(0, 204, 255, 0.25);
+ }
+}
+
+.services li .item {
+ margin-left: 12.5px;
+ transition: margin-left 200ms, background-color 200ms, border 200ms;
+}
+
+.services li .help {
+ color: white;
+ margin-left: 5px;
+ display: inline-block;
+ font-size: 12px;
+ position: relative;
+ top: -2.5px;
+ opacity: 0;
+ transition: opacity 200ms;
+}
+
+.services li .help.exit {
+ color: #ff6969;
+}
+
+.services li.selected .help {
+ opacity: 1;
+}
+
+#copyright {
+ color: rgba(255, 255, 255, .5);
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ text-align: right;
+ font-size: 12px;
+}
+
+.setting-status {
+ float: right;
+}
+
+#notice {
+ color: white;
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ width: 180px;
+ text-align: right;
+ font-size: 14px;
+}
+
+#scroll {
+ display: block;
+ text-align: center;
+ color: white;
+ padding-top: 100vh;
+ padding-bottom: 100vh;
+}
+
+.cred-title {
+ color: yellow;
+}
+
+.cred-content {
+ color: white;
+}
+
+.technical {
+ color: cyan;
+}
+
+.item-icon {
+ filter: invert(1);
+ vertical-align: middle;
+ display: inline-block;
+ margin-top: 3px;
+ margin-bottom: -1px;
+}
+
+div.services.home {
+ top: 115px;
+ padding: 0;
+ display: flex;
+ align-items: center;
+ bottom: 70px;
+ z-index: 9999;
+}
+
+div.services.home > div.items > ul > li > span.item {
+ width: 216px;
+ border-radius: 0;
+}
+
+div.services.home > div.items > ul > li > span.item > a {
+ margin-left: 10px;
+ margin-right: 10px;
+ width: 100%;
+ display: inline-block;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+div.services.home > div.items {
+ width: 256px;
+}
+
+div.services.home > div.items > ul {
+ padding: 0;
+}
+
+div.services.home > div.items > ul > li {
+ list-style: none;
+}
+
+div.services.home > div.items > ul > li > span.item {
+ margin-left: 10vw;
+ transition: none;
+}
+
+img[alt="full-logo"] {
+ margin-left: calc(10vw + 37.5px) !important;
+ margin-top: 55px !important;
+ height: 56px !important;
+ z-index: 99999;
+ position: fixed;
+}
+
+span#copyright {
+ bottom: 46px;
+ left: 10vw;
+ z-index: 9999;
+ color: rgba(255, 255, 255, 0.75);
+ right: unset;
+ width: 227px;
+ text-align: center;
+}
+
+#services-background {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ width: 227px;
+ z-index: 9;
+ backdrop-filter: blur(10px);
+ background: rgba(0, 0, 0, 0.5);
+ left: 10vw;
+}
+
+.item-text {
+ vertical-align: middle;
+ margin-top: 8px;
+ display: inline-block;
+}
+
+@media (max-height: 600px) {
+ img[alt="full-logo"][src="../logo/full.png"].full-logo {
+ margin-top: 16px !important;
+ }
+
+ span#copyright.copyright {
+ bottom: 14px !important;
+ }
+}
+
+body {
+ height: calc(100vh / 1.2);
+ overflow: hidden;
+} \ No newline at end of file
diff --git a/kartik/views/menu.html b/kartik/views/menu.html
new file mode 100755
index 0000000..c5874bf
--- /dev/null
+++ b/kartik/views/menu.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="menu.css">
+ <title>Kartik</title>
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="./script/menu_login.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script src="./rain/snow.js"></script>
+ <script>
+ snowStorm.flakesMaxActive = 80;
+ snowStorm.followMouse = false;
+ snowStorm.snowStick = false;
+
+ scenar("intro", "neutral");
+
+ </script>
+</head>
+<body class="back-row-toggle splat-toggle">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#9abecd;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div id="loggingIn" style="position: fixed;color: white;background: rgba(0, 0, 0, .5);z-index: 999999999999;top: 0;left: 0;right: 0;bottom: 0;display: none;align-items: center;justify-content: center;backdrop-filter: blur(10px);"><script>document.write(lang.polymer.logging);</script></div>
+
+ <div class="rain front-row"></div>
+ <div class="rain back-row"></div>
+
+ <div style="width: 100%;height: 100%;opacity:.5;background-image: url('./menu.jpg');background-size: cover;position: fixed;z-index: -1;"></div>
+ <img alt="full-logo" class="full-logo" src="../logo/full.png" style="margin-left: 50px;margin-top: 30px;height: 96px;">
+ <div id="services-background"></div>
+
+ <div class="services home">
+ <div class="items">
+ <ul>
+ <li class="selected"><span class="item"><a href="#" id="single"><img class="item-icon" src="../icons/singleplayer.svg"> <span class="item-text"><script>document.write(lang.menu.titles[0])</script></span></a></span></li>
+ <script id="prefill">
+ document.write(`<li><span class="item"><a href="#" id="play"><img class="item-icon" src="../icons/local.svg"> <span class="item-text">${lang.online.menu.local}</span></a></span></li>`)
+ // document.write(`<li><span class="item"><a href="#" id="online"><img class="item-icon" src="../icons/online.svg"> <span class="item-text">${lang.online.menu.online}</span></a></span></li>`);
+ document.write(`<li><span class="item"><a href="#" id="settings"><img class="item-icon" src="../icons/settings.svg"> <span class="item-text">${lang.menu.titles[2]}</span></a></span></li>`);
+ document.getElementById('prefill').outerHTML = "";
+ </script>
+<!-- <li><span class="item"><a href="#" id="stats"><img class="item-icon" src="../icons/stats.svg"> <span class="item-text"><script>document.write(lang.stats.menu)</script></span></a></span></li>-->
+ <li><span class="item"><a href="#" id="quit"><img class="item-icon" src="../icons/exit.svg"> <span class="item-text"><script>document.write(lang.menu.titles[4])</script></span></a></span></li>
+ </ul>
+ </div>
+ </div>
+
+ <div style="display:none;position: fixed;right: 16px;top: 79px;color: white;background: rgba(0, 0, 0, .5);font-size: 10px;text-align:left;z-index:999999999;padding: 10px;border-radius: 10px;width: 189px;" id="gpuinfo">
+ <span style="text-align:center;display:block;font-weight: bold;margin-bottom: 5px;"><script>document.write(lang.polymer.gpu);</script></span>
+ <div style="margin-bottom: 10px;height: 16px;width: 100%;background: rgba(47, 47, 47, .5);border-radius: 999px;">
+ <div style="height: 16px;background: rgba(128, 0, 0, .5);border-radius: 999px;width: 0;" id="gpuinfo_progressbar"></div>
+ </div>
+ <span id="gpusupportperc" style="display: block;text-align: center;">0%</span>
+ <div id="gpuinfo-model" style="opacity: .25;padding-top: 5px;text-align: center;">-</div>
+ <div id="gpuinfo-vram" style="opacity: .25;padding-top: 5px;text-align: center;">- VRAM</div>
+ <span id="gpuinfo-details" style="border-top:1px solid rgba(255, 255, 255, .25);">
+ <div id="gpuinfo-outer" style="opacity: .25;padding-top: 5px;text-align: center;">↓ <script>document.write(lang.polymer.gpuShift);</script></div>
+ <div id="gpuinfo-inner" style="font-family:monospace;opacity:0;height:0;">
+ <script src="./script/menu_gpuinfo.js"></script>
+ </div>
+ </span>
+ <script>
+ document.getElementById('gpuinfo-outer').style.display = "none";
+ document.getElementById('gpuinfo-inner').style.display = "none";
+ document.getElementById('gpuinfo-details').style.display = "none";
+ </script>
+ </div>
+
+ <div style="display:none;position: fixed;right: 16px;top: 16px;height:28px;color: white;backdrop-filter:blur(10px);background: rgba(0, 0, 0, .5);font-size: 10px;z-index:999999999;padding: 10px;border-radius: 10px;width: 189px;text-align:center;" id="loginIntro-outer">
+ <span id="loginIntro" style="padding-top: 10px;display: inline-block;"><script>document.write(lang.polymer.loginIntro);</script></span>
+ </div>
+
+ <div style="position: fixed;right: 16px;top: 16px;color: white;font-size: 10px;z-index:999999999;padding-left: 10px;border-radius: 10px;width: 199px;text-align:center;display: none;backdrop-filter: blur(10px);grid-template-columns: 1fr 48px;" id="loginUser"><div style="
+ text-align: left;
+ padding-top: 5px;
+ padding-left: 5px;
+ font-size: 14px;
+"><b id="kto-username">Username</b><br><span><script>document.write(lang.polymer.ktoLevel)</script> <span id="kto-level">0</span></span><br><span style="font-size: 10px;"><script>document.write(lang.polymer.logout)</script></span></div><img style="
+ border-bottom-right-radius: 10px;
+ height: 48px;
+ background: rgba(0, 0, 0, .25);
+ display: inline-block;
+ width: 48px;
+ border: none;
+ border-top-right-radius: 10px;
+ outline: none;
+" alt=" " id="kto-picture">
+ </div>
+
+ <span id="copyright" class="copyright">© <script src="./script/menu_copyright.js"></script></span>
+ </div>
+
+ <script src="./script/menu_music.js"></script>
+</body>
+<script src="./script/menu_global.js"></script>
+<script src="./script/client_fullscreen.js"></script>
+</html>
diff --git a/kartik/views/menu.jpg b/kartik/views/menu.jpg
new file mode 100755
index 0000000..ade8fdd
--- /dev/null
+++ b/kartik/views/menu.jpg
Binary files differ
diff --git a/kartik/views/online.html b/kartik/views/online.html
new file mode 100755
index 0000000..b9553bf
--- /dev/null
+++ b/kartik/views/online.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+
+ <script src="./script/online_play.js"></script>
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;color:white;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;">
+ <div style="text-align: center;">
+ <p style="font-size:10px;" id="progress"><script>document.write(lang.online.disconnected)</script></p>
+ <p style="font-size:15px;"><script>document.write(atob(location.hash.substr(1)))</script></p>
+ <p style="font-size:16px;" id="progress2"><script>document.write(lang.win.quit[0])</script></p>
+ </div>
+ </div>
+ </div>
+
+ <script src="./script/win_music.js"></script>
+
+ <script src="./script/win_global.js"></script>
+ <script src="./script/client_fullscreen.js"></script>
+</body>
+</html>
diff --git a/kartik/views/rain/snow.js b/kartik/views/rain/snow.js
new file mode 100755
index 0000000..95b937b
--- /dev/null
+++ b/kartik/views/rain/snow.js
@@ -0,0 +1,666 @@
+/** @license
+ * DHTML Snowstorm! JavaScript-based snow for webinit pages
+ * Making it snow on the internets since 2003. You're welcome.
+ * -----------------------------------------------------------
+ * Version 1.44.20131208 (Previous rev: 1.44.20131125)
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License
+ * http://schillmania.com/projects/snowstorm/license.txt
+ */
+
+/*jslint nomen: true, plusplus: true, sloppy: true, vars: true, white: true */
+/*global window, document, navigator, clearInterval, setInterval */
+
+var snowStorm = (function(window, document) {
+
+ // --- common properties ---
+
+ this.autoStart = true; // Whether the snow should start automatically or not.
+ this.excludeMobile = true; // Snow is likely to be bad news for mobile phones' CPUs (and batteries.) Enable at your own risk.
+ this.flakesMax = 128; // Limit total amount of snow made (falling + sticking)
+ this.flakesMaxActive = 64; // Limit amount of snow falling at once (less = lower CPU use)
+ this.animationInterval = 33; // Theoretical "miliseconds per frame" measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower
+ this.useGPU = true; // Enable transform-based hardware acceleration, reduce CPU load.
+ this.className = null; // CSS class name for further customization on snow elements
+ this.excludeMobile = true; // Snow is likely to be bad news for mobile phones' CPUs (and batteries.) By default, be nice.
+ this.flakeBottom = null; // Integer for Y axis snow limit, 0 or null for "full-screen" snow effect
+ this.followMouse = true; // Snow movement can respond to the user's mouse
+ this.snowColor = '#fff'; // Don't eat (or use?) yellow snow.
+ this.snowCharacter = '&bull;'; // &bull; = bullet, &middot; is square on some systems etc.
+ this.snowStick = true; // Whether or not snow should "stick" at the bottom. When off, will never collect.
+ this.targetElement = null; // element which snow will be appended to (null = document.body) - can be an element ID eg. 'myDiv', or a DOM node reference
+ this.useMeltEffect = true; // When recycling fallen snow (or rarely, when falling), have it "melt" and fade out if browser supports it
+ this.useTwinkleEffect = false; // Allow snow to randomly "flicker" in and out of view while falling
+ this.usePositionFixed = false; // true = snow does not shift vertically when scrolling. May increase CPU load, disabled by default - if enabled, used only where supported
+ this.usePixelPosition = false; // Whether to use pixel values for snow top/left vs. percentages. Auto-enabled if body is position:relative or targetElement is specified.
+
+ // --- less-used bits ---
+
+ this.freezeOnBlur = true; // Only snow when the window is in focus (foreground.) Saves CPU.
+ this.flakeLeftOffset = 0; // Left margin/gutter space on edge of container (eg. browser window.) Bump up these values if seeing horizontal scrollbars.
+ this.flakeRightOffset = 0; // Right margin/gutter space on edge of container
+ this.flakeWidth = 8; // Max pixel width reserved for snow element
+ this.flakeHeight = 8; // Max pixel height reserved for snow element
+ this.vMaxX = 5; // Maximum X velocity range for snow
+ this.vMaxY = 4; // Maximum Y velocity range for snow
+ this.zIndex = 0; // CSS stacking order applied to each snowflake
+
+ // --- "No user-serviceable parts inside" past this point, yadda yadda ---
+
+ var storm = this,
+ features,
+ // UA sniffing and backCompat rendering mode checks for fixed position, etc.
+ isIE = navigator.userAgent.match(/msie/i),
+ isIE6 = navigator.userAgent.match(/msie 6/i),
+ isMobile = navigator.userAgent.match(/mobile|opera m(ob|in)/i),
+ isBackCompatIE = (isIE && document.compatMode === 'BackCompat'),
+ noFixed = (isBackCompatIE || isIE6),
+ screenX = null, screenX2 = null, screenY = null, scrollY = null, docHeight = null, vRndX = null, vRndY = null,
+ windOffset = 1,
+ windMultiplier = 2,
+ flakeTypes = 6,
+ fixedForEverything = false,
+ targetElementIsRelative = false,
+ opacitySupported = (function(){
+ try {
+ document.createElement('div').style.opacity = '0.5';
+ } catch(e) {
+ return false;
+ }
+ return true;
+ }()),
+ didInit = false,
+ docFrag = document.createDocumentFragment();
+
+ features = (function() {
+
+ var getAnimationFrame;
+
+ /**
+ * hat tip: paul irish
+ * http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+ * https://gist.github.com/838785
+ */
+
+ function timeoutShim(callback) {
+ window.setTimeout(callback, 1000/(storm.animationInterval || 20));
+ }
+
+ var _animationFrame = (window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.oRequestAnimationFrame ||
+ window.msRequestAnimationFrame ||
+ timeoutShim);
+
+ // apply to window, avoid "illegal invocation" errors in Chrome
+ getAnimationFrame = _animationFrame ? function() {
+ return _animationFrame.apply(window, arguments);
+ } : null;
+
+ var testDiv;
+
+ testDiv = document.createElement('div');
+
+ function has(prop) {
+
+ // test for feature support
+ var result = testDiv.style[prop];
+ return (result !== undefined ? prop : null);
+
+ }
+
+ // note local scope.
+ var localFeatures = {
+
+ transform: {
+ ie: has('-ms-transform'),
+ moz: has('MozTransform'),
+ opera: has('OTransform'),
+ webkit: has('webkitTransform'),
+ w3: has('transform'),
+ prop: null // the normalized property value
+ },
+
+ getAnimationFrame: getAnimationFrame
+
+ };
+
+ localFeatures.transform.prop = (
+ localFeatures.transform.w3 ||
+ localFeatures.transform.moz ||
+ localFeatures.transform.webkit ||
+ localFeatures.transform.ie ||
+ localFeatures.transform.opera
+ );
+
+ testDiv = null;
+
+ return localFeatures;
+
+ }());
+
+ this.timer = null;
+ this.flakes = [];
+ this.disabled = false;
+ this.active = false;
+ this.meltFrameCount = 20;
+ this.meltFrames = [];
+
+ this.setXY = function(o, x, y) {
+
+ if (!o) {
+ return false;
+ }
+
+ if (storm.usePixelPosition || targetElementIsRelative) {
+
+ o.style.left = (x - storm.flakeWidth) + 'px';
+ o.style.top = (y - storm.flakeHeight) + 'px';
+
+ } else if (noFixed) {
+
+ o.style.right = (100-(x/screenX*100)) + '%';
+ // avoid creating vertical scrollbars
+ o.style.top = (Math.min(y, docHeight-storm.flakeHeight)) + 'px';
+
+ } else {
+
+ if (!storm.flakeBottom) {
+
+ // if not using a fixed bottom coordinate...
+ o.style.right = (100-(x/screenX*100)) + '%';
+ o.style.bottom = (100-(y/screenY*100)) + '%';
+
+ } else {
+
+ // absolute top.
+ o.style.right = (100-(x/screenX*100)) + '%';
+ o.style.top = (Math.min(y, docHeight-storm.flakeHeight)) + 'px';
+
+ }
+
+ }
+
+ };
+
+ this.events = (function() {
+
+ var old = (!window.addEventListener && window.attachEvent), slice = Array.prototype.slice,
+ evt = {
+ add: (old?'attachEvent':'addEventListener'),
+ remove: (old?'detachEvent':'removeEventListener')
+ };
+
+ function getArgs(oArgs) {
+ var args = slice.call(oArgs), len = args.length;
+ if (old) {
+ args[1] = 'on' + args[1]; // prefix
+ if (len > 3) {
+ args.pop(); // no capture
+ }
+ } else if (len === 3) {
+ args.push(false);
+ }
+ return args;
+ }
+
+ function apply(args, sType) {
+ var element = args.shift(),
+ method = [evt[sType]];
+ if (old) {
+ element[method](args[0], args[1]);
+ } else {
+ element[method].apply(element, args);
+ }
+ }
+
+ function addEvent() {
+ apply(getArgs(arguments), 'add');
+ }
+
+ function removeEvent() {
+ apply(getArgs(arguments), 'remove');
+ }
+
+ return {
+ add: addEvent,
+ remove: removeEvent
+ };
+
+ }());
+
+ function rnd(n,min) {
+ if (isNaN(min)) {
+ min = 0;
+ }
+ return (Math.random()*n)+min;
+ }
+
+ function plusMinus(n) {
+ return (parseInt(rnd(2),10)===1?n*-1:n);
+ }
+
+ this.randomizeWind = function() {
+ var i;
+ vRndX = plusMinus(rnd(storm.vMaxX,0.2));
+ vRndY = rnd(storm.vMaxY,0.2);
+ if (this.flakes) {
+ for (i=0; i<this.flakes.length; i++) {
+ if (this.flakes[i].active) {
+ this.flakes[i].setVelocities();
+ }
+ }
+ }
+ };
+
+ this.scrollHandler = function() {
+ var i;
+ // "attach" snowflakes to bottom of window if no absolute bottom value was given
+ scrollY = (storm.flakeBottom ? 0 : parseInt(window.scrollY || document.documentElement.scrollTop || (noFixed ? document.body.scrollTop : 0), 10));
+ if (isNaN(scrollY)) {
+ scrollY = 0; // Netscape 6 scroll fix
+ }
+ if (!fixedForEverything && !storm.flakeBottom && storm.flakes) {
+ for (i=0; i<storm.flakes.length; i++) {
+ if (storm.flakes[i].active === 0) {
+ storm.flakes[i].stick();
+ }
+ }
+ }
+ };
+
+ this.resizeHandler = function() {
+ if (window.innerWidth || window.innerHeight) {
+ screenX = window.innerWidth - 16 - storm.flakeRightOffset;
+ screenY = (storm.flakeBottom || window.innerHeight);
+ } else {
+ screenX = (document.documentElement.clientWidth || document.body.clientWidth || document.body.scrollWidth) - (!isIE ? 8 : 0) - storm.flakeRightOffset;
+ screenY = storm.flakeBottom || document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight;
+ }
+ docHeight = document.body.offsetHeight;
+ screenX2 = parseInt(screenX/2,10);
+ };
+
+ this.resizeHandlerAlt = function() {
+ screenX = storm.targetElement.offsetWidth - storm.flakeRightOffset;
+ screenY = storm.flakeBottom || storm.targetElement.offsetHeight;
+ screenX2 = parseInt(screenX/2,10);
+ docHeight = document.body.offsetHeight;
+ };
+
+ this.freeze = function() {
+ // pause animation
+ if (!storm.disabled) {
+ storm.disabled = 1;
+ } else {
+ return false;
+ }
+ storm.timer = null;
+ };
+
+ this.resume = function() {
+ if (storm.disabled) {
+ storm.disabled = 0;
+ } else {
+ return false;
+ }
+ storm.timerInit();
+ };
+
+ this.toggleSnow = function() {
+ if (!storm.flakes.length) {
+ // first run
+ storm.start();
+ } else {
+ storm.active = !storm.active;
+ if (storm.active) {
+ storm.show();
+ storm.resume();
+ } else {
+ storm.stop();
+ storm.freeze();
+ }
+ }
+ };
+
+ this.stop = function() {
+ var i;
+ this.freeze();
+ for (i=0; i<this.flakes.length; i++) {
+ this.flakes[i].o.style.display = 'none';
+ }
+ storm.events.remove(window,'scroll',storm.scrollHandler);
+ storm.events.remove(window,'resize',storm.resizeHandler);
+ if (storm.freezeOnBlur) {
+ if (isIE) {
+ storm.events.remove(document,'focusout',storm.freeze);
+ storm.events.remove(document,'focusin',storm.resume);
+ } else {
+ storm.events.remove(window,'blur',storm.freeze);
+ storm.events.remove(window,'focus',storm.resume);
+ }
+ }
+ };
+
+ this.show = function() {
+ var i;
+ for (i=0; i<this.flakes.length; i++) {
+ this.flakes[i].o.style.display = 'block';
+ }
+ };
+
+ this.SnowFlake = function(type,x,y) {
+ var s = this;
+ this.type = type;
+ this.x = x||parseInt(rnd(screenX-20),10);
+ this.y = (!isNaN(y)?y:-rnd(screenY)-12);
+ this.vX = null;
+ this.vY = null;
+ this.vAmpTypes = [1,1.2,1.4,1.6,1.8]; // "amplification" for vX/vY (based on flake size/type)
+ this.vAmp = this.vAmpTypes[this.type] || 1;
+ this.melting = false;
+ this.meltFrameCount = storm.meltFrameCount;
+ this.meltFrames = storm.meltFrames;
+ this.meltFrame = 0;
+ this.twinkleFrame = 0;
+ this.active = 1;
+ this.fontSize = (10+(this.type/5)*10);
+ this.o = document.createElement('div');
+ this.o.innerHTML = storm.snowCharacter;
+ if (storm.className) {
+ this.o.setAttribute('class', storm.className);
+ }
+ this.o.style.color = storm.snowColor;
+ this.o.style.position = (fixedForEverything?'fixed':'absolute');
+ if (storm.useGPU && features.transform.prop) {
+ // GPU-accelerated snow.
+ this.o.style[features.transform.prop] = 'translate3d(0px, 0px, 0px)';
+ }
+ this.o.style.width = storm.flakeWidth+'px';
+ this.o.style.height = storm.flakeHeight+'px';
+ this.o.style.fontFamily = 'arial,verdana';
+ this.o.style.cursor = 'default';
+ this.o.style.overflow = 'hidden';
+ this.o.style.fontWeight = 'normal';
+ this.o.style.zIndex = storm.zIndex;
+ docFrag.appendChild(this.o);
+
+ this.refresh = function() {
+ if (isNaN(s.x) || isNaN(s.y)) {
+ // safety check
+ return false;
+ }
+ storm.setXY(s.o, s.x, s.y);
+ };
+
+ this.stick = function() {
+ if (noFixed || (storm.targetElement !== document.documentElement && storm.targetElement !== document.body)) {
+ s.o.style.top = (screenY+scrollY-storm.flakeHeight)+'px';
+ } else if (storm.flakeBottom) {
+ s.o.style.top = storm.flakeBottom+'px';
+ } else {
+ s.o.style.display = 'none';
+ s.o.style.bottom = '0%';
+ s.o.style.position = 'fixed';
+ s.o.style.display = 'block';
+ }
+ };
+
+ this.vCheck = function() {
+ if (s.vX>=0 && s.vX<0.2) {
+ s.vX = 0.2;
+ } else if (s.vX<0 && s.vX>-0.2) {
+ s.vX = -0.2;
+ }
+ if (s.vY>=0 && s.vY<0.2) {
+ s.vY = 0.2;
+ }
+ };
+
+ this.move = function() {
+ var vX = s.vX*windOffset, yDiff;
+ s.x += vX;
+ s.y += (s.vY*s.vAmp);
+ if (s.x >= screenX || screenX-s.x < storm.flakeWidth) { // X-axis scroll check
+ s.x = 0;
+ } else if (vX < 0 && s.x-storm.flakeLeftOffset < -storm.flakeWidth) {
+ s.x = screenX-storm.flakeWidth-1; // flakeWidth;
+ }
+ s.refresh();
+ yDiff = screenY+scrollY-s.y+storm.flakeHeight;
+ if (yDiff<storm.flakeHeight) {
+ s.active = 0;
+ if (storm.snowStick) {
+ s.stick();
+ } else {
+ s.recycle();
+ }
+ } else {
+ if (storm.useMeltEffect && s.active && s.type < 3 && !s.melting && Math.random()>0.998) {
+ // ~1/1000 chance of melting mid-air, with each frame
+ s.melting = true;
+ s.melt();
+ // only incrementally melt one frame
+ // s.melting = false;
+ }
+ if (storm.useTwinkleEffect) {
+ if (s.twinkleFrame < 0) {
+ if (Math.random() > 0.97) {
+ s.twinkleFrame = parseInt(Math.random() * 8, 10);
+ }
+ } else {
+ s.twinkleFrame--;
+ if (!opacitySupported) {
+ s.o.style.visibility = (s.twinkleFrame && s.twinkleFrame % 2 === 0 ? 'hidden' : 'visible');
+ } else {
+ s.o.style.opacity = (s.twinkleFrame && s.twinkleFrame % 2 === 0 ? 0 : 1);
+ }
+ }
+ }
+ }
+ };
+
+ this.animate = function() {
+ // main animation loop
+ // move, check status, die etc.
+ s.move();
+ };
+
+ this.setVelocities = function() {
+ s.vX = vRndX+rnd(storm.vMaxX*0.12,0.1);
+ s.vY = vRndY+rnd(storm.vMaxY*0.12,0.1);
+ };
+
+ this.setOpacity = function(o,opacity) {
+ if (!opacitySupported) {
+ return false;
+ }
+ o.style.opacity = opacity;
+ };
+
+ this.melt = function() {
+ if (!storm.useMeltEffect || !s.melting) {
+ s.recycle();
+ } else {
+ if (s.meltFrame < s.meltFrameCount) {
+ s.setOpacity(s.o,s.meltFrames[s.meltFrame]);
+ s.o.style.fontSize = s.fontSize-(s.fontSize*(s.meltFrame/s.meltFrameCount))+'px';
+ s.o.style.lineHeight = storm.flakeHeight+2+(storm.flakeHeight*0.75*(s.meltFrame/s.meltFrameCount))+'px';
+ s.meltFrame++;
+ } else {
+ s.recycle();
+ }
+ }
+ };
+
+ this.recycle = function() {
+ s.o.style.display = 'none';
+ s.o.style.position = (fixedForEverything?'fixed':'absolute');
+ s.o.style.bottom = 'auto';
+ s.setVelocities();
+ s.vCheck();
+ s.meltFrame = 0;
+ s.melting = false;
+ s.setOpacity(s.o,1);
+ s.o.style.padding = '0px';
+ s.o.style.margin = '0px';
+ s.o.style.fontSize = s.fontSize+'px';
+ s.o.style.lineHeight = (storm.flakeHeight+2)+'px';
+ s.o.style.textAlign = 'center';
+ s.o.style.verticalAlign = 'baseline';
+ s.x = parseInt(rnd(screenX-storm.flakeWidth-20),10);
+ s.y = parseInt(rnd(screenY)*-1,10)-storm.flakeHeight;
+ s.refresh();
+ s.o.style.display = 'block';
+ s.active = 1;
+ };
+
+ this.recycle(); // set up x/y coords etc.
+ this.refresh();
+
+ };
+
+ this.snow = function() {
+ var active = 0, flake = null, i, j;
+ for (i=0, j=storm.flakes.length; i<j; i++) {
+ if (storm.flakes[i].active === 1) {
+ storm.flakes[i].move();
+ active++;
+ }
+ if (storm.flakes[i].melting) {
+ storm.flakes[i].melt();
+ }
+ }
+ if (active<storm.flakesMaxActive) {
+ flake = storm.flakes[parseInt(rnd(storm.flakes.length),10)];
+ if (flake.active === 0) {
+ flake.melting = true;
+ }
+ }
+ if (storm.timer) {
+ features.getAnimationFrame(storm.snow);
+ }
+ };
+
+ this.mouseMove = function(e) {
+ if (!storm.followMouse) {
+ return true;
+ }
+ var x = parseInt(e.clientX,10);
+ if (x<screenX2) {
+ windOffset = -windMultiplier+(x/screenX2*windMultiplier);
+ } else {
+ x -= screenX2;
+ windOffset = (x/screenX2)*windMultiplier;
+ }
+ };
+
+ this.createSnow = function(limit,allowInactive) {
+ var i;
+ for (i=0; i<limit; i++) {
+ storm.flakes[storm.flakes.length] = new storm.SnowFlake(parseInt(rnd(flakeTypes),10));
+ if (allowInactive || i>storm.flakesMaxActive) {
+ storm.flakes[storm.flakes.length-1].active = -1;
+ }
+ }
+ storm.targetElement.appendChild(docFrag);
+ };
+
+ this.timerInit = function() {
+ storm.timer = true;
+ storm.snow();
+ };
+
+ this.init = function() {
+ var i;
+ for (i=0; i<storm.meltFrameCount; i++) {
+ storm.meltFrames.push(1-(i/storm.meltFrameCount));
+ }
+ storm.randomizeWind();
+ storm.createSnow(storm.flakesMax); // create initial batch
+ storm.events.add(window,'resize',storm.resizeHandler);
+ storm.events.add(window,'scroll',storm.scrollHandler);
+ if (storm.freezeOnBlur) {
+ if (isIE) {
+ storm.events.add(document,'focusout',storm.freeze);
+ storm.events.add(document,'focusin',storm.resume);
+ } else {
+ storm.events.add(window,'blur',storm.freeze);
+ storm.events.add(window,'focus',storm.resume);
+ }
+ }
+ storm.resizeHandler();
+ storm.scrollHandler();
+ if (storm.followMouse) {
+ storm.events.add(isIE?document:window,'mousemove',storm.mouseMove);
+ }
+ storm.animationInterval = Math.max(20,storm.animationInterval);
+ storm.timerInit();
+ };
+
+ this.start = function(bFromOnLoad) {
+ if (!didInit) {
+ didInit = true;
+ } else if (bFromOnLoad) {
+ // already loaded and running
+ return true;
+ }
+ if (typeof storm.targetElement === 'string') {
+ var targetID = storm.targetElement;
+ storm.targetElement = document.getElementById(targetID);
+ if (!storm.targetElement) {
+ throw new Error('Snowstorm: Unable to get targetElement "'+targetID+'"');
+ }
+ }
+ if (!storm.targetElement) {
+ storm.targetElement = (document.body || document.documentElement);
+ }
+ if (storm.targetElement !== document.documentElement && storm.targetElement !== document.body) {
+ // re-map handler to get element instead of screen dimensions
+ storm.resizeHandler = storm.resizeHandlerAlt;
+ //and force-enable pixel positioning
+ storm.usePixelPosition = true;
+ }
+ storm.resizeHandler(); // get bounding box elements
+ storm.usePositionFixed = (storm.usePositionFixed && !noFixed && !storm.flakeBottom); // whether or not position:fixed is to be used
+ if (window.getComputedStyle) {
+ // attempt to determine if body or user-specified snow parent element is relatlively-positioned.
+ try {
+ targetElementIsRelative = (window.getComputedStyle(storm.targetElement, null).getPropertyValue('position') === 'relative');
+ } catch(e) {
+ // oh well
+ targetElementIsRelative = false;
+ }
+ }
+ fixedForEverything = storm.usePositionFixed;
+ if (screenX && screenY && !storm.disabled) {
+ storm.init();
+ storm.active = true;
+ }
+ };
+
+ function doDelayedStart() {
+ window.setTimeout(function() {
+ storm.start(true);
+ }, 20);
+ // event cleanup
+ storm.events.remove(isIE?document:window,'mousemove',doDelayedStart);
+ }
+
+ function doStart() {
+ if (!storm.excludeMobile || !isMobile) {
+ doDelayedStart();
+ }
+ // event cleanup
+ storm.events.remove(window, 'load', doStart);
+ }
+
+ // hooks for starting the snow
+ if (storm.autoStart) {
+ storm.events.add(window, 'load', doStart, false);
+ }
+
+ return this;
+
+}(window, document)); \ No newline at end of file
diff --git a/kartik/views/script/client_fullscreen.js b/kartik/views/script/client_fullscreen.js
new file mode 100755
index 0000000..80d745c
--- /dev/null
+++ b/kartik/views/script/client_fullscreen.js
@@ -0,0 +1,9 @@
+document.addEventListener('keydown', function(e) {
+ if (e.key === "F1" || e.key === "F10" || e.key === "F11") { // F11/F1/F10
+ if (!require('@electron/remote').getCurrentWindow().fullScreen && require('@electron/remote').getCurrentWindow().fullScreenable) {
+ require('@electron/remote').getCurrentWindow().setFullScreen(true);
+ } else {
+ require('@electron/remote').getCurrentWindow().setFullScreen(false);
+ }
+ }
+}) \ No newline at end of file
diff --git a/kartik/views/script/core_chart.js b/kartik/views/script/core_chart.js
new file mode 100755
index 0000000..2f8a521
--- /dev/null
+++ b/kartik/views/script/core_chart.js
@@ -0,0 +1,74 @@
+setInterval(() => {
+ try {
+ currentMemory = process.memoryUsage().rss;
+ currentMemoryMib = (((currentMemory)/1024)/1024).toFixed(2);
+ if ((((currentMemory)/1024)/1024) > ((require('os').totalmem() / 1000000) / 4)) {
+ throw new Error("Out of memory");
+ }
+
+ file = webview.getURL().split("/")[webview.getURL().split("/").length - 1];
+ activity = lang.discord.game[0];
+ enableActivity = false;
+ eaid = "";
+
+ switch (file) {
+ case "game.html?online":
+ enableActivity = true;
+ activity = lang.online.discord;
+ break;
+ case "game.html?sp":
+ enableActivity = true;
+ activity = lang.discord.game[1];
+ break;
+ case "game.html":
+ enableActivity = true;
+ activity = lang.discord.game[2];
+ break;
+ case "intro.html":
+ enableActivity = true;
+ activity = lang.discord.intro[1];
+ break;
+ case "settings.html":
+ case "stats.html":
+ enableActivity = true;
+ activity = lang.discord.settings[1];
+ break;
+ case "credits.html":
+ enableActivity = true;
+ activity = lang.discord.credits[1];
+ break;
+ case "online.html":
+ enableActivity = true;
+ activity = lang.online.discord2;
+ break;
+ case "menu.html":
+ case "win.html":
+ enableActivity = true;
+ activity = lang.discord.credits[0];
+ break;
+ case "loader.html":
+ enableActivity = false;
+ break;
+ }
+
+ if (file.includes("online.html")) {
+ activity = lang.online.discord2;
+ }
+
+ if (enableActivity) {
+ eaid = " - " + activity;
+ } else {
+ eaid = "";
+ }
+
+ if (require('./package.json').channel === "git") {
+ document.title="Kartik Trunk " +require('./package.json').version;
+ } else {
+ document.title="Kartik"+require('@electron/remote').getCurrentWindow().channel+require('./package.json').version + eaid;
+ }
+ } catch (e) {
+ if (e.message === "Out of memory") {
+ throw e;
+ }
+ }
+}, 1000) \ No newline at end of file
diff --git a/kartik/views/script/core_compatlayer.js b/kartik/views/script/core_compatlayer.js
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/kartik/views/script/core_compatlayer.js
diff --git a/kartik/views/script/core_crash.js b/kartik/views/script/core_crash.js
new file mode 100755
index 0000000..cc68b18
--- /dev/null
+++ b/kartik/views/script/core_crash.js
@@ -0,0 +1,15 @@
+global.gameCrashed = false;
+crashSound = new Audio("./sfx/gamecrash.wav");
+
+function destroy() {
+ global.gameCrashed = true;
+ crashSound.play();
+ document.getElementById("wb").outerHTML = "";
+ try { musicElement.pause(); } catch (e) {}
+}
+
+function spawnError(crashReport) {
+ document.getElementById("error-outer").style.display = "flex";
+ document.getElementById("crash-dump").value = crashReport;
+ destroy();
+} \ No newline at end of file
diff --git a/kartik/views/script/core_fullscreen.js b/kartik/views/script/core_fullscreen.js
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/kartik/views/script/core_fullscreen.js
diff --git a/kartik/views/script/core_head.js b/kartik/views/script/core_head.js
new file mode 100755
index 0000000..be27c87
--- /dev/null
+++ b/kartik/views/script/core_head.js
@@ -0,0 +1,31 @@
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = './webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+
+if (native && require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="' + atob("Li92aWV3cy9jb21tb24vZGVidWcuY3Nz") + '">');
+}
+
+if (native) {
+ var ipcRenderer = require('electron').ipcRenderer;
+ ipcRenderer.on('scenario', function (event,obj) {
+ try {
+ console.log(kresources.scenario.voice[obj.lang] + "/" + obj.namespace + obj.id + ".mp3");
+ a = new Audio(kresources.scenario.voice[obj.lang] + "/" + obj.namespace + obj.id + ".mp3");
+ a.onended = () => {
+ setTimeout(() => {
+ $("#message").fadeOut(200);
+ if (typeof obj.cb == "function") {
+ obj.cb();
+ }
+ }, 3000)
+ }
+ a.play();
+ } catch (e) {
+ console.error(e);
+ obj.cb();
+ }
+
+ document.getElementById('message-text').innerText = obj.message;
+ document.getElementById('message-character-inner').src = kresources.scenario.averi[obj.emote];
+ $("#message").fadeIn(200);
+ });
+}
diff --git a/kartik/views/script/core_music.js b/kartik/views/script/core_music.js
new file mode 100755
index 0000000..b35f5db
--- /dev/null
+++ b/kartik/views/script/core_music.js
@@ -0,0 +1,35 @@
+if (location.hash === "#ready") {
+ global.musicElement = new Audio();
+
+ global.musicManager = {
+ setMusic: (args) => {
+ musicElement.src = args;
+ musicElement.play();
+ musicElement.volume = 1;
+ musicElement.loop = true;
+ },
+ fadeMusic: () => {
+ if (!musicElement.paused) {
+ csi1 = setInterval(() => {
+ if (musicElement.volume <= 0.3) {
+ clearInterval(csi1);
+ return;
+ }
+ musicElement.volume = musicElement.volume - 0.05;
+ }, 100)
+ }
+ },
+ unfadeMusic: () => {
+ if (!musicElement.paused) {
+ csi1 = setInterval(() => {
+ if (musicElement.volume >= 0.95) {
+ clearInterval(csi1);
+ return;
+ }
+ musicElement.volume = musicElement.volume + 0.05;
+ }, 100)
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/kartik/views/script/core_notification.js b/kartik/views/script/core_notification.js
new file mode 100755
index 0000000..e720006
--- /dev/null
+++ b/kartik/views/script/core_notification.js
@@ -0,0 +1,12 @@
+global.notification = (data) => {
+ document.getElementById("notification-title").innerText = data.title;
+ document.getElementById("notification-message").innerText = data.message;
+ document.getElementById("notification").style.right = "20px";
+ document.getElementById("notification").style.opacity = "1";
+ new Audio("./sfx/notification.mp3").play();
+
+ setTimeout(() => {
+ document.getElementById("notification").style.right = "-300px";
+ document.getElementById("notification").style.opacity = "0";
+ }, 5000)
+}; \ No newline at end of file
diff --git a/kartik/views/script/core_viewer.js b/kartik/views/script/core_viewer.js
new file mode 100755
index 0000000..a538b99
--- /dev/null
+++ b/kartik/views/script/core_viewer.js
@@ -0,0 +1,33 @@
+const webview = document.getElementById('wb');
+
+try {
+ webview.addEventListener('dom-ready', () => {
+ setTimeout(() => {
+ document.getElementById('dummyloader').style.display = "none";
+ }, 5000)
+ require('@electron/remote').getCurrentWindow().log(" * " + webview.getURL());
+ require('@electron/remote').getCurrentWindow().focus();
+ if (location.hash === "#ready") {
+ require('@electron/remote').webContents.fromId(webview.getWebContentsId()).send("ready", true);
+ }
+ webview.focus();
+ try {
+ if (require('@electron/remote').getCurrentWindow().debug) {
+ info("MainWindow", "Opening debugging tools...");
+ webview.openDevTools();
+ }
+ } catch (e) {}
+ })
+
+ webview.addEventListener('dom-ready', () => {
+ setInterval(() => {
+ try {
+ if (webview.isCrashed() && !gameCrashed) {
+ require('@electron/remote').getCurrentWindow().log(" * Compositing engine crashed!");
+ error("MainWindow", "Subcontainer crashed");
+ crash(new Error("Webview crashed"));
+ }
+ } catch (e) {}
+ }, 2000)
+ })
+} catch (e) {} \ No newline at end of file
diff --git a/kartik/views/script/credits_global.js b/kartik/views/script/credits_global.js
new file mode 100755
index 0000000..393293d
--- /dev/null
+++ b/kartik/views/script/credits_global.js
@@ -0,0 +1,54 @@
+let menuOpen = true;
+
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+
+keysEnabled = true;
+$(document).keydown(function(e) {
+ if (keysEnabled) {
+ if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32 || e.keyCode === 27 || e.keyCode === 8 || e.keyCode === 16) { // enter/esc
+ keysEnabled = false;
+ Sound.click();
+ window.parent.musicManager.fadeMusic();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("GWinWindow", "Switching control to MenuWindow");
+ location.href = "menu.html";
+ }, 1000)
+ }
+ }
+})
+
+var currentpos=0,alt=1,curpos1=0,curpos2=-1
+function initialize(){
+ $("#box").fadeIn(500);
+ startit()
+}
+function scrollwindow(){
+ if (document.all)
+ temp=document.body.scrollTop
+ else
+ temp=window.pageYOffset
+ if (alt===0)
+ alt=1
+ else
+ alt=0
+ if (alt===0)
+ curpos1=temp
+ else
+ curpos2=temp
+ if (curpos1!==curpos2){
+ if (document.all)
+ currentpos=document.body.scrollTop+1
+ else
+ currentpos=window.pageYOffset+1
+ window.scroll(0,currentpos)
+ }
+ else{
+ currentpos=0
+ window.scroll(0,currentpos)
+ }
+}
+function startit(){
+ setInterval("scrollwindow()",20)
+}
+window.onload=initialize
diff --git a/kartik/views/script/credits_libs.js b/kartik/views/script/credits_libs.js
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/kartik/views/script/credits_libs.js
diff --git a/kartik/views/script/credits_music.js b/kartik/views/script/credits_music.js
new file mode 100755
index 0000000..7d2f69c
--- /dev/null
+++ b/kartik/views/script/credits_music.js
@@ -0,0 +1,2 @@
+info("MusicMgr", "Playing settings.mp3");
+window.parent.musicManager.setMusic(kresources.music['credits'].file); \ No newline at end of file
diff --git a/kartik/views/script/credits_technical.js b/kartik/views/script/credits_technical.js
new file mode 100755
index 0000000..fda1998
--- /dev/null
+++ b/kartik/views/script/credits_technical.js
@@ -0,0 +1,12 @@
+document.write("Kartik: A New Start");
+document.write(" on " + navigator.userAgent + "<br>")
+if (navigator.hardwareConcurrency > 1 || navigator.hardwareConcurrency === 0) {
+ document.write(navigator.hardwareConcurrency + " processors, ");
+} else {
+ document.write(navigator.hardwareConcurrency + " processor, ");
+}
+if (navigator.maxTouchPoints > 1 || navigator.maxTouchPoints === 0) {
+ document.write(navigator.maxTouchPoints + " touch points<br>");
+} else {
+ document.write(navigator.maxTouchPoints + " touch point<br>");
+} \ No newline at end of file
diff --git a/kartik/views/script/game_debug.js b/kartik/views/script/game_debug.js
new file mode 100755
index 0000000..9d311b3
--- /dev/null
+++ b/kartik/views/script/game_debug.js
@@ -0,0 +1,138 @@
+global.debugshow = false;
+
+function oil(id) {
+ return "\nO" + id +": " + document.getElementById('oil' + id + '').style.left.split("px")[0] + " " + document.getElementById('oil' + id + '').style.top.split("px")[0] + " / " + document.getElementById('oil' + id + '').style.transform.split("rotate(")[1].split("deg)")[0];
+}
+
+$(document).keydown((e) => {
+ if (e.keyCode === 114) { // F3
+ if (debugshow) {
+ global.debugshow = false;
+ document.getElementById("debug").style.display = "none";
+ } else {
+ global.debugshow = true;
+ document.getElementById("debug").style.display = "";
+ }
+ }
+})
+
+gpuperct = 100;
+
+pubver = "prod";
+pvpart = pubver.split(".");
+if (pvpart.length === 3) {
+ intver = pvpart[0] + "." + pvpart[1];
+} else {
+ intver = "unknown";
+}
+
+release = "official";
+
+if (gpuperct < 25) {
+ perf = "fast";
+} else if (gpuperct < 50) {
+ perf = "fancy";
+} else {
+ perf = "fabulous";
+}
+
+if (location.search === "") {
+ game = "Local multiplayer game";
+} else if (location.search === "?sp") {
+ game = "Singleplayer game";
+} else if (location.search === "?online") {
+ game = "Online multiplayer game";
+}
+
+tps = -1;
+cping = -1;
+changedDataLeft = "playing: %false%"
+changedDataRight = ""
+immutableDataLeft = "Kartik " + pubver + " (" + intver + "/trunk+" + release + ")\n%tps% tps T:" + perf + ";vsync\n" + game + " @ %ping% ms ticks";
+immutableDataRight = "Browser: " + navigator.userAgent;
+
+credits = "Debug: start runtime with debug argument\nFor help: https://arcade.minteck.org/kartik"
+
+setInterval(() => {
+ if (!debugshow) { return; }
+
+
+ leftparts = (immutableDataLeft + "\n" + changedDataLeft + "\n\n" + credits).split("\n");
+ lefttext = "<span style='background:rgba(101,101,101,0.75);font-family: &apos;Source Code Pro&apos;, &apos;JetBrains Mono&apos;, &apos;Ubuntu Mono&apos;, &apos;Consolas&apos;, &apos;Lucida Console&apos;, &apos;Courier New&apos;, monospace;padding:1px;'>" + leftparts.join("</span><br><span style='background:rgba(101,101,101,0.75);font-family: &apos;Source Code Pro&apos;, &apos;JetBrains Mono&apos;, &apos;Ubuntu Mono&apos;, &apos;Consolas&apos;, &apos;Lucida Console&apos;, &apos;Courier New&apos;, monospace;padding:1px;'>") + "</span>";
+
+ rightparts = (immutableDataRight + "\n" + changedDataRight).split("\n");
+ righttext = "<span style='background:rgba(101,101,101,0.75);font-family: &apos;Source Code Pro&apos;, &apos;JetBrains Mono&apos;, &apos;Ubuntu Mono&apos;, &apos;Consolas&apos;, &apos;Lucida Console&apos;, &apos;Courier New&apos;, monospace;padding:1px;'>" + rightparts.join("</span><br><span style='background:rgba(101,101,101,0.75);font-family: &apos;Source Code Pro&apos;, &apos;JetBrains Mono&apos;, &apos;Ubuntu Mono&apos;, &apos;Consolas&apos;, &apos;Lucida Console&apos;, &apos;Courier New&apos;, monospace;padding:1px;'>") + "</span>";
+
+ document.getElementById("debug-left").innerHTML = lefttext.replaceAll("%tps%", tps).replaceAll("%ping%", cping).replaceAll("%false%", "<span style='color:red;font-family: &apos;Source Code Pro&apos;, &apos;JetBrains Mono&apos;, &apos;Ubuntu Mono&apos;, &apos;Consolas&apos;, &apos;Lucida Console&apos;, &apos;Courier New&apos;, monospace;'>false</span>").replaceAll("%true%", "<span style='color:green;font-family: &apos;Source Code Pro&apos;, &apos;JetBrains Mono&apos;, &apos;Ubuntu Mono&apos;, &apos;Consolas&apos;, &apos;Lucida Console&apos;, &apos;Courier New&apos;, monospace;'>true</span>");
+ document.getElementById("debug-right").innerHTML = righttext;
+}, 100)
+
+var filterStrength = 20;
+var frameTime = 0, lastLoop = new Date, thisLoop;
+
+setInterval(() => {
+ if (!debugshow) { return; }
+
+ var thisFrameTime = (thisLoop=new Date) - lastLoop;
+ frameTime+= (thisFrameTime - frameTime) / filterStrength;
+ lastLoop = thisLoop;
+}, 50)
+
+setInterval(() => {
+ if (!debugshow) { return; }
+
+ tps = (1000/frameTime).toFixed(1);
+
+ if (typeof ping === "number") {
+ cping = ping;
+ } else {
+ cping = 0;
+ }
+
+ if (started) {
+ changedDataLeft = "playing: %true%";
+ changedDataLeft += "\n\n0$: XY: " + document.getElementById('car0').style.left.split("px")[0] + " / " + document.getElementById('car0').style.top.split("px")[0]
+
+ c0rotate = document.getElementById('car0').style.transform.split("rotate(")[1].split("deg)")[0];
+ if (c0rotate === "90") {
+ changedDataLeft += "\n0$: Facing: south (Towards negative Y)";
+ } else if (c0rotate === "-90") {
+ changedDataLeft += "\n0$: Facing: north (Towards negative Y)";
+ } else if (c0rotate === "0") {
+ changedDataLeft += "\n0$: Facing: east (Towards positive X)";
+ } else if (c0rotate === "180") {
+ changedDataLeft += "\n0$: Facing: west (Towards negative X)";
+ }
+
+ changedDataLeft += "\n0$: Speed: A: " + car0cspeed.toFixed(2) + " R: " + (car0speed - car0cspeed).toFixed(2) + " M: " + car0speed.toFixed(2);
+
+ changedDataLeft += "\n0$: Laps: " + document.getElementById('laps-car0').innerText + "/5";
+ changedDataLeft += "\n0$: Model: " + selectedModel0;
+ changedDataLeft += "\n0$: Collision: " + (car0collisionon ? "%true%" : "%false%");
+
+ changedDataLeft += "\n\n1$: XY: " + document.getElementById('car1').style.left.split("px")[0] + " / " + document.getElementById('car1').style.top.split("px")[0]
+
+ c0rotate = document.getElementById('car1').style.transform.split("rotate(")[1].split("deg)")[0];
+ if (c0rotate === "90") {
+ changedDataLeft += "\n1$: Facing: south (Towards negative Y)";
+ } else if (c0rotate === "-90") {
+ changedDataLeft += "\n1$: Facing: north (Towards negative Y)";
+ } else if (c0rotate === "0") {
+ changedDataLeft += "\n1$: Facing: east (Towards positive X)";
+ } else if (c0rotate === "180") {
+ changedDataLeft += "\n1$: Facing: west (Towards negative X)";
+ }
+
+ changedDataLeft += "\n1$: Speed: A: " + car1cspeed.toFixed(2) + " R: " + (car1speed - car1cspeed).toFixed(2) + " M: " + car1speed.toFixed(2);
+
+ changedDataLeft += "\n1$: Laps: " + document.getElementById('laps-car1').innerText + "/5";
+ changedDataLeft += "\n1$: Model: " + selectedModel1;
+ changedDataLeft += "\n1$: Collision: " + (car1collisionon ? "%true%" : "%false%");
+ changedDataLeft += "\n" + oil(0) + oil(1) + oil(2) + oil(3) + oil(4);
+ changedDataLeft += "\n\nMusic: " + i;
+ changedDataLeft += "\nCircuit: " + rand;
+
+ } else {
+ changedDataLeft = "playing: %false%"
+ }
+},100); \ No newline at end of file
diff --git a/kartik/views/script/game_global.js b/kartik/views/script/game_global.js
new file mode 100755
index 0000000..4e6de21
--- /dev/null
+++ b/kartik/views/script/game_global.js
@@ -0,0 +1,45 @@
+$("#box").fadeOut(0);
+$("#bg").fadeOut(0);
+setTimeout(() => {
+ $("#box").fadeIn(500);
+ $("#bg").fadeIn(500);
+}, 200)
+
+global.startgame = () => {
+ keysEnabled = true;
+ $("#credits").fadeOut(200)
+ Sound.intro();
+
+ setTimeout(() => {
+ started = true;
+ }, 1700)
+
+ setTimeout(() => {
+ if (location.search === "?sp") {
+ enableAI();
+ }
+ }, 1200)
+}
+
+startHooks.push(() => {
+ global.hitshow = false;
+ global.started = false;
+ keysEnabled = false;
+
+ $("body").focus();
+
+ if (!online) {
+ setTimeout(startgame, 7000)
+ }
+
+ if (online && role === "host") {
+ setTimeout(() => {
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "gameIsReady",
+ message: null
+ }) + "|")
+ startgame();
+ }, 7000)
+ }
+}) \ No newline at end of file
diff --git a/kartik/views/script/game_music.js b/kartik/views/script/game_music.js
new file mode 100755
index 0000000..9739cc3
--- /dev/null
+++ b/kartik/views/script/game_music.js
@@ -0,0 +1,8 @@
+startHooks.push(() => {
+ info("MusicMgr", "Playing game" + i + ".mp3");
+ window.parent.musicManager.setMusic(kresources.music['game' + i].file);
+})
+
+if (location.search === "?online") {
+ window.parent.musicManager.setMusic(kresources.music['prepare'].file);
+}
diff --git a/kartik/views/script/game_online.js b/kartik/views/script/game_online.js
new file mode 100755
index 0000000..e379708
--- /dev/null
+++ b/kartik/views/script/game_online.js
@@ -0,0 +1,9 @@
+if (location.search === "?online") {
+ document.getElementById('online-login').style.display = "";
+ document.write(`<` + `script src="../online/global.js"></` + `script>`);
+} else {
+ startHooks.forEach((hook) => {
+ hook(this);
+ })
+ document.getElementById('ping').style.display = "none";
+} \ No newline at end of file
diff --git a/kartik/views/script/game_select.js b/kartik/views/script/game_select.js
new file mode 100755
index 0000000..a3896d4
--- /dev/null
+++ b/kartik/views/script/game_select.js
@@ -0,0 +1,131 @@
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+
+startHooks.push(() => {
+ function ranint(min, max) { // min and max included
+ return Math.floor(Math.random() * (max - min + 1) + min);
+ }
+
+ circuits = Object.keys(kresources.races);
+ rand = circuits[Math.floor(Math.random()*circuits.length)];
+
+ if (online && role === "host") {
+ setInterval(() => {
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "RaceData:circuit",
+ message: rand
+ }) + "|");
+ }, 100)
+ }
+
+ if (online && role === "guest") {
+ rand = guestInfo.circuit;
+ }
+
+ info("GameWindow", "Selected circuit " + rand);
+ document.getElementById('circuit').style.backgroundImage = "url('." + kresources.races[rand].substr(0, kresources.races[rand].length - 5).split("'").join("\\'") + ".png')";
+ document.getElementById('circuit').innerHTML = $.ajax("/kartik/" + kresources.races[rand], { async: false }).responseText.toString();
+
+ inf = JSON.parse(document.getElementsByTagName("circuit")[0].innerText);
+ if (typeof inf.name[lp] === "undefined") {
+ document.getElementById('race-title').innerText = inf.name.en;
+ } else {
+ document.getElementById('race-title').innerText = inf.name[lp];
+ }
+ document.getElementById('race-author').innerText = inf.author;
+
+ i = ranint(1, 9);
+
+ if (online && role === "host") {
+ setInterval(() => {
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "RaceData:music",
+ message: i
+ }) + "|");
+ }, 200)
+ }
+
+ if (online && role === "guest") {
+ i = guestInfo.music;
+ }
+
+ global.spreadOil = (oil) => {
+ rx = ranint(0, 680);
+ ry = ranint(0, 490);
+ rd = ranint(0, 360);
+ rh = ranint(0, 360);
+
+ oil.style.top = ry + "px";
+ oil.style.left = rx + "px";
+ oil.style.transform = "rotate(" + rd + "deg)";
+ oil.style.filter = "hue-rotate(" + rd + "deg)";
+ }
+
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+
+ modelsAvailable = Object.keys(kresources.cars);
+
+ selectedModel0I = Math.floor(Math.random() * modelsAvailable.length);
+ selectedModel0 = modelsAvailable[selectedModel0I];
+ modelsAvailable.splice(selectedModel0I, 1);
+
+ selectedModel1I = Math.floor(Math.random() * modelsAvailable.length);
+ selectedModel1 = modelsAvailable[selectedModel1I];
+
+ if (online && role === "host") {
+ setInterval(() => {
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "RaceData:hostCar",
+ message: selectedModel0
+ }) + "|");
+ }, 300)
+ setInterval(() => {
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "RaceData:guestCar",
+ message: selectedModel1
+ }) + "|");
+ }, 400)
+ }
+
+ if (online && role === "guest") {
+ selectedModel0 = guestInfo.guestCar;
+ selectedModel1 = guestInfo.hostCar;
+ }
+
+ document.getElementById("car0-img").src = kresources.cars[selectedModel0];
+ document.getElementById("cars-p1-inner").src = kresources.cars[selectedModel0];
+ document.getElementById("car1-img").src = kresources.cars[selectedModel1];
+ document.getElementById("cars-p2-inner").src = kresources.cars[selectedModel1];
+})
+
+startHooks.push(() => {
+ setInterval(() => {
+ if (online) {
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "posTop",
+ message: document.getElementById("car0").style.top
+ }) + "|")
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "posLeft",
+ message: document.getElementById("car0").style.left
+ }) + "|")
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "posRot",
+ message: document.getElementById("car0").style.transform
+ }) + "|")
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "progressLaps",
+ message: document.getElementById("laps-car0").innerText
+ }) + "|")
+ }
+ }, 50)
+})
diff --git a/kartik/views/script/global_compatlayer.js b/kartik/views/script/global_compatlayer.js
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/kartik/views/script/global_compatlayer.js
diff --git a/kartik/views/script/global_levelsapi.js b/kartik/views/script/global_levelsapi.js
new file mode 100755
index 0000000..ebd969d
--- /dev/null
+++ b/kartik/views/script/global_levelsapi.js
@@ -0,0 +1,47 @@
+module.exports = class LevelsAPI {
+
+ associates;
+
+ constructor() {
+
+ let assocs_raw;
+ let assocs_lines;
+ let assocs_base;
+ let assocs;
+ let score;
+ let cline;
+ let line;
+ let clvl;
+
+ assocs_raw = require('fs').readFileSync("./online/levels.txt");
+ assocs_lines = assocs_raw.toString().split("\n");
+ assocs_base = {};
+
+ for (line of assocs_lines) {
+ cline = line.split(":");
+ assocs_base[cline[1].trim()] = cline[0].trim() - 1 + 1;
+ }
+
+ assocs = {};
+
+ clvl = 0;
+ for (let c = 0; c <= 5051; c++) {
+ if (assocs_base[c.toString()] !== undefined) {
+ clvl = assocs_base[c.toString()];
+ }
+ assocs[c.toString()] = clvl.toString()
+ }
+
+ this.associates = assocs;
+
+ }
+
+ correspond(score, god) {
+ if (score <= 5051) {
+ return this.associates[score].toString();
+ } else {
+ return god;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/kartik/views/script/intro_global.js b/kartik/views/script/intro_global.js
new file mode 100755
index 0000000..b6bf033
--- /dev/null
+++ b/kartik/views/script/intro_global.js
@@ -0,0 +1,21 @@
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+$("#box").fadeOut(0);
+window.addEventListener('load', () => {
+ setTimeout(() => {
+ $("#box").fadeIn(500);
+ }, 1000)
+})
+
+keysEnabled = true;
+$(document).keydown(function(e) {
+ if (keysEnabled) {
+ if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32 || e.keyCode === 27 || e.keyCode === 8 || e.keyCode === 16) { // enter/esc
+ kesyEnabled = false;
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("GWinWindow", "Switching control to MenuWindow");
+ location.href = "menu.html?noreset";
+ }, 1000)
+ }
+ }
+}) \ No newline at end of file
diff --git a/kartik/views/script/intro_media.js b/kartik/views/script/intro_media.js
new file mode 100755
index 0000000..a6be835
--- /dev/null
+++ b/kartik/views/script/intro_media.js
@@ -0,0 +1,2 @@
+info("MusicMgr", "Playing title.mp3");
+window.parent.musicManager.setMusic(kresources.music['title'].file); \ No newline at end of file
diff --git a/kartik/views/script/intro_message.js b/kartik/views/script/intro_message.js
new file mode 100755
index 0000000..6ab8d95
--- /dev/null
+++ b/kartik/views/script/intro_message.js
@@ -0,0 +1,7 @@
+setInterval(() => {
+ if (require('@electron/remote').getCurrentWindow().controllerAttached) {
+ document.getElementById('progress').innerText = lang.intro[1];
+ } else {
+ document.getElementById('progress').innerText = lang.intro[0];
+ }
+}, 100) \ No newline at end of file
diff --git a/kartik/views/script/loader_global.js b/kartik/views/script/loader_global.js
new file mode 100755
index 0000000..9844f1e
--- /dev/null
+++ b/kartik/views/script/loader_global.js
@@ -0,0 +1,132 @@
+window.addEventListener("load", () => {
+ document.getElementById("banner-decoration").style.display = "";
+ document.getElementById("banner-outer").style.backgroundImage = "";
+ document.getElementById("banner-outer").style.backgroundColor = "#042349";
+ document.getElementById("banner-contrast").style.display = "none";
+
+ setTimeout(() => {
+ if (native) {
+ setTimeout(() => {
+ setTimeout(() => {
+
+ $("#progress").fadeOut(500);
+ setTimeout(() => {
+ window.fetch("https://kartik.hopto.org/latest.php?v=" + require('@electron/remote').getCurrentWindow().update).then((data) => {
+ data.blob().then((a) => {
+ a.text().then((b) => {
+ if (require('@electron/remote').getCurrentWindow().update === "git") {
+ document.getElementById('updates').style.backgroundColor = "lightsalmon";
+ document.getElementById('updates').innerText = lang.updates.git;
+ } else {
+ console.log(b);
+ console.log(require('../package.json').version);
+ if (b === require('../package.json').version) {
+ document.getElementById('updates').style.backgroundColor = "lightgreen";
+ document.getElementById('updates').innerText = lang.updates.ok;
+ } else {
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.updates.warn[0], message: lang.updates.warn[1]});
+ document.getElementById('updates').style.backgroundColor = "lightyellow";
+ document.getElementById('updates').innerText = lang.updates.available;
+ }
+ }
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 2000)
+ }).catch((e) => {
+ console.warn(e);
+ document.getElementById('updates').style.backgroundColor = "lightcoral";
+ document.getElementById('updates').innerText = lang.updates.error;
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.updateError[0], message: lang.polymer.updateError[1]});
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 2000)
+ });
+ }).catch((e) => {
+ console.warn(e);
+ document.getElementById('updates').style.backgroundColor = "lightcoral";
+ document.getElementById('updates').innerText = lang.updates.error;
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.updateError[0], message: lang.polymer.updateError[1]});
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 2000)
+ });
+ }).catch((e) => {
+ console.warn(e);
+ document.getElementById('updates').style.backgroundColor = "lightcoral";
+ document.getElementById('updates').innerText = lang.updates.error;
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.updateError[0], message: lang.polymer.updateError[1]});
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 2000)
+ });
+ }, 2000)
+ }, 3000)
+ }, 1000)
+ } else {
+
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 5000)
+ }
+ }, 2000)
+}) \ No newline at end of file
diff --git a/kartik/views/script/menu_copyright.js b/kartik/views/script/menu_copyright.js
new file mode 100755
index 0000000..2b38844
--- /dev/null
+++ b/kartik/views/script/menu_copyright.js
@@ -0,0 +1,5 @@
+if (new Date().getFullYear() === 2021) {
+ document.write(new Date().getFullYear() + " Minteck");
+} else {
+ document.write("2021-" + new Date().getFullYear() + " Minteck");
+} \ No newline at end of file
diff --git a/kartik/views/script/menu_global.js b/kartik/views/script/menu_global.js
new file mode 100755
index 0000000..811e525
--- /dev/null
+++ b/kartik/views/script/menu_global.js
@@ -0,0 +1,127 @@
+let menuOpen = true;
+
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+$("#box").fadeOut(0);
+window.addEventListener('load', () => {
+ setTimeout(() => {
+ $("#box").fadeIn(500);
+ }, 1000)
+})
+
+$("body").focus();
+keysEnabled = true;
+$(document).keydown(function(e) {
+ if (loggingIn) { return; }
+
+ if (keysEnabled) {
+ if (e.ctrlKey && e.keyCode === 13) { // ctrl+enter
+ throw new RangeError("Manually initiated crash");
+ }
+ if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32) { // enter
+ if ($(".services").is(":visible")) {
+ selectOption();
+ } else {
+ $(".services").show();
+ }
+ menuOpen = !menuOpen;
+ }
+ if (e.keyCode === 38 || e.keyCode === 90) { // up
+ Sound.menu();
+ var selected = $(".selected");
+ $(".services li").removeClass("selected");
+ if (selected.prev().length === 0) {
+ selected.siblings().last().addClass("selected");
+ } else {
+ selected.prev().addClass("selected");
+ }
+ }
+ if (e.keyCode === 40 || e.keyCode === 83) { // down
+ Sound.menu();
+ var selected = $(".selected");
+ $(".services li").removeClass("selected");
+ if (selected.next().length === 0) {
+ selected.siblings().first().addClass("selected");
+ } else {
+ selected.next().addClass("selected");
+ }
+ }
+ if (e.keyCode === 27 || e.keyCode === 8) { // esc
+ keysEnabled = false;
+ Sound.click();
+ setTimeout(() => {
+ require('@electron/remote').getCurrentWindow().close();
+ }, 250)
+ }
+ }
+});
+
+function selectOption() {
+ item = document.querySelector(".selected a").id;
+ Sound.click();
+
+ switch (item) {
+ case 'single':
+ scenar("start", "happy");
+ keysEnabled = false;
+ window.parent.musicManager.fadeMusic();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to GameWindow");
+ location.href = "game.html?sp";
+ }, 1000)
+ break;
+ case 'online':
+ keysEnabled = false;
+ window.parent.musicManager.fadeMusic();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to GameWindow");
+ location.href = "game.html?online";
+ }, 1000)
+ break;
+ case 'play':
+ keysEnabled = false;
+ window.parent.musicManager.fadeMusic();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to GameWindow");
+ location.href = "game.html";
+ }, 1000)
+ break;
+ case 'settings':
+ keysEnabled = false;
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to OptnWindow");
+ location.href = "settings.html";
+ }, 1000)
+ break;
+ case 'stats':
+ keysEnabled = false;
+ window.parent.musicManager.fadeMusic();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to OptnWindow");
+ location.href = "stats.html";
+ }, 1000)
+ break;
+ case 'credits':
+ keysEnabled = false;
+ window.parent.musicManager.fadeMusic();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to OptnWindow");
+ location.href = "credits.html";
+ }, 1000)
+ break;
+ case 'quit':
+ keysEnabled = false;
+ window.parent.musicManager.fadeMusic();
+ info("MenuWindow", "Quitting game");
+ Sound.click();
+ setTimeout(() => {
+ window.parent.location.href = "/";
+ }, 250)
+ break;
+ }
+} \ No newline at end of file
diff --git a/kartik/views/script/menu_gpuinfo.js b/kartik/views/script/menu_gpuinfo.js
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/kartik/views/script/menu_gpuinfo.js
diff --git a/kartik/views/script/menu_login.js b/kartik/views/script/menu_login.js
new file mode 100755
index 0000000..8e071eb
--- /dev/null
+++ b/kartik/views/script/menu_login.js
@@ -0,0 +1 @@
+global.loggingIn = false;
diff --git a/kartik/views/script/menu_music.js b/kartik/views/script/menu_music.js
new file mode 100755
index 0000000..5d26af0
--- /dev/null
+++ b/kartik/views/script/menu_music.js
@@ -0,0 +1,5 @@
+if (location.search !== "?noreset") {
+ console.log("back");
+ window.parent.musicManager.setMusic(kresources.music['title'].file);
+}
+info("MenuWindow", "Menu opened");
diff --git a/kartik/views/script/menu_system.js b/kartik/views/script/menu_system.js
new file mode 100755
index 0000000..947699f
--- /dev/null
+++ b/kartik/views/script/menu_system.js
@@ -0,0 +1,33 @@
+
+switch (require('os').platform()) {
+ case "win32":
+ document.write("Windows");
+ break
+ case "aix":
+ document.write("AIX");
+ break
+ case "android":
+ document.write("Android");
+ break
+ case "cygwin":
+ document.write("Cygwin");
+ break
+ case "darwin":
+ document.write("macOS");
+ break
+ case "freebsd":
+ document.write("FreeBSD");
+ break
+ case "linux":
+ document.write("GNU/Linux");
+ break
+ case "netbsd":
+ document.write("NetBSD");
+ break
+ case "openbsd":
+ document.write("OpenBSD");
+ break
+ case "sunos":
+ document.write("Solaris");
+ break
+}
diff --git a/kartik/views/script/online_play.js b/kartik/views/script/online_play.js
new file mode 100755
index 0000000..0c1eb91
--- /dev/null
+++ b/kartik/views/script/online_play.js
@@ -0,0 +1,2 @@
+require('@electron/remote').getCurrentWindow().dstate = lang.online.discord2;
+require('@electron/remote').getCurrentWindow().ddetails = lang.online.discord; \ No newline at end of file
diff --git a/kartik/views/script/settings_global.js b/kartik/views/script/settings_global.js
new file mode 100755
index 0000000..64c9b64
--- /dev/null
+++ b/kartik/views/script/settings_global.js
@@ -0,0 +1,104 @@
+let menuOpen = true;
+
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+$("#box").fadeOut(0);
+setTimeout(() => {
+ $("#box").fadeIn(500);
+}, 200)
+
+$("body").focus();
+keysEnabled = true;
+$(document).keydown(function(e) {
+ if (keysEnabled) {
+ if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32) { // enter
+ if ($(".services").is(":visible")) {
+ selectOption();
+ } else {
+ $(".services").show();
+ }
+ }
+ if (e.keyCode === 38 || e.keyCode === 90) { // up
+ Sound.menu();
+ var selected = $(".selected");
+ $(".services li").removeClass("selected");
+ if (selected.prev().length === 0) {
+ selected.siblings().last().addClass("selected");
+ } else {
+ selected.prev().addClass("selected");
+ }
+ }
+ if (e.keyCode === 40 || e.keyCode === 83) { // down
+ Sound.menu();
+ var selected = $(".selected");
+ $(".services li").removeClass("selected");
+ if (selected.next().length === 0) {
+ selected.siblings().first().addClass("selected");
+ } else {
+ selected.next().addClass("selected");
+ }
+ }
+ if (e.keyCode === 68 || e.keyCode === 39 || e.keyCode === 81 || e.keyCode === 37) { // right/left
+ Sound.menu();
+ var selected = $(".selected");
+ var id = $(".selected")[0].children[0].children[0].id;
+
+ if (id === "lang") {
+ lang = document.getElementById("setting-lang").innerText;
+ slng = JSON.parse($.ajax('../lang/languages.json', { async: false }).responseText);
+ slst = Object.keys(slng);
+ maxl = slst.length - 1;
+
+ ci = -1;
+ ni = -1;
+ slst.forEach((key, index) => {
+ if (slng[key] === lang) {
+ ci = index;
+ if (index + 1 > maxl) {
+ ni = 0;
+ } else {
+ ni = index + 1;
+ }
+ }
+ })
+
+ if (ci !== -1 && ni !== -1) {
+ document.cookie = "kartik_lang=" + slst[ni] + "; path=/";
+ document.getElementById("setting-lang").innerText = slng[slst[ni]];
+ window.parent.lp = lp = slst[ni];
+ }
+ }
+ }
+ if (e.keyCode === 27 || e.keyCode === 8) { // esc
+ keysEnabled = false;
+ Sound.click();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("OptnWindow", "Switching control to MenuWindow");
+ location.href = "menu.html";
+ }, 1000)
+ }
+ }
+});
+
+function selectOption() {
+ item = document.querySelector(".selected a").id;
+ Sound.click();
+
+ switch (item) {
+ case 'back':
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("OptnWindow", "Switching control to MenuWindow");
+ location.href = "menu.html?noreset";
+ }, 1000)
+ break;
+ case 'credits':
+ window.parent.musicManager.fadeMusic();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("OptnWindow", "Switching control to MenuWindow");
+ location.href = "credits.html";
+ }, 1000)
+ break;
+ }
+}
diff --git a/kartik/views/script/settings_load.js b/kartik/views/script/settings_load.js
new file mode 100755
index 0000000..c57329f
--- /dev/null
+++ b/kartik/views/script/settings_load.js
@@ -0,0 +1,10 @@
+info("OptnWindow", "Restoring settings...");
+
+slang = lp;
+langs = JSON.parse($.ajax('../lang/languages.json', { async: false }).responseText);
+
+if (Object.keys(langs).includes(slang)) {
+ document.getElementById("setting-lang").innerText = langs[slang];
+} else {
+ document.getElementById("setting-lang").innerText = slang;
+}
diff --git a/kartik/views/script/win_global.js b/kartik/views/script/win_global.js
new file mode 100755
index 0000000..7448375
--- /dev/null
+++ b/kartik/views/script/win_global.js
@@ -0,0 +1,22 @@
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+$("#box").fadeOut(0);
+setTimeout(() => {
+ $("#box").fadeIn(500);
+}, 200)
+
+keysEnabled = true;
+$(document).keydown(function(e) {
+ if (keysEnabled) {
+ if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32 || e.keyCode === 27 || e.keyCode === 8 || e.keyCode === 16) { // enter/esc
+ Sound.click();
+ window.parent.musicManager.fadeMusic();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("GWinWindow", "Switching control to MenuWindow");
+ location.href = "menu.html";
+ }, 3000)
+ }
+ }
+})
+
+info("GWinWindow", "Rendered!"); \ No newline at end of file
diff --git a/kartik/views/script/win_message.js b/kartik/views/script/win_message.js
new file mode 100755
index 0000000..fd01c22
--- /dev/null
+++ b/kartik/views/script/win_message.js
@@ -0,0 +1,9 @@
+if (location.search === "?sp") {
+ if ((location.hash.substr(4) - 1 + 2) == 1) {
+ document.write(lang.win.solo.win);
+ } else {
+ document.write(lang.win.solo.lose);
+ }
+} else {
+ document.write(lang.win.versus.replace("0", (location.hash.substr(4) - 1 + 2)));
+} \ No newline at end of file
diff --git a/kartik/views/script/win_music.js b/kartik/views/script/win_music.js
new file mode 100755
index 0000000..6220bb8
--- /dev/null
+++ b/kartik/views/script/win_music.js
@@ -0,0 +1,2 @@
+info("MusicMgr", "Playing win.mp3");
+window.parent.musicManager.setMusic(kresources.music['win'].file); \ No newline at end of file
diff --git a/kartik/views/script/win_play.js b/kartik/views/script/win_play.js
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/kartik/views/script/win_play.js
diff --git a/kartik/views/script/win_quit.js b/kartik/views/script/win_quit.js
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/kartik/views/script/win_quit.js
diff --git a/kartik/views/settings.html b/kartik/views/settings.html
new file mode 100755
index 0000000..0548e2d
--- /dev/null
+++ b/kartik/views/settings.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="menu.css">
+ <title>Kartik</title>
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+</head>
+<body>
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div style="color:black;width: 100%;height: 192px;background: #00538e;background-image: url('./background.jpg');background-size: cover;position: fixed;z-index: -1;"><h2 style="margin: 0;padding: 50px;font-size: 48px;color: black;"><script>document.write(lang.settings.title)</script></h2></div>
+
+ <div class="services services-settings">
+ <div class="items">
+ <ul>
+ <li class="selected"><span class="item" style="width: calc(100% - 150px);"><a href="#" id="back"><img class="item-icon" src="../icons/back.svg"> <script>document.write(lang.settings.back)</script></a></span></li>
+ <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="lang"><img class="item-icon" src="../icons/language.svg"> <script>document.write(lang.settings.lang)</script> [Language]<span class="setting-status"><span id="setting-lang">Français</span></span></a></span></li>
+ <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="credits"><img class="item-icon" src="../icons/credits.svg"> <script>document.write(lang.menu.titles[3])</script></a></span></li>
+ </ul>
+ </div>
+ </div>
+
+ <span id="notice" style="color:black;">
+ <script>
+ document.write(lang.settings.notice);
+ </script>
+ </span>
+ </div>
+
+ <script src="./script/settings_load.js"></script>
+<script>info("OptnWindow", "Menu opened");</script>
+</body>
+<script src="./script/settings_global.js"></script>
+<script src="./script/client_fullscreen.js"></script>
+</html>
diff --git a/kartik/views/splash.svg b/kartik/views/splash.svg
new file mode 100755
index 0000000..e9bfac3
--- /dev/null
+++ b/kartik/views/splash.svg
@@ -0,0 +1,2831 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="1600"
+ height="770"
+ id="svg622"
+ sodipodi:docname="tiler.svg"
+ inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs626" />
+ <sodipodi:namedview
+ id="namedview624"
+ pagecolor="#ffffff"
+ bordercolor="#999999"
+ borderopacity="1"
+ inkscape:pageshadow="0"
+ inkscape:pageopacity="0"
+ inkscape:pagecheckerboard="0"
+ showgrid="false"
+ inkscape:zoom="0.43798583"
+ inkscape:cx="778.56401"
+ inkscape:cy="374.44134"
+ inkscape:window-width="1600"
+ inkscape:window-height="845"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg622" />
+ <rect
+ width="1600"
+ height="770"
+ fill="#504b4b"
+ id="rect2"
+ style="fill:#064896;fill-opacity:1" />
+ <rect
+ width="1600"
+ height="770"
+ fill="#21d789"
+ opacity="0"
+ id="rect4" />
+ <g
+ id="g596">
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,123.07692131629346,-7.105427357601002e-15)"
+ id="g10">
+ <circle
+ cx="23.999998092651367"
+ cy="23.99999866485596"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle6" />
+ <circle
+ cx="56"
+ cy="55.99999866485596"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle8" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,246.1538523160491,123.07692923912667)"
+ id="g14">
+ <polygon
+ points="79.99999866485587,79.99999866485595 -0.0000013351441339182202,159.99999866485595 -0.0000013351441339182202,79.99999866485595 79.99999866485587,79.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon12" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,369.2307756864104,246.15385260948798)"
+ id="g24">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g22">
+ <polygon
+ points="-0.0000013351441339182202,239.99999866485595 15.999998664855866,159.99999866485595 31.999998664855866,159.99999866485595 15.999998664855866,239.99999866485595 -0.0000013351441339182202,239.99999866485595"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon16" />
+ <polygon
+ points="31.999998092651367,239.99999866485595 47.99999809265137,159.99999866485595 63.99999809265137,159.99999866485595 47.99999809265137,239.99999866485595 31.999998092651367,239.99999866485595"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon18" />
+ <polygon
+ points="64,239.99999866485595 80,159.99999866485595 80,239.99999866485595 64,239.99999866485595"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon20" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,123.07692131629352,861.5384826660156)"
+ id="g30">
+ <circle
+ cx="23.999998092651367"
+ cy="263.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle26" />
+ <circle
+ cx="56"
+ cy="295.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle28" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,-492.30771460899973,615.3846376859223)"
+ id="g34">
+ <polygon
+ points="79.99999866485587,319.9999986648559 -0.0000013351441339182202,399.9999986648559 -0.0000013351441339182202,319.9999986648559 79.99999866485587,319.9999986648559"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon32" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,738.4615572415862,615.3846341646638)"
+ id="g38">
+ <polygon
+ points="79.99999866485587,399.999998664856 -0.0000013351441339182202,479.999998664856 -0.0000013351441339182202,399.999998664856 79.99999866485587,399.999998664856"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon36" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,123.07692307692251,1600)"
+ id="g48">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g46">
+ <polygon
+ points="-0.0000013351441339182202,559.999998664856 15.999998664855866,479.999998664856 31.999998664855866,479.999998664856 15.999998664855866,559.999998664856 -0.0000013351441339182202,559.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon40" />
+ <polygon
+ points="31.999998092651367,559.999998664856 47.99999809265137,479.999998664856 63.99999809265137,479.999998664856 47.99999809265137,559.999998664856 31.999998092651367,559.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon42" />
+ <polygon
+ points="64,559.999998664856 80,479.999998664856 80,559.999998664856 64,559.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon44" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,246.15385143573462,-123.07693011944116)"
+ id="g54">
+ <circle
+ cx="104"
+ cy="23.99999866485596"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle50" />
+ <circle
+ cx="136"
+ cy="55.99999866485596"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle52" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,369.2307815551758,0)"
+ id="g64">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g62">
+ <polygon
+ points="80,159.99999866485595 96,79.99999866485595 112,79.99999866485595 96,159.99999866485595 80,159.99999866485595"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon56" />
+ <polygon
+ points="112,159.99999866485595 128,79.99999866485595 144,79.99999866485595 128,159.99999866485595 112,159.99999866485595"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon58" />
+ <polygon
+ points="144,159.99999866485595 160,79.99999866485595 160,159.99999866485595 144,159.99999866485595"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon60" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,492.3077049255371,123.0769233703613)"
+ id="g70">
+ <circle
+ cx="104"
+ cy="183.99999866485595"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle66" />
+ <circle
+ cx="136"
+ cy="215.99999866485595"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle68" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,-246.15385055541987,615.3846321105958)"
+ id="g80">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g78">
+ <polygon
+ points="80,319.999998664856 96,239.99999866485598 112,239.99999866485598 96,319.999998664856 80,319.999998664856"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon72" />
+ <polygon
+ points="112,319.999998664856 128,239.99999866485598 144,239.99999866485598 128,319.999998664856 112,319.999998664856"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon74" />
+ <polygon
+ points="144,319.999998664856 160,239.99999866485598 160,319.999998664856 144,319.999998664856"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon76" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,-369.23078536987305,738.4615669250489)"
+ id="g84">
+ <polygon
+ points="160,319.9999986648559 80,399.9999986648559 80,319.9999986648559 160,319.9999986648559"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon82" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,369.2307815551759,1353.84619140625)"
+ id="g90">
+ <circle
+ cx="104"
+ cy="423.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle86" />
+ <circle
+ cx="136"
+ cy="455.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle88" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g100">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g98">
+ <polygon
+ points="80,559.999998664856 96,479.999998664856 112,479.999998664856 96,559.999998664856 80,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon92" />
+ <polygon
+ points="112,559.999998664856 128,479.999998664856 144,479.999998664856 128,559.999998664856 112,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon94" />
+ <polygon
+ points="144,559.999998664856 160,479.999998664856 160,559.999998664856 144,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon96" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,246.15385260948784,369.23077568641065)"
+ id="g104">
+ <polygon
+ points="240,-0.000001335144041902936 160,79.99999866485595 160,-0.000001335144041902936 240,-0.000001335144041902936"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon102" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,615.3846282958984,369.2307815551758)"
+ id="g114">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g112">
+ <polygon
+ points="160,159.99999866485595 176,79.99999866485595 192,79.99999866485595 176,159.99999866485595 160,159.99999866485595"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon106" />
+ <polygon
+ points="192,159.99999866485595 208,79.99999866485595 224,79.99999866485595 208,159.99999866485595 192,159.99999866485595"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon108" />
+ <polygon
+ points="224,159.99999866485595 240,79.99999866485595 240,159.99999866485595 224,159.99999866485595"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon110" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,5.684341886080802e-14,615.3846282958984)"
+ id="g118">
+ <polygon
+ points="240,159.99999866485595 160,239.99999866485595 160,159.99999866485595 240,159.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon116" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,-123.07692718505854,738.461555480957)"
+ id="g124">
+ <circle
+ cx="184"
+ cy="263.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle120" />
+ <circle
+ cx="216"
+ cy="295.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle122" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,-246.15386199951172,861.5384902954103)"
+ id="g130">
+ <circle
+ cx="184"
+ cy="343.9999986648559"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle126" />
+ <circle
+ cx="216"
+ cy="375.9999986648559"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle128" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g136">
+ <circle
+ cx="184"
+ cy="423.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle132" />
+ <circle
+ cx="216"
+ cy="455.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle134" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g146">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g144">
+ <polygon
+ points="160,559.999998664856 176,479.999998664856 192,479.999998664856 176,559.999998664856 160,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon138" />
+ <polygon
+ points="192,559.999998664856 208,479.999998664856 224,479.999998664856 208,559.999998664856 192,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon140" />
+ <polygon
+ points="224,559.999998664856 240,479.999998664856 240,559.999998664856 224,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon142" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g150">
+ <polygon
+ points="320,-0.000001335144041902936 240,79.99999866485595 240,-0.000001335144041902936 320,-0.000001335144041902936"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon148" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,861.5384826660156,369.2307815551757)"
+ id="g154">
+ <polygon
+ points="320,79.99999866485595 240,159.99999866485595 240,79.99999866485595 320,79.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon152" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,738.461555480957,-123.0769271850586)"
+ id="g158">
+ <polygon
+ points="320,159.99999866485595 240,239.99999866485595 240,159.99999866485595 320,159.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon156" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g162">
+ <polygon
+ points="320,239.99999866485598 240,319.999998664856 240,239.99999866485598 320,239.99999866485598"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon160" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,861.5384826660156,1107.6923522949219)"
+ id="g168">
+ <circle
+ cx="264"
+ cy="343.9999986648559"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle164" />
+ <circle
+ cx="296"
+ cy="375.9999986648559"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle166" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,-246.15385437011707,1107.6923370361328)"
+ id="g174">
+ <circle
+ cx="264"
+ cy="423.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle170" />
+ <circle
+ cx="296"
+ cy="455.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle172" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g184">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g182">
+ <polygon
+ points="240,559.999998664856 256,479.999998664856 272,479.999998664856 256,559.999998664856 240,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon176" />
+ <polygon
+ points="272,559.999998664856 288,479.999998664856 304,479.999998664856 288,559.999998664856 272,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon178" />
+ <polygon
+ points="304,559.999998664856 320,479.999998664856 320,559.999998664856 304,559.999998664856"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon180" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,1107.6923522949219,123.0769230769228)"
+ id="g188">
+ <polygon
+ points="400,-0.000001335144041902936 320,79.99999866485595 320,-0.000001335144041902936 400,-0.000001335144041902936"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon186" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g194">
+ <circle
+ cx="344"
+ cy="103.99999866485595"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle190" />
+ <circle
+ cx="376"
+ cy="135.99999866485595"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle192" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,246.15386199951183,861.5384902954102)"
+ id="g198">
+ <polygon
+ points="400,159.99999866485595 320,239.99999866485595 320,159.99999866485595 400,159.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon196" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,984.6154174804688,-123.07693481445312)"
+ id="g202">
+ <polygon
+ points="400,239.99999866485598 320,319.999998664856 320,239.99999866485598 400,239.99999866485598"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon200" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,1.1368683772161603e-13,1107.6923522949219)"
+ id="g206">
+ <polygon
+ points="400,319.9999986648559 320,399.9999986648559 320,319.9999986648559 400,319.9999986648559"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon204" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,1107.6923522949219,1353.84619140625)"
+ id="g216">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g214">
+ <polygon
+ points="320,479.999998664856 336,399.999998664856 352,399.999998664856 336,479.999998664856 320,479.999998664856"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon208" />
+ <polygon
+ points="352,479.999998664856 368,399.999998664856 384,399.999998664856 368,479.999998664856 352,479.999998664856"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon210" />
+ <polygon
+ points="384,479.999998664856 400,399.999998664856 400,479.999998664856 384,479.999998664856"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon212" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,1107.6923522949219,1600)"
+ id="g222">
+ <circle
+ cx="344"
+ cy="503.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle218" />
+ <circle
+ cx="376"
+ cy="535.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle220" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g226">
+ <polygon
+ points="480,-0.000001335144041902936 400,79.99999866485595 400,-0.000001335144041902936 480,-0.000001335144041902936"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon224" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g236">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g234">
+ <polygon
+ points="400,159.99999866485595 416,79.99999866485595 432,79.99999866485595 416,159.99999866485595 400,159.99999866485595"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon228" />
+ <polygon
+ points="432,159.99999866485595 448,79.99999866485595 464,79.99999866485595 448,159.99999866485595 432,159.99999866485595"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon230" />
+ <polygon
+ points="464,159.99999866485595 480,79.99999866485595 480,159.99999866485595 464,159.99999866485595"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon232" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,369.2307815551759,984.6154098510742)"
+ id="g240">
+ <polygon
+ points="480,159.99999866485595 400,239.99999866485595 400,159.99999866485595 480,159.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon238" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1107.6923370361328,-246.1538543701172)"
+ id="g250">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g248">
+ <polygon
+ points="400,319.999998664856 416,239.99999866485598 432,239.99999866485598 416,319.999998664856 400,319.999998664856"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon242" />
+ <polygon
+ points="432,319.999998664856 448,239.99999866485598 464,239.99999866485598 448,319.999998664856 432,319.999998664856"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon244" />
+ <polygon
+ points="464,319.999998664856 480,239.99999866485598 480,319.999998664856 464,319.999998664856"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon246" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,123.07691955566418,1230.769271850586)"
+ id="g256">
+ <circle
+ cx="424"
+ cy="343.9999986648559"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle252" />
+ <circle
+ cx="456"
+ cy="375.9999986648559"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle254" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1353.84619140625,0)"
+ id="g262">
+ <circle
+ cx="424"
+ cy="423.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle258" />
+ <circle
+ cx="456"
+ cy="455.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle260" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1476.923095703125,123.076904296875)"
+ id="g268">
+ <circle
+ cx="424"
+ cy="503.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle264" />
+ <circle
+ cx="456"
+ cy="535.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle266" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,738.4615384615387,861.5384615384614)"
+ id="g278">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g276">
+ <polygon
+ points="480,79.99999866485595 496,-0.000001335144041902936 512,-0.000001335144041902936 496,79.99999866485595 480,79.99999866485595"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon270" />
+ <polygon
+ points="512,79.99999866485595 528,-0.000001335144041902936 544,-0.000001335144041902936 528,79.99999866485595 512,79.99999866485595"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon272" />
+ <polygon
+ points="544,79.99999866485595 560,-0.000001335144041902936 560,79.99999866485595 544,79.99999866485595"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon274" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,984.6153907775879,-615.3846092224121)"
+ id="g284">
+ <circle
+ cx="504"
+ cy="103.99999866485595"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle280" />
+ <circle
+ cx="536"
+ cy="135.99999866485595"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle282" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,1600,615.3846282958983)"
+ id="g290">
+ <circle
+ cx="504"
+ cy="183.99999866485595"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle286" />
+ <circle
+ cx="536"
+ cy="215.99999866485595"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle288" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g294">
+ <polygon
+ points="560,239.99999866485598 480,319.999998664856 480,239.99999866485598 560,239.99999866485598"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon292" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1353.846176147461,-246.15382385253906)"
+ id="g300">
+ <circle
+ cx="504"
+ cy="343.9999986648559"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle296" />
+ <circle
+ cx="536"
+ cy="375.9999986648559"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle298" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,123.07690429687511,1476.923095703125)"
+ id="g306">
+ <circle
+ cx="504"
+ cy="423.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle302" />
+ <circle
+ cx="536"
+ cy="455.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle304" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g310">
+ <polygon
+ points="560,479.999998664856 480,559.999998664856 480,479.999998664856 560,479.999998664856"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon308" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g320">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g318">
+ <polygon
+ points="560,79.99999866485595 576,-0.000001335144041902936 592,-0.000001335144041902936 576,79.99999866485595 560,79.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon312" />
+ <polygon
+ points="592,79.99999866485595 608,-0.000001335144041902936 624,-0.000001335144041902936 608,79.99999866485595 592,79.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon314" />
+ <polygon
+ points="624,79.99999866485595 640,-0.000001335144041902936 640,79.99999866485595 624,79.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon316" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,1846.1538696289062,369.23078155517567)"
+ id="g324">
+ <polygon
+ points="640,79.99999866485595 560,159.99999866485595 560,79.99999866485595 640,79.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon322" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,1846.1538696289062,615.3846282958983)"
+ id="g330">
+ <circle
+ cx="584"
+ cy="183.99999866485595"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle326" />
+ <circle
+ cx="616"
+ cy="215.99999866485595"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle328" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,492.3076934814455,1353.846176147461)"
+ id="g336">
+ <circle
+ cx="584"
+ cy="263.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle332" />
+ <circle
+ cx="616"
+ cy="295.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle334" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g342">
+ <circle
+ cx="584"
+ cy="343.9999986648559"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle338" />
+ <circle
+ cx="616"
+ cy="375.9999986648559"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle340" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,1846.1538696289062,1353.84619140625)"
+ id="g346">
+ <polygon
+ points="640,399.999998664856 560,479.999998664856 560,399.999998664856 640,399.999998664856"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon344" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1723.0769348144531,-123.07693481445312)"
+ id="g350">
+ <polygon
+ points="640,479.999998664856 560,559.999998664856 560,479.999998664856 640,479.999998664856"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon348" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g356">
+ <circle
+ cx="664"
+ cy="23.99999866485596"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle352" />
+ <circle
+ cx="696"
+ cy="55.99999866485596"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle354" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,861.5385093688967,1230.7692909240723)"
+ id="g362">
+ <circle
+ cx="664"
+ cy="103.99999866485595"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle358" />
+ <circle
+ cx="696"
+ cy="135.99999866485595"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle360" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1353.8462142944336,-738.4615859985352)"
+ id="g372">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g370">
+ <polygon
+ points="640,239.99999866485595 656,159.99999866485595 672,159.99999866485595 656,239.99999866485595 640,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon364" />
+ <polygon
+ points="672,239.99999866485595 688,159.99999866485595 704,159.99999866485595 688,239.99999866485595 672,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon366" />
+ <polygon
+ points="704,239.99999866485595 720,159.99999866485595 720,239.99999866485595 704,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon368" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1476.9231414794922,-615.3846588134766)"
+ id="g376">
+ <polygon
+ points="720,239.99999866485598 640,319.999998664856 640,239.99999866485598 720,239.99999866485598"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon374" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,492.30772399902366,1600.0000762939453)"
+ id="g382">
+ <circle
+ cx="664"
+ cy="343.9999986648559"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle378" />
+ <circle
+ cx="696"
+ cy="375.9999986648559"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle380" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1723.0769958496094,-369.2308044433594)"
+ id="g388">
+ <circle
+ cx="664"
+ cy="423.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle384" />
+ <circle
+ cx="696"
+ cy="455.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle386" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g394">
+ <circle
+ cx="664"
+ cy="503.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle390" />
+ <circle
+ cx="696"
+ cy="535.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle392" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2338.461669921875,123.07692307692272)"
+ id="g398">
+ <polygon
+ points="800,-0.000001335144041902936 720,79.99999866485595 720,-0.000001335144041902936 800,-0.000001335144041902936"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon396" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1353.8462257385254,-984.6154441833496)"
+ id="g408">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g406">
+ <polygon
+ points="720,159.99999866485595 736,79.99999866485595 752,79.99999866485595 736,159.99999866485595 720,159.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon400" />
+ <polygon
+ points="752,159.99999866485595 768,79.99999866485595 784,79.99999866485595 768,159.99999866485595 752,159.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon402" />
+ <polygon
+ points="784,159.99999866485595 800,79.99999866485595 800,159.99999866485595 784,159.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon404" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,861.5385208129885,1476.9231491088867)"
+ id="g412">
+ <polygon
+ points="800,159.99999866485595 720,239.99999866485595 720,159.99999866485595 800,159.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon410" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2338.461669921875,861.5384826660154)"
+ id="g422">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g420">
+ <polygon
+ points="720,319.999998664856 736,239.99999866485598 752,239.99999866485598 736,319.999998664856 720,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon414" />
+ <polygon
+ points="752,319.999998664856 768,239.99999866485598 784,239.99999866485598 768,319.999998664856 752,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon416" />
+ <polygon
+ points="784,319.999998664856 800,239.99999866485598 800,319.999998664856 784,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon418" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2338.461669921875,1107.6923522949219)"
+ id="g426">
+ <polygon
+ points="800,319.9999986648559 720,399.9999986648559 720,319.9999986648559 800,319.9999986648559"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon424" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2338.461669921875,1353.84619140625)"
+ id="g432">
+ <circle
+ cx="744"
+ cy="423.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle428" />
+ <circle
+ cx="776"
+ cy="455.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle430" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2338.461669921875,1600)"
+ id="g438">
+ <circle
+ cx="744"
+ cy="503.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle434" />
+ <circle
+ cx="776"
+ cy="535.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle436" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,1230.7692777193513,1353.846200796274)"
+ id="g448">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g446">
+ <polygon
+ points="800,79.99999866485595 816,-0.000001335144041902936 832,-0.000001335144041902936 816,79.99999866485595 800,79.99999866485595"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon440" />
+ <polygon
+ points="832,79.99999866485595 848,-0.000001335144041902936 864,-0.000001335144041902936 848,79.99999866485595 832,79.99999866485595"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon442" />
+ <polygon
+ points="864,79.99999866485595 880,-0.000001335144041902936 880,79.99999866485595 864,79.99999866485595"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon444" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2584.615478515625,369.2307815551756)"
+ id="g452">
+ <polygon
+ points="880,79.99999866485595 800,159.99999866485595 800,79.99999866485595 880,79.99999866485595"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon450" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g462">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g460">
+ <polygon
+ points="800,239.99999866485595 816,159.99999866485595 832,159.99999866485595 816,239.99999866485595 800,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon454" />
+ <polygon
+ points="832,239.99999866485595 848,159.99999866485595 864,159.99999866485595 848,239.99999866485595 832,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon456" />
+ <polygon
+ points="864,239.99999866485595 880,159.99999866485595 880,239.99999866485595 864,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon458" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2584.615478515625,861.5384826660154)"
+ id="g472">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g470">
+ <polygon
+ points="800,319.999998664856 816,239.99999866485598 832,239.99999866485598 816,319.999998664856 800,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon464" />
+ <polygon
+ points="832,319.999998664856 848,239.99999866485598 864,239.99999866485598 848,319.999998664856 832,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon466" />
+ <polygon
+ points="864,319.999998664856 880,239.99999866485598 880,319.999998664856 864,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon468" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2584.615478515625,1107.6923522949219)"
+ id="g476">
+ <polygon
+ points="880,319.9999986648559 800,399.9999986648559 800,319.9999986648559 880,319.9999986648559"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon474" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1969.2308349609375,-615.3846435546875)"
+ id="g482">
+ <circle
+ cx="824"
+ cy="423.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle478" />
+ <circle
+ cx="856"
+ cy="455.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle480" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2584.615478515625,1600)"
+ id="g486">
+ <polygon
+ points="880,479.999998664856 800,559.999998664856 800,479.999998664856 880,479.999998664856"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon484" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1476.923105093149,-1353.846182016226)"
+ id="g490">
+ <polygon
+ points="960,-0.000001335144041902936 880,79.99999866485595 880,-0.000001335144041902936 960,-0.000001335144041902936"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon488" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g500">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g498">
+ <polygon
+ points="880,159.99999866485595 896,79.99999866485595 912,79.99999866485595 896,159.99999866485595 880,159.99999866485595"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon492" />
+ <polygon
+ points="912,159.99999866485595 928,79.99999866485595 944,79.99999866485595 928,159.99999866485595 912,159.99999866485595"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon494" />
+ <polygon
+ points="944,159.99999866485595 960,79.99999866485595 960,159.99999866485595 944,159.99999866485595"
+ fill-opacity="0"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon496" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1723.0769577026367,-1107.6923294067383)"
+ id="g510">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g508">
+ <polygon
+ points="880,239.99999866485595 896,159.99999866485595 912,159.99999866485595 896,239.99999866485595 880,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon502" />
+ <polygon
+ points="912,239.99999866485595 928,159.99999866485595 944,159.99999866485595 928,239.99999866485595 912,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon504" />
+ <polygon
+ points="944,239.99999866485595 960,159.99999866485595 960,239.99999866485595 944,239.99999866485595"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon506" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2830.769287109375,861.5384826660154)"
+ id="g516">
+ <circle
+ cx="904"
+ cy="263.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle512" />
+ <circle
+ cx="936"
+ cy="295.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle514" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,2830.769287109375,1107.6923522949216)"
+ id="g520">
+ <polygon
+ points="960,319.9999986648559 880,399.9999986648559 880,319.9999986648559 960,319.9999986648559"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon518" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,2092.3077392578125,-738.4615478515625)"
+ id="g530">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g528">
+ <polygon
+ points="880,479.999998664856 896,399.999998664856 912,399.999998664856 896,479.999998664856 880,479.999998664856"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon522" />
+ <polygon
+ points="912,479.999998664856 928,399.999998664856 944,399.999998664856 928,479.999998664856 912,479.999998664856"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon524" />
+ <polygon
+ points="944,479.999998664856 960,399.999998664856 960,479.999998664856 944,479.999998664856"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon526" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,2215.3846435546875,-615.3846435546875)"
+ id="g536">
+ <circle
+ cx="904"
+ cy="503.999998664856"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle532" />
+ <circle
+ cx="936"
+ cy="535.999998664856"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle534" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,1600.000009390024,-1476.923086313101)"
+ id="g546">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g544">
+ <polygon
+ points="960,79.99999866485595 976,-0.000001335144041902936 992,-0.000001335144041902936 976,79.99999866485595 960,79.99999866485595"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon538" />
+ <polygon
+ points="992,79.99999866485595 1008,-0.000001335144041902936 1024,-0.000001335144041902936 1008,79.99999866485595 992,79.99999866485595"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon540" />
+ <polygon
+ points="1024,79.99999866485595 1040,-0.000001335144041902936 1040,79.99999866485595 1024,79.99999866485595"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon542" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g552">
+ <circle
+ cx="984"
+ cy="103.99999866485595"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle548" />
+ <circle
+ cx="1016"
+ cy="135.99999866485595"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle550" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g558">
+ <circle
+ cx="984"
+ cy="183.99999866485595"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle554" />
+ <circle
+ cx="1016"
+ cy="215.99999866485595"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#07c3f2"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#07c3f2"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle556" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,1107.692306518555,1969.2307891845703)"
+ id="g568">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g566">
+ <polygon
+ points="960,319.999998664856 976,239.99999866485598 992,239.99999866485598 976,319.999998664856 960,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon560" />
+ <polygon
+ points="992,319.999998664856 1008,239.99999866485598 1024,239.99999866485598 1008,319.999998664856 992,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon562" />
+ <polygon
+ points="1024,319.999998664856 1040,239.99999866485598 1040,319.999998664856 1024,319.999998664856"
+ fill-opacity="1"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon564" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,2092.3077239990234,-984.6153717041016)"
+ id="g574">
+ <circle
+ cx="984"
+ cy="343.9999986648559"
+ r="24"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle570" />
+ <circle
+ cx="1016"
+ cy="375.9999986648559"
+ r="8"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ fill-opacity="1"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="circle572" />
+ </g>
+ <g
+ class="tile"
+ transform="matrix(1,0,0,1,0,0)"
+ id="g584">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g582">
+ <polygon
+ points="960,479.999998664856 976,399.999998664856 992,399.999998664856 976,479.999998664856 960,479.999998664856"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon576" />
+ <polygon
+ points="992,479.999998664856 1008,399.999998664856 1024,399.999998664856 1008,479.999998664856 992,479.999998664856"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon578" />
+ <polygon
+ points="1024,479.999998664856 1040,399.999998664856 1040,479.999998664856 1024,479.999998664856"
+ fill-opacity="0"
+ fill="#087cfa"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#087cfa"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon580" />
+ </g>
+ </g>
+ <g
+ class="tile"
+ transform="matrix(6.123233995736766e-17,1,-1,6.123233995736766e-17,2338.4615478515625,-738.4615478515625)"
+ id="g594">
+ <g
+ clip-path="none"
+ transform="matrix(1.5384615384615385,0,0,1.5384615384615385,0,0)"
+ id="g592">
+ <polygon
+ points="960,559.999998664856 976,479.999998664856 992,479.999998664856 976,559.999998664856 960,559.999998664856"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon586" />
+ <polygon
+ points="992,559.999998664856 1008,479.999998664856 1024,479.999998664856 1008,559.999998664856 992,559.999998664856"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon588" />
+ <polygon
+ points="1024,559.999998664856 1040,479.999998664856 1040,559.999998664856 1024,559.999998664856"
+ fill-opacity="0"
+ fill="#21d789"
+ stroke-opacity="1"
+ stroke-width="1"
+ stroke="#21d789"
+ opacity="1"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ id="polygon590" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/kartik/views/stats.html b/kartik/views/stats.html
new file mode 100755
index 0000000..b457233
--- /dev/null
+++ b/kartik/views/stats.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+
+ <script src="./script/win_play.js"></script>
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;color:white;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;">
+ <div style="text-align: center;">
+ <h2><script>let homedir = require('@electron/remote').getCurrentWindow().homedir;document.write(lang.stats.title);stats=currentNest.stats</script></h2>
+
+ <div style="display:grid;grid-template-columns: 1fr 1fr;">
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.single'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.single * 1000).toISOString().substr(11, 8))</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.local'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.local * 1000).toISOString().substr(11, 8))</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.online'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.online * 1000).toISOString().substr(11, 8))</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['results.wins'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.results.wins)</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['results.loses'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.results.loses)</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.walls'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.walls)</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.laps'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.laps)</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.turns'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.turns)</script></div>
+ </div>
+
+ <p><script>document.write(lang.win.quit[0])</script></p>
+ </div>
+ </div>
+ </div>
+
+ <script src="./script/win_music.js"></script>
+
+ <script src="./script/win_global.js"></script>
+ <script src="./script/client_fullscreen.js"></script>
+</body>
+</html>
diff --git a/kartik/views/win.html b/kartik/views/win.html
new file mode 100755
index 0000000..fbc4de6
--- /dev/null
+++ b/kartik/views/win.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>native = false;global = window;info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};currentNest = {};</script><script src="../webinit/jquery.js"></script><script>window.kresources = kresources = JSON.parse($.ajax("/kartik/resources.json", { async: false }).responseText);</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+
+ <script src="./script/win_play.js"></script>
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;color:white;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;">
+ <div style="text-align: center;">
+ <p style="font-size:36px;"><script src="./script/win_message.js"></script></p>
+ <p style="font-size:16px;" id="progress"><script>document.write(lang.win.quit[0])</script></p>
+ <script src="./script/win_quit.js"></script>
+ </div>
+ </div>
+ </div>
+
+ <script src="./script/win_music.js"></script>
+
+ <script src="./script/win_global.js"></script>
+ <script src="./script/client_fullscreen.js"></script>
+</body>
+</html>