diff --git a/.drone.yml b/.drone.yml
index 7891f20..9484e36 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -10,7 +10,7 @@ steps:
auto_tag: true
- name: frontend
- image: privateregistry.michelescandura.com/michele/basecompileimage:1.1
+ image: privateregistry.michelescandura.com/michele/basecompileimage
pull: true
volumes:
- name: cache
@@ -50,7 +50,7 @@ steps:
- name: cache
path: /release
settings:
- api_key: 5eb87a0a7d55fbf8fb64e678781a5ddcc1a27e09
+ api_key: 96d2ba3da7491bd7760e2681f8882cf41f82e609
base_url: https://git.michelescandura.com
files: /release/zip/*
title: ${DRONE_TAG}
diff --git a/.gitignore b/.gitignore
index bfb3dac..2527dec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -362,6 +362,4 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd
-/db
-*.db
-*.db*
\ No newline at end of file
+/db
\ No newline at end of file
diff --git a/Assets/migration scripts.txt b/Assets/migration scripts.txt
deleted file mode 100644
index 771a499..0000000
--- a/Assets/migration scripts.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-select * from MapLog where SessionId=2 --Ruined Maze D0823E78-15E4-45EE-A396-0A2E891961DC
-
-select * from MapLog where SessionId=4 --test 6351309A-EFA5-4721-A4BE-AC63995ADB7F
-
-select * from MapLog where SessionId=5 --daniele 7EB1D6F5-12E2-4A8F-98CD-3351D40F1D26
-
-select * from MapLog where SessionId=6 --Psyruque BED7EF13-5823-427A-8C40-8BE94A563638
-
-
-select * from Sessions
-select * from Snapshots
-select * from Snapshot where SessionId=2
-select * from Sessions
-select * from MapLogs
-select * from MapLog
-INSERT INTO Snapshots (Object, SessionId, Timestamp)
-SELECT Object, "BED7EF13-5823-427A-8C40-8BE94A563638",Timestamp
-FROM Snapshot
-WHERE SessionId=6
-order by SnapshotId
-
-INSERT INTO MapLogs (Object, Operation, SessionId, Timestamp, Type, UserId)
-SELECT Object, Operation, "6351309A-EFA5-4721-A4BE-AC63995ADB7F", Timestamp, Type, "cd85a137-a5e8-4e4a-81d2-3e1c94ac9470"
-FROM MapLog
-WHERE SessionId =2
-ORDER BY MapLogId
-
-INSERT INTO MapLogs (Object, Operation, SessionId, Timestamp, Type, UserId)
-SELECT Object, Operation, "D0823E78-15E4-45EE-A396-0A2E891961DC", Timestamp, Type, "cd85a137-a5e8-4e4a-81d2-3e1c94ac9470"
-FROM MapLog
-WHERE SessionId =4
-ORDER BY MapLogId
-
-INSERT INTO MapLogs (Object, Operation, SessionId, Timestamp, Type, UserId)
-SELECT Object, Operation, "7EB1D6F5-12E2-4A8F-98CD-3351D40F1D26", Timestamp, Type, "cd85a137-a5e8-4e4a-81d2-3e1c94ac9470"
-FROM MapLog
-WHERE SessionId =5
-ORDER BY MapLogId
-
-INSERT INTO MapLogs (Object, Operation, SessionId, Timestamp, Type, UserId)
-SELECT Object, Operation, "BED7EF13-5823-427A-8C40-8BE94A563638", Timestamp, Type, "cd85a137-a5e8-4e4a-81d2-3e1c94ac9470"
-FROM MapLog
-WHERE SessionId =6
-ORDER BY MapLogId
-
---delete from Snapshots where SessionId="A306DFEE-82A9-4964-942A-1B923B970951"
-
-
-insert into Snapshots (
-select * from Snapshot where SessionId=2
diff --git a/Assets/sledgemapper.drawio b/Assets/sledgemapper.drawio
deleted file mode 100644
index d445036..0000000
--- a/Assets/sledgemapper.drawio
+++ /dev/null
@@ -1 +0,0 @@
-7Vvbdto4FP0aHpPlC7c8gnNpO2mGljSZV4EFaJAtRhYh9OvnyJZvKICd4DohrMUDOpZlS3vraGvbbtiO93zD0WL2nbmYNizDfW7Ylw3LMpuW1ZA/w11HkU5bBaacuKpSGhiS31gFDRVdEhcHuYqCMSrIIh8cM9/HY5GLIc7ZKl9twmj+qgs0xVpgOEZUjz4SV8yiaNfqpPEvmExn8ZXN9kV0xENxZdWTYIZctsqE7KuG7XDGRPTPe3YwlYMXj8vj1/UjvZ23b779CP5Dv/p/3d89nEWNXZc5JekCx754ddO/55PrLw/Nf/9ZDK5/rIyb3ujbmTrFeEJ0qcbLQd4Ckamv+izW8UAGK+JR5EOpP2G+GKojMAx9ROUJ9uUY7g9zCDxhLghg0FMHBFtAdDwj1L1Fa7aUvQgEGs/jUn/GOPkNzSIKh0wIwGEuFJ2sdq7GUJ4JYQOiHAdQZxAPjZmEblEgVJ0xoxQtAjIKb1hW8RCfEr/PhGBe3BBb+i52VSnBOiwIzuYJe+T5BQFRwMnRwM8ZOiqAbjDzsOBrqKKOJlxTk82My6uUumZbxWZZ2tpdNWXUdJkmbSeX+wnTC/lTGIT0evbG9ZoFrweI5C6HKADvI4H7chiDLBHhT6araSikZwmqmhpV75CHNZrCSIsMJSmeiK2EDBZoTPzpbVjnsplGfqqeyhCDcyc0JMOMuC72Q7IIJFDEJ8mQBSO+CIei1YcfDJhjnLcaLbghB8pmWoafrM6Fw3zgFSIhgTCQdYUlYV+g1s6Ju59a6zxiZZHNEikHaVn8LD3VcAyMcfvrXwFkjWMDckdCmQmPqr9Vwd2yaobb1uC+8hCRp/VcF1J0cAL8oIB3ujUD3tQA1xCmJJQPajTMF5fWPfB7AKRsLsb7XtLh8szUOGHrnLBfwJ+iEaYDFhBBmGyfR3U3eFFX0jaNZjFUd6z+bwK1pYE6WPLxDAVSRIDqmsPwhv+OcD5XBqpZd25ua6gOxdKV3Swo+o2T6D+c6Dc3RL/drlb0mxui3+6+X9Hf2c5U427pjY5QNxZMO+3CNHsvG4CuhmUP7l7aN5bxHZaSo0PyoIKwNN617wAuToLw4KAWVflV6UFTNwy/QuI3rgANMkLhMnPPZMDnTDZ3ZFM6K4KaVYHcrTtTm7rXdoPlkjvEHvERl4jfoznWTeKPjm9VkNav+eMb2JWOse/25CMXKI0ok3K7DyGlx00jKl4TGi9dewRzfv3D7hTHUwfTEVtdpYF+GIADMVNKy+2Awb4U74cMNhhTXGA7J+92J7AvAckxRYI85Z887RDnA0ncVJhbRl6YW4adbyLqpDor+6inbEPRKGgNHcyq182/AWcTHARM1+unLWb1W0x7c8tXdIvZMfaS+IUdpt0ssMPsvI8dpqn7lkNEkcq4n3BtSybvx9lZmrpNqaH32bca5WEtuoGsbK+h25SfSrHEiL1ryWJuZPrOKyWLvdGQ1dm4l6oli+40bntOeRIs1QuWltHN0aHwizCWuWOR2a5YWq0P9CKMbqQOBcdYf3rzWRRLpzC93o1i0c1Rh4jj05wHtcDL41y7B27pfikkbXF8r63VDHTtb79YumUKyl6u4pbhMPcE+IEBL/xmTHWI64aqA2MijtA5qBtr+5Vi7HBY64amBvKnNxjK49oqKMOqchgs3ft7AIjcY1ygq0OxXXsm1u2/v5disZT2Qk8+q7yV8+CEaGFEL2rPt+WsP7YIx7qcuZf4gmb9Vp8a271OX4zlXqtP4SyplLU1muqG3uj6Jc9zEsJY+SaKun6t5p6Gtrh+WkNnm0+cNtphk0mAKzEOLd04NM7PY+BTuoZmXCYR7Ek7I2XJRWt4H43n05C/DqOMw3GfpQakcrut4jkhnl/qo0t1W43k87PiRt3ZGxkVE/OPwaWbZ8WxivXTRwXrMLM/fin3j0One2YUeiEXeLTV+8zI8U1UdRVcxMFPNPpurEu56G8khkaAbVwpvk5cHIYpdt7Fj5P0W7gCxfST66h6+uG6ffU/
\ No newline at end of file
diff --git a/Assets/walls.svg b/Assets/walls.svg
deleted file mode 100644
index 99a44bd..0000000
--- a/Assets/walls.svg
+++ /dev/null
@@ -1,331 +0,0 @@
-
-
diff --git a/External tools/Myra.1.2.1.0/AssetManagementBase.dll b/External tools/Myra.1.2.1.0/AssetManagementBase.dll
new file mode 100644
index 0000000..f49a1cc
Binary files /dev/null and b/External tools/Myra.1.2.1.0/AssetManagementBase.dll differ
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/arial64.fnt b/External tools/Myra.1.2.1.0/Assets/fonts/arial64.fnt
new file mode 100644
index 0000000..108850f
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Assets/fonts/arial64.fnt
@@ -0,0 +1,288 @@
+info face="Arial" size=64 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=63 base=51 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="arial64_0.png"
+chars count=191
+char id=32 x=508 y=2 width=3 height=1 xoffset=-1 yoffset=62 xadvance=15 page=0 chnl=15
+char id=33 x=497 y=270 width=7 height=40 xoffset=5 yoffset=11 xadvance=17 page=0 chnl=15
+char id=34 x=445 y=382 width=16 height=14 xoffset=2 yoffset=11 xadvance=20 page=0 chnl=15
+char id=35 x=453 y=229 width=31 height=40 xoffset=0 yoffset=11 xadvance=31 page=0 chnl=15
+char id=36 x=188 y=105 width=28 height=46 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=37 x=346 y=190 width=44 height=40 xoffset=2 yoffset=11 xadvance=49 page=0 chnl=15
+char id=38 x=147 y=238 width=34 height=40 xoffset=2 yoffset=11 xadvance=37 page=0 chnl=15
+char id=39 x=462 y=382 width=7 height=14 xoffset=2 yoffset=11 xadvance=11 page=0 chnl=15
+char id=40 x=287 y=53 width=14 height=51 xoffset=3 yoffset=11 xadvance=18 page=0 chnl=15
+char id=41 x=272 y=53 width=14 height=51 xoffset=3 yoffset=11 xadvance=18 page=0 chnl=15
+char id=42 x=379 y=384 width=19 height=17 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
+char id=43 x=26 y=400 width=28 height=27 xoffset=2 yoffset=19 xadvance=32 page=0 chnl=15
+char id=44 x=470 y=380 width=7 height=13 xoffset=4 yoffset=46 xadvance=15 page=0 chnl=15
+char id=45 x=128 y=419 width=16 height=5 xoffset=1 yoffset=34 xadvance=18 page=0 chnl=15
+char id=46 x=162 y=419 width=7 height=5 xoffset=4 yoffset=46 xadvance=15 page=0 chnl=15
+char id=47 x=62 y=321 width=17 height=40 xoffset=-1 yoffset=11 xadvance=15 page=0 chnl=15
+char id=48 x=341 y=314 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
+char id=49 x=369 y=313 width=16 height=39 xoffset=5 yoffset=12 xadvance=31 page=0 chnl=15
+char id=50 x=200 y=320 width=28 height=39 xoffset=1 yoffset=12 xadvance=31 page=0 chnl=15
+char id=51 x=229 y=320 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
+char id=52 x=112 y=321 width=29 height=39 xoffset=0 yoffset=12 xadvance=31 page=0 chnl=15
+char id=53 x=171 y=320 width=28 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
+char id=54 x=142 y=320 width=28 height=39 xoffset=1 yoffset=12 xadvance=31 page=0 chnl=15
+char id=55 x=313 y=315 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
+char id=56 x=257 y=320 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
+char id=57 x=285 y=315 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
+char id=58 x=491 y=350 width=7 height=29 xoffset=4 yoffset=22 xadvance=15 page=0 chnl=15
+char id=59 x=26 y=362 width=7 height=37 xoffset=4 yoffset=22 xadvance=15 page=0 chnl=15
+char id=60 x=84 y=395 width=28 height=27 xoffset=2 yoffset=18 xadvance=32 page=0 chnl=15
+char id=61 x=350 y=385 width=28 height=17 xoffset=2 yoffset=23 xadvance=32 page=0 chnl=15
+char id=62 x=55 y=396 width=28 height=27 xoffset=2 yoffset=18 xadvance=32 page=0 chnl=15
+char id=63 x=333 y=273 width=27 height=40 xoffset=2 yoffset=11 xadvance=31 page=0 chnl=15
+char id=64 x=0 y=0 width=52 height=52 xoffset=2 yoffset=11 xadvance=56 page=0 chnl=15
+char id=65 x=471 y=188 width=38 height=40 xoffset=-1 yoffset=11 xadvance=37 page=0 chnl=15
+char id=66 x=387 y=231 width=32 height=40 xoffset=3 yoffset=11 xadvance=37 page=0 chnl=15
+char id=67 x=406 y=103 width=36 height=42 xoffset=2 yoffset=10 xadvance=40 page=0 chnl=15
+char id=68 x=182 y=238 width=34 height=40 xoffset=4 yoffset=11 xadvance=40 page=0 chnl=15
+char id=69 x=0 y=280 width=31 height=40 xoffset=4 yoffset=11 xadvance=37 page=0 chnl=15
+char id=70 x=247 y=279 width=28 height=40 xoffset=4 yoffset=11 xadvance=34 page=0 chnl=15
+char id=71 x=367 y=103 width=38 height=42 xoffset=2 yoffset=10 xadvance=43 page=0 chnl=15
+char id=72 x=420 y=229 width=32 height=40 xoffset=4 yoffset=11 xadvance=40 page=0 chnl=15
+char id=73 x=88 y=321 width=7 height=40 xoffset=4 yoffset=11 xadvance=15 page=0 chnl=15
+char id=74 x=189 y=196 width=23 height=41 xoffset=1 yoffset=11 xadvance=28 page=0 chnl=15
+char id=75 x=217 y=238 width=34 height=40 xoffset=3 yoffset=11 xadvance=37 page=0 chnl=15
+char id=76 x=417 y=272 width=27 height=40 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
+char id=77 x=391 y=188 width=39 height=40 xoffset=3 yoffset=11 xadvance=45 page=0 chnl=15
+char id=78 x=252 y=233 width=33 height=40 xoffset=3 yoffset=11 xadvance=40 page=0 chnl=15
+char id=79 x=327 y=105 width=39 height=42 xoffset=2 yoffset=10 xadvance=43 page=0 chnl=15
+char id=80 x=32 y=280 width=31 height=40 xoffset=4 yoffset=11 xadvance=37 page=0 chnl=15
+char id=81 x=217 y=105 width=39 height=44 xoffset=2 yoffset=10 xadvance=43 page=0 chnl=15
+char id=82 x=38 y=239 width=36 height=40 xoffset=4 yoffset=11 xadvance=40 page=0 chnl=15
+char id=83 x=443 y=103 width=33 height=42 xoffset=2 yoffset=10 xadvance=37 page=0 chnl=15
+char id=84 x=286 y=233 width=33 height=40 xoffset=0 yoffset=11 xadvance=33 page=0 chnl=15
+char id=85 x=477 y=102 width=32 height=41 xoffset=4 yoffset=11 xadvance=40 page=0 chnl=15
+char id=86 x=0 y=239 width=37 height=40 xoffset=0 yoffset=11 xadvance=37 page=0 chnl=15
+char id=87 x=291 y=191 width=54 height=40 xoffset=0 yoffset=11 xadvance=54 page=0 chnl=15
+char id=88 x=111 y=238 width=35 height=40 xoffset=0 yoffset=11 xadvance=35 page=0 chnl=15
+char id=89 x=75 y=239 width=35 height=40 xoffset=0 yoffset=11 xadvance=35 page=0 chnl=15
+char id=90 x=320 y=232 width=33 height=40 xoffset=0 yoffset=11 xadvance=34 page=0 chnl=15
+char id=91 x=329 y=53 width=12 height=51 xoffset=3 yoffset=11 xadvance=15 page=0 chnl=15
+char id=92 x=44 y=321 width=17 height=40 xoffset=-1 yoffset=11 xadvance=15 page=0 chnl=15
+char id=93 x=316 y=53 width=12 height=51 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
+char id=94 x=248 y=391 width=22 height=21 xoffset=1 yoffset=11 xadvance=24 page=0 chnl=15
+char id=95 x=76 y=424 width=34 height=5 xoffset=-2 yoffset=57 xadvance=31 page=0 chnl=15
+char id=96 x=29 y=428 width=11 height=8 xoffset=2 yoffset=11 xadvance=18 page=0 chnl=15
+char id=97 x=241 y=360 width=28 height=30 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
+char id=98 x=389 y=272 width=27 height=40 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
+char id=99 x=297 y=355 width=26 height=30 xoffset=2 yoffset=21 xadvance=28 page=0 chnl=15
+char id=100 x=305 y=274 width=27 height=40 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=15
+char id=101 x=212 y=360 width=28 height=30 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
+char id=102 x=25 y=321 width=18 height=40 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
+char id=103 x=56 y=197 width=27 height=41 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
+char id=104 x=471 y=270 width=25 height=40 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
+char id=105 x=96 y=321 width=7 height=40 xoffset=2 yoffset=11 xadvance=11 page=0 chnl=15
+char id=106 x=302 y=53 width=13 height=51 xoffset=-3 yoffset=11 xadvance=13 page=0 chnl=15
+char id=107 x=485 y=229 width=25 height=40 xoffset=3 yoffset=11 xadvance=28 page=0 chnl=15
+char id=108 x=80 y=321 width=7 height=40 xoffset=2 yoffset=11 xadvance=11 page=0 chnl=15
+char id=109 x=140 y=361 width=41 height=30 xoffset=3 yoffset=21 xadvance=47 page=0 chnl=15
+char id=110 x=324 y=355 width=25 height=30 xoffset=3 yoffset=21 xadvance=31 page=0 chnl=15
+char id=111 x=182 y=360 width=29 height=30 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
+char id=112 x=0 y=197 width=27 height=41 xoffset=3 yoffset=21 xadvance=31 page=0 chnl=15
+char id=113 x=28 y=197 width=27 height=41 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
+char id=114 x=350 y=354 width=16 height=30 xoffset=3 yoffset=21 xadvance=18 page=0 chnl=15
+char id=115 x=270 y=360 width=26 height=30 xoffset=1 yoffset=21 xadvance=28 page=0 chnl=15
+char id=116 x=386 y=313 width=15 height=39 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
+char id=117 x=0 y=401 width=25 height=29 xoffset=3 yoffset=22 xadvance=31 page=0 chnl=15
+char id=118 x=435 y=352 width=27 height=29 xoffset=1 yoffset=22 xadvance=29 page=0 chnl=15
+char id=119 x=367 y=354 width=39 height=29 xoffset=0 yoffset=22 xadvance=39 page=0 chnl=15
+char id=120 x=463 y=350 width=27 height=29 xoffset=0 yoffset=22 xadvance=27 page=0 chnl=15
+char id=121 x=361 y=272 width=27 height=40 xoffset=0 yoffset=22 xadvance=27 page=0 chnl=15
+char id=122 x=407 y=352 width=27 height=29 xoffset=0 yoffset=22 xadvance=27 page=0 chnl=15
+char id=123 x=254 y=53 width=17 height=51 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
+char id=124 x=337 y=0 width=6 height=52 xoffset=4 yoffset=11 xadvance=14 page=0 chnl=15
+char id=125 x=236 y=53 width=17 height=51 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=15
+char id=126 x=0 y=431 width=28 height=10 xoffset=2 yoffset=27 xadvance=32 page=0 chnl=15
+char id=160 x=508 y=0 width=3 height=1 xoffset=-1 yoffset=62 xadvance=15 page=0 chnl=15
+char id=161 x=104 y=321 width=7 height=40 xoffset=5 yoffset=22 xadvance=17 page=0 chnl=15
+char id=162 x=161 y=53 width=27 height=51 xoffset=2 yoffset=11 xadvance=31 page=0 chnl=15
+char id=163 x=127 y=279 width=30 height=40 xoffset=0 yoffset=11 xadvance=31 page=0 chnl=15
+char id=164 x=165 y=392 width=28 height=24 xoffset=1 yoffset=20 xadvance=31 page=0 chnl=15
+char id=165 x=354 y=231 width=32 height=40 xoffset=-1 yoffset=11 xadvance=31 page=0 chnl=15
+char id=166 x=344 y=0 width=6 height=52 xoffset=4 yoffset=11 xadvance=14 page=0 chnl=15
+char id=167 x=189 y=53 width=27 height=51 xoffset=2 yoffset=11 xadvance=31 page=0 chnl=15
+char id=168 x=111 y=423 width=16 height=5 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
+char id=169 x=137 y=154 width=43 height=41 xoffset=-1 yoffset=10 xadvance=41 page=0 chnl=15
+char id=170 x=292 y=391 width=19 height=20 xoffset=0 yoffset=11 xadvance=20 page=0 chnl=15
+char id=171 x=113 y=393 width=25 height=25 xoffset=3 yoffset=24 xadvance=31 page=0 chnl=15
+char id=172 x=399 y=384 width=28 height=16 xoffset=2 yoffset=24 xadvance=32 page=0 chnl=15
+char id=173 x=145 y=419 width=16 height=5 xoffset=1 yoffset=34 xadvance=18 page=0 chnl=15
+char id=174 x=181 y=154 width=43 height=41 xoffset=-1 yoffset=10 xadvance=41 page=0 chnl=15
+char id=175 x=41 y=428 width=34 height=5 xoffset=-2 yoffset=4 xadvance=30 page=0 chnl=15
+char id=176 x=428 y=382 width=16 height=15 xoffset=3 yoffset=11 xadvance=22 page=0 chnl=15
+char id=177 x=34 y=362 width=28 height=33 xoffset=1 yoffset=18 xadvance=30 page=0 chnl=15
+char id=178 x=312 y=386 width=18 height=20 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=15
+char id=179 x=331 y=386 width=18 height=20 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=15
+char id=180 x=492 y=380 width=11 height=8 xoffset=5 yoffset=12 xadvance=18 page=0 chnl=15
+char id=181 x=0 y=321 width=24 height=40 xoffset=4 yoffset=22 xadvance=32 page=0 chnl=15
+char id=182 x=439 y=52 width=32 height=50 xoffset=-1 yoffset=11 xadvance=30 page=0 chnl=15
+char id=183 x=504 y=371 width=7 height=5 xoffset=5 yoffset=29 xadvance=18 page=0 chnl=15
+char id=184 x=478 y=380 width=13 height=11 xoffset=2 yoffset=51 xadvance=18 page=0 chnl=15
+char id=185 x=499 y=350 width=12 height=20 xoffset=2 yoffset=11 xadvance=18 page=0 chnl=15
+char id=186 x=271 y=391 width=20 height=20 xoffset=0 yoffset=11 xadvance=20 page=0 chnl=15
+char id=187 x=139 y=393 width=25 height=25 xoffset=3 yoffset=24 xadvance=31 page=0 chnl=15
+char id=188 x=47 y=155 width=44 height=41 xoffset=2 yoffset=11 xadvance=46 page=0 chnl=15
+char id=189 x=92 y=154 width=44 height=41 xoffset=2 yoffset=11 xadvance=46 page=0 chnl=15
+char id=190 x=0 y=155 width=46 height=41 xoffset=0 yoffset=11 xadvance=46 page=0 chnl=15
+char id=191 x=276 y=274 width=28 height=40 xoffset=3 yoffset=22 xadvance=34 page=0 chnl=15
+char id=192 x=469 y=0 width=38 height=51 xoffset=-1 yoffset=0 xadvance=37 page=0 chnl=15
+char id=193 x=430 y=0 width=38 height=51 xoffset=-1 yoffset=0 xadvance=37 page=0 chnl=15
+char id=194 x=391 y=0 width=38 height=51 xoffset=-1 yoffset=0 xadvance=37 page=0 chnl=15
+char id=195 x=366 y=52 width=38 height=50 xoffset=-1 yoffset=1 xadvance=37 page=0 chnl=15
+char id=196 x=61 y=105 width=38 height=48 xoffset=-1 yoffset=3 xadvance=37 page=0 chnl=15
+char id=197 x=100 y=105 width=38 height=48 xoffset=-1 yoffset=3 xadvance=37 page=0 chnl=15
+char id=198 x=236 y=192 width=54 height=40 xoffset=-1 yoffset=11 xadvance=55 page=0 chnl=15
+char id=199 x=173 y=0 width=36 height=52 xoffset=2 yoffset=10 xadvance=40 page=0 chnl=15
+char id=200 x=37 y=53 width=31 height=51 xoffset=4 yoffset=0 xadvance=37 page=0 chnl=15
+char id=201 x=69 y=53 width=31 height=51 xoffset=4 yoffset=0 xadvance=37 page=0 chnl=15
+char id=202 x=101 y=53 width=31 height=51 xoffset=4 yoffset=0 xadvance=37 page=0 chnl=15
+char id=203 x=139 y=105 width=31 height=48 xoffset=4 yoffset=3 xadvance=37 page=0 chnl=15
+char id=204 x=354 y=52 width=11 height=51 xoffset=1 yoffset=0 xadvance=15 page=0 chnl=15
+char id=205 x=342 y=53 width=11 height=51 xoffset=3 yoffset=0 xadvance=15 page=0 chnl=15
+char id=206 x=217 y=53 width=18 height=51 xoffset=-1 yoffset=0 xadvance=15 page=0 chnl=15
+char id=207 x=171 y=105 width=16 height=48 xoffset=0 yoffset=3 xadvance=15 page=0 chnl=15
+char id=208 x=431 y=188 width=39 height=40 xoffset=-1 yoffset=11 xadvance=40 page=0 chnl=15
+char id=209 x=405 y=52 width=33 height=50 xoffset=3 yoffset=1 xadvance=40 page=0 chnl=15
+char id=210 x=53 y=0 width=39 height=52 xoffset=2 yoffset=0 xadvance=43 page=0 chnl=15
+char id=211 x=93 y=0 width=39 height=52 xoffset=2 yoffset=0 xadvance=43 page=0 chnl=15
+char id=212 x=133 y=0 width=39 height=52 xoffset=2 yoffset=0 xadvance=43 page=0 chnl=15
+char id=213 x=351 y=0 width=39 height=51 xoffset=2 yoffset=1 xadvance=43 page=0 chnl=15
+char id=214 x=472 y=52 width=39 height=49 xoffset=2 yoffset=3 xadvance=43 page=0 chnl=15
+char id=215 x=194 y=391 width=24 height=23 xoffset=4 yoffset=20 xadvance=32 page=0 chnl=15
+char id=216 x=257 y=105 width=40 height=43 xoffset=2 yoffset=10 xadvance=43 page=0 chnl=15
+char id=217 x=243 y=0 width=32 height=52 xoffset=4 yoffset=0 xadvance=40 page=0 chnl=15
+char id=218 x=276 y=0 width=32 height=52 xoffset=4 yoffset=0 xadvance=40 page=0 chnl=15
+char id=219 x=210 y=0 width=32 height=52 xoffset=4 yoffset=0 xadvance=40 page=0 chnl=15
+char id=220 x=0 y=105 width=32 height=49 xoffset=4 yoffset=3 xadvance=40 page=0 chnl=15
+char id=221 x=0 y=53 width=36 height=51 xoffset=-1 yoffset=0 xadvance=37 page=0 chnl=15
+char id=222 x=64 y=280 width=31 height=40 xoffset=4 yoffset=11 xadvance=37 page=0 chnl=15
+char id=223 x=96 y=280 width=30 height=40 xoffset=3 yoffset=11 xadvance=34 page=0 chnl=15
+char id=224 x=460 y=146 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=225 x=315 y=149 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=226 x=344 y=148 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=227 x=218 y=279 width=28 height=40 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=15
+char id=228 x=432 y=313 width=28 height=38 xoffset=1 yoffset=13 xadvance=31 page=0 chnl=15
+char id=229 x=298 y=105 width=28 height=43 xoffset=1 yoffset=8 xadvance=31 page=0 chnl=15
+char id=230 x=92 y=362 width=47 height=30 xoffset=1 yoffset=21 xadvance=49 page=0 chnl=15
+char id=231 x=84 y=197 width=26 height=41 xoffset=2 yoffset=21 xadvance=28 page=0 chnl=15
+char id=232 x=402 y=146 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=233 x=373 y=146 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=234 x=431 y=146 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=235 x=461 y=311 width=28 height=38 xoffset=1 yoffset=13 xadvance=31 page=0 chnl=15
+char id=236 x=225 y=192 width=10 height=41 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
+char id=237 x=213 y=196 width=11 height=41 xoffset=4 yoffset=10 xadvance=15 page=0 chnl=15
+char id=238 x=489 y=144 width=18 height=41 xoffset=-1 yoffset=10 xadvance=15 page=0 chnl=15
+char id=239 x=490 y=311 width=16 height=38 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15
+char id=240 x=158 y=279 width=29 height=40 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=15
+char id=241 x=445 y=270 width=25 height=40 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
+char id=242 x=285 y=149 width=29 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=243 x=225 y=150 width=29 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=244 x=255 y=150 width=29 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
+char id=245 x=188 y=279 width=29 height=40 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=15
+char id=246 x=402 y=313 width=29 height=38 xoffset=1 yoffset=13 xadvance=31 page=0 chnl=15
+char id=247 x=219 y=391 width=28 height=21 xoffset=1 yoffset=21 xadvance=30 page=0 chnl=15
+char id=248 x=63 y=362 width=28 height=32 xoffset=3 yoffset=20 xadvance=34 page=0 chnl=15
+char id=249 x=163 y=196 width=25 height=41 xoffset=3 yoffset=10 xadvance=31 page=0 chnl=15
+char id=250 x=137 y=196 width=25 height=41 xoffset=3 yoffset=10 xadvance=31 page=0 chnl=15
+char id=251 x=111 y=196 width=25 height=41 xoffset=3 yoffset=10 xadvance=31 page=0 chnl=15
+char id=252 x=0 y=362 width=25 height=38 xoffset=3 yoffset=13 xadvance=31 page=0 chnl=15
+char id=253 x=309 y=0 width=27 height=52 xoffset=0 yoffset=10 xadvance=28 page=0 chnl=15
+char id=254 x=133 y=53 width=27 height=51 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
+char id=255 x=33 y=105 width=27 height=49 xoffset=0 yoffset=13 xadvance=28 page=0 chnl=15
+kernings count=92
+kerning first=32 second=65 amount=-3
+kerning first=32 second=84 amount=-1
+kerning first=32 second=89 amount=-1
+kerning first=121 second=46 amount=-4
+kerning first=121 second=44 amount=-4
+kerning first=119 second=46 amount=-3
+kerning first=119 second=44 amount=-3
+kerning first=118 second=46 amount=-4
+kerning first=118 second=44 amount=-4
+kerning first=114 second=46 amount=-3
+kerning first=49 second=49 amount=-4
+kerning first=65 second=32 amount=-3
+kerning first=65 second=84 amount=-4
+kerning first=65 second=86 amount=-4
+kerning first=65 second=87 amount=-2
+kerning first=65 second=89 amount=-4
+kerning first=65 second=118 amount=-1
+kerning first=65 second=119 amount=-1
+kerning first=65 second=121 amount=-1
+kerning first=114 second=44 amount=-3
+kerning first=70 second=44 amount=-6
+kerning first=70 second=46 amount=-6
+kerning first=70 second=65 amount=-3
+kerning first=76 second=32 amount=-2
+kerning first=76 second=84 amount=-4
+kerning first=76 second=86 amount=-4
+kerning first=76 second=87 amount=-4
+kerning first=76 second=89 amount=-4
+kerning first=76 second=121 amount=-2
+kerning first=102 second=102 amount=-1
+kerning first=80 second=32 amount=-1
+kerning first=80 second=44 amount=-7
+kerning first=80 second=46 amount=-7
+kerning first=80 second=65 amount=-4
+kerning first=82 second=84 amount=-1
+kerning first=82 second=86 amount=-1
+kerning first=82 second=87 amount=-1
+kerning first=82 second=89 amount=-1
+kerning first=84 second=32 amount=-1
+kerning first=84 second=44 amount=-6
+kerning first=84 second=45 amount=-3
+kerning first=84 second=46 amount=-6
+kerning first=84 second=58 amount=-6
+kerning first=89 second=118 amount=-3
+kerning first=84 second=65 amount=-4
+kerning first=84 second=79 amount=-1
+kerning first=84 second=97 amount=-6
+kerning first=84 second=99 amount=-6
+kerning first=84 second=101 amount=-6
+kerning first=84 second=105 amount=-2
+kerning first=84 second=111 amount=-6
+kerning first=84 second=114 amount=-2
+kerning first=84 second=115 amount=-6
+kerning first=84 second=117 amount=-2
+kerning first=84 second=119 amount=-3
+kerning first=84 second=121 amount=-3
+kerning first=86 second=44 amount=-5
+kerning first=86 second=45 amount=-3
+kerning first=86 second=46 amount=-5
+kerning first=86 second=58 amount=-2
+kerning first=89 second=117 amount=-3
+kerning first=86 second=65 amount=-4
+kerning first=86 second=97 amount=-4
+kerning first=86 second=101 amount=-3
+kerning first=86 second=105 amount=-1
+kerning first=86 second=111 amount=-3
+kerning first=86 second=114 amount=-2
+kerning first=86 second=117 amount=-2
+kerning first=86 second=121 amount=-2
+kerning first=87 second=44 amount=-3
+kerning first=87 second=45 amount=-1
+kerning first=87 second=46 amount=-3
+kerning first=87 second=58 amount=-1
+kerning first=89 second=113 amount=-5
+kerning first=87 second=65 amount=-2
+kerning first=87 second=97 amount=-2
+kerning first=87 second=101 amount=-1
+kerning first=89 second=112 amount=-4
+kerning first=87 second=111 amount=-1
+kerning first=87 second=114 amount=-1
+kerning first=87 second=117 amount=-1
+kerning first=87 second=121 amount=-1
+kerning first=89 second=32 amount=-1
+kerning first=89 second=44 amount=-7
+kerning first=89 second=45 amount=-5
+kerning first=89 second=46 amount=-7
+kerning first=89 second=58 amount=-3
+kerning first=89 second=111 amount=-5
+kerning first=89 second=65 amount=-4
+kerning first=89 second=97 amount=-4
+kerning first=89 second=101 amount=-5
+kerning first=89 second=105 amount=-2
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/arial64_0.png b/External tools/Myra.1.2.1.0/Assets/fonts/arial64_0.png
new file mode 100644
index 0000000..ddb24df
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Assets/fonts/arial64_0.png differ
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/calibri32.fnt b/External tools/Myra.1.2.1.0/Assets/fonts/calibri32.fnt
new file mode 100644
index 0000000..32e8475
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Assets/fonts/calibri32.fnt
@@ -0,0 +1,985 @@
+info face="Calibri" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=32 base=25 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="calibri32_0.png"
+chars count=193
+char id=0 x=254 y=0 width=0 height=1 xoffset=0 yoffset=31 xadvance=0 page=0 chnl=15
+char id=13 x=253 y=0 width=0 height=1 xoffset=0 yoffset=31 xadvance=0 page=0 chnl=15
+char id=32 x=247 y=41 width=3 height=1 xoffset=-1 yoffset=31 xadvance=6 page=0 chnl=15
+char id=33 x=216 y=62 width=4 height=18 xoffset=3 yoffset=7 xadvance=8 page=0 chnl=15
+char id=34 x=202 y=146 width=8 height=7 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15
+char id=35 x=238 y=97 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=36 x=79 y=0 width=12 height=22 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15
+char id=37 x=226 y=62 width=18 height=17 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=15
+char id=38 x=112 y=45 width=16 height=18 xoffset=1 yoffset=7 xadvance=18 page=0 chnl=15
+char id=39 x=217 y=146 width=4 height=7 xoffset=1 yoffset=7 xadvance=6 page=0 chnl=15
+char id=40 x=39 y=0 width=6 height=23 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=41 x=46 y=0 width=6 height=23 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=42 x=126 y=148 width=11 height=10 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15
+char id=43 x=181 y=133 width=13 height=12 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15
+char id=44 x=211 y=146 width=5 height=7 xoffset=0 yoffset=22 xadvance=6 page=0 chnl=15
+char id=45 x=68 y=166 width=8 height=2 xoffset=0 yoffset=17 xadvance=8 page=0 chnl=15
+char id=46 x=29 y=168 width=4 height=3 xoffset=1 yoffset=22 xadvance=7 page=0 chnl=15
+char id=47 x=26 y=0 width=12 height=23 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=15
+char id=48 x=210 y=99 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=49 x=209 y=116 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=50 x=185 y=116 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=51 x=233 y=116 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=52 x=196 y=99 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=53 x=81 y=120 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=54 x=42 y=121 width=12 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=55 x=94 y=120 width=12 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=56 x=140 y=100 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=57 x=107 y=118 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=58 x=84 y=151 width=4 height=12 xoffset=2 yoffset=13 xadvance=7 page=0 chnl=15
+char id=59 x=248 y=79 width=6 height=16 xoffset=0 yoffset=13 xadvance=7 page=0 chnl=15
+char id=60 x=221 y=133 width=12 height=12 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15
+char id=61 x=189 y=146 width=12 height=7 xoffset=0 yoffset=14 xadvance=13 page=0 chnl=15
+char id=62 x=208 y=133 width=12 height=12 xoffset=1 yoffset=12 xadvance=13 page=0 chnl=15
+char id=63 x=103 y=64 width=11 height=18 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15
+char id=64 x=37 y=46 width=21 height=19 xoffset=1 yoffset=9 xadvance=23 page=0 chnl=15
+char id=65 x=232 y=80 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15
+char id=66 x=14 y=121 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
+char id=67 x=0 y=121 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
+char id=68 x=64 y=103 width=15 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15
+char id=69 x=0 y=138 width=10 height=16 xoffset=2 yoffset=9 xadvance=13 page=0 chnl=15
+char id=70 x=197 y=116 width=11 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15
+char id=71 x=48 y=104 width=15 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15
+char id=72 x=95 y=101 width=14 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15
+char id=73 x=252 y=96 width=3 height=16 xoffset=2 yoffset=9 xadvance=7 page=0 chnl=15
+char id=74 x=20 y=138 width=8 height=16 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=15
+char id=75 x=120 y=118 width=12 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15
+char id=76 x=245 y=62 width=10 height=16 xoffset=1 yoffset=9 xadvance=11 page=0 chnl=15
+char id=77 x=177 y=82 width=20 height=16 xoffset=1 yoffset=9 xadvance=22 page=0 chnl=15
+char id=78 x=0 y=104 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15
+char id=79 x=215 y=82 width=16 height=16 xoffset=0 yoffset=9 xadvance=17 page=0 chnl=15
+char id=80 x=146 y=117 width=12 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=81 x=93 y=45 width=18 height=18 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15
+char id=82 x=224 y=99 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
+char id=83 x=159 y=117 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+char id=84 x=168 y=99 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=85 x=32 y=104 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15
+char id=86 x=16 y=104 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15
+char id=87 x=132 y=83 width=23 height=16 xoffset=0 yoffset=9 xadvance=23 page=0 chnl=15
+char id=88 x=80 y=103 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15
+char id=89 x=28 y=121 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=90 x=172 y=116 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+char id=91 x=123 y=0 width=6 height=22 xoffset=2 yoffset=7 xadvance=8 page=0 chnl=15
+char id=92 x=92 y=0 width=12 height=22 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=15
+char id=93 x=130 y=0 width=6 height=22 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15
+char id=94 x=177 y=147 width=11 height=9 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=95 x=34 y=168 width=15 height=2 xoffset=-1 yoffset=28 xadvance=13 page=0 chnl=15
+char id=96 x=15 y=168 width=6 height=4 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=97 x=26 y=155 width=11 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15
+char id=98 x=216 y=43 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=99 x=50 y=154 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15
+char id=100 x=229 y=43 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=101 x=0 y=155 width=12 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15
+char id=102 x=187 y=63 width=9 height=18 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15
+char id=103 x=107 y=83 width=12 height=17 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15
+char id=104 x=52 y=66 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=105 x=29 y=138 width=4 height=16 xoffset=1 yoffset=9 xadvance=6 page=0 chnl=15
+char id=106 x=193 y=22 width=6 height=21 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=15
+char id=107 x=127 y=64 width=11 height=18 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15
+char id=108 x=211 y=63 width=4 height=18 xoffset=1 yoffset=7 xadvance=6 page=0 chnl=15
+char id=109 x=112 y=135 width=19 height=12 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15
+char id=110 x=13 y=155 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
+char id=111 x=152 y=134 width=14 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15
+char id=112 x=81 y=83 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
+char id=113 x=94 y=83 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
+char id=114 x=247 y=131 width=8 height=12 xoffset=1 yoffset=13 xadvance=9 page=0 chnl=15
+char id=115 x=73 y=151 width=10 height=12 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15
+char id=116 x=48 y=138 width=9 height=15 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15
+char id=117 x=234 y=133 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
+char id=118 x=195 y=133 width=12 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15
+char id=119 x=132 y=135 width=19 height=12 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15
+char id=120 x=38 y=154 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15
+char id=121 x=68 y=85 width=12 height=17 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15
+char id=122 x=62 y=153 width=10 height=12 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15
+char id=123 x=114 y=0 width=8 height=22 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15
+char id=124 x=53 y=0 width=4 height=23 xoffset=4 yoffset=7 xadvance=12 page=0 chnl=15
+char id=125 x=105 y=0 width=8 height=22 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=126 x=236 y=146 width=13 height=5 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=160 x=251 y=41 width=3 height=1 xoffset=-1 yoffset=31 xadvance=6 page=0 chnl=15
+char id=161 x=221 y=62 width=4 height=18 xoffset=2 yoffset=10 xadvance=8 page=0 chnl=15
+char id=162 x=245 y=114 width=10 height=16 xoffset=2 yoffset=9 xadvance=13 page=0 chnl=15
+char id=163 x=154 y=100 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=164 x=58 y=138 width=13 height=14 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15
+char id=165 x=182 y=99 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=166 x=58 y=0 width=3 height=23 xoffset=5 yoffset=7 xadvance=13 page=0 chnl=15
+char id=167 x=137 y=22 width=11 height=21 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15
+char id=168 x=77 y=164 width=8 height=2 xoffset=1 yoffset=9 xadvance=10 page=0 chnl=15
+char id=169 x=73 y=45 width=19 height=18 xoffset=1 yoffset=7 xadvance=22 page=0 chnl=15
+char id=170 x=82 y=137 width=8 height=13 xoffset=1 yoffset=9 xadvance=10 page=0 chnl=15
+char id=171 x=114 y=148 width=11 height=11 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15
+char id=172 x=222 y=146 width=13 height=5 xoffset=0 yoffset=17 xadvance=13 page=0 chnl=15
+char id=173 x=50 y=167 width=8 height=2 xoffset=0 yoffset=17 xadvance=8 page=0 chnl=15
+char id=174 x=138 y=148 width=11 height=10 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15
+char id=175 x=59 y=167 width=8 height=2 xoffset=1 yoffset=8 xadvance=10 page=0 chnl=15
+char id=176 x=0 y=168 width=7 height=5 xoffset=1 yoffset=8 xadvance=9 page=0 chnl=15
+char id=177 x=34 y=138 width=13 height=15 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
+char id=178 x=150 y=148 width=9 height=10 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
+char id=179 x=160 y=147 width=9 height=10 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
+char id=180 x=22 y=168 width=6 height=4 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
+char id=181 x=53 y=85 width=14 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
+char id=182 x=59 y=46 width=13 height=19 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15
+char id=183 x=250 y=144 width=5 height=3 xoffset=1 yoffset=16 xadvance=7 page=0 chnl=15
+char id=184 x=8 y=168 width=6 height=5 xoffset=1 yoffset=25 xadvance=8 page=0 chnl=15
+char id=185 x=170 y=147 width=6 height=10 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15
+char id=186 x=72 y=137 width=9 height=13 xoffset=1 yoffset=9 xadvance=11 page=0 chnl=15
+char id=187 x=89 y=151 width=12 height=11 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15
+char id=188 x=36 y=86 width=16 height=17 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=15
+char id=189 x=18 y=86 width=17 height=17 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=15
+char id=190 x=0 y=86 width=17 height=17 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=15
+char id=191 x=91 y=64 width=11 height=18 xoffset=0 yoffset=10 xadvance=12 page=0 chnl=15
+char id=192 x=48 y=24 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
+char id=193 x=64 y=23 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
+char id=194 x=32 y=24 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
+char id=195 x=16 y=24 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
+char id=196 x=0 y=46 width=15 height=20 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15
+char id=197 x=0 y=24 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
+char id=198 x=156 y=82 width=20 height=16 xoffset=-1 yoffset=9 xadvance=20 page=0 chnl=15
+char id=199 x=110 y=23 width=13 height=21 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
+char id=200 x=149 y=22 width=10 height=21 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=15
+char id=201 x=182 y=22 width=10 height=21 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=15
+char id=202 x=171 y=22 width=10 height=21 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=15
+char id=203 x=16 y=46 width=10 height=20 xoffset=2 yoffset=5 xadvance=13 page=0 chnl=15
+char id=204 x=207 y=22 width=6 height=21 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15
+char id=205 x=200 y=22 width=6 height=21 xoffset=2 yoffset=4 xadvance=7 page=0 chnl=15
+char id=206 x=160 y=22 width=10 height=21 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15
+char id=207 x=27 y=46 width=9 height=20 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=15
+char id=208 x=198 y=82 width=16 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15
+char id=209 x=237 y=0 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15
+char id=210 x=171 y=0 width=16 height=21 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=15
+char id=211 x=154 y=0 width=16 height=21 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=15
+char id=212 x=137 y=0 width=16 height=21 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=15
+char id=213 x=188 y=0 width=16 height=21 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=15
+char id=214 x=214 y=22 width=16 height=20 xoffset=0 yoffset=5 xadvance=17 page=0 chnl=15
+char id=215 x=102 y=150 width=11 height=11 xoffset=1 yoffset=12 xadvance=13 page=0 chnl=15
+char id=216 x=62 y=0 width=16 height=22 xoffset=1 yoffset=6 xadvance=17 page=0 chnl=15
+char id=217 x=221 y=0 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15
+char id=218 x=80 y=23 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15
+char id=219 x=205 y=0 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15
+char id=220 x=231 y=22 width=15 height=20 xoffset=1 yoffset=5 xadvance=17 page=0 chnl=15
+char id=221 x=96 y=23 width=13 height=21 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15
+char id=222 x=55 y=121 width=12 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
+char id=223 x=189 y=44 width=13 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=224 x=115 y=64 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
+char id=225 x=175 y=63 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
+char id=226 x=163 y=63 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
+char id=227 x=151 y=63 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
+char id=228 x=221 y=116 width=11 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+char id=229 x=139 y=64 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
+char id=230 x=91 y=137 width=20 height=12 xoffset=0 yoffset=13 xadvance=20 page=0 chnl=15
+char id=231 x=120 y=83 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15
+char id=232 x=0 y=67 width=12 height=18 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15
+char id=233 x=13 y=67 width=12 height=18 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15
+char id=234 x=26 y=67 width=12 height=18 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15
+char id=235 x=68 y=120 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=236 x=197 y=63 width=6 height=18 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=15
+char id=237 x=204 y=63 width=6 height=18 xoffset=1 yoffset=7 xadvance=6 page=0 chnl=15
+char id=238 x=247 y=22 width=8 height=18 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=15
+char id=239 x=11 y=138 width=8 height=16 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=15
+char id=240 x=39 y=66 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=241 x=242 y=43 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=242 x=144 y=44 width=14 height=18 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15
+char id=243 x=129 y=45 width=14 height=18 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15
+char id=244 x=174 y=44 width=14 height=18 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15
+char id=245 x=159 y=44 width=14 height=18 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15
+char id=246 x=110 y=101 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15
+char id=247 x=167 y=134 width=13 height=12 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15
+char id=248 x=125 y=101 width=14 height=16 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
+char id=249 x=65 y=66 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=250 x=78 y=64 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=251 x=203 y=44 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=252 x=133 y=118 width=12 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
+char id=253 x=0 y=0 width=12 height=23 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
+char id=254 x=13 y=0 width=12 height=23 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
+char id=255 x=124 y=23 width=12 height=21 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
+kernings count=787
+kerning first=179 second=47 amount=-4
+kerning first=178 second=47 amount=-4
+kerning first=185 second=47 amount=-4
+kerning first=40 second=106 amount=1
+kerning first=47 second=179 amount=-3
+kerning first=47 second=178 amount=-3
+kerning first=47 second=185 amount=-2
+kerning first=47 second=198 amount=-1
+kerning first=47 second=197 amount=-1
+kerning first=47 second=196 amount=-1
+kerning first=47 second=195 amount=-1
+kerning first=47 second=194 amount=-1
+kerning first=47 second=193 amount=-1
+kerning first=47 second=192 amount=-1
+kerning first=47 second=65 amount=-1
+kerning first=46 second=255 amount=-1
+kerning first=46 second=253 amount=-1
+kerning first=46 second=121 amount=-1
+kerning first=46 second=119 amount=-1
+kerning first=46 second=118 amount=-1
+kerning first=46 second=116 amount=-1
+kerning first=46 second=102 amount=-1
+kerning first=46 second=221 amount=-2
+kerning first=46 second=89 amount=-2
+kerning first=65 second=84 amount=-2
+kerning first=46 second=87 amount=-2
+kerning first=46 second=86 amount=-2
+kerning first=46 second=84 amount=-2
+kerning first=44 second=116 amount=-1
+kerning first=44 second=221 amount=-2
+kerning first=44 second=89 amount=-2
+kerning first=44 second=87 amount=-2
+kerning first=44 second=86 amount=-2
+kerning first=44 second=84 amount=-2
+kerning first=191 second=255 amount=-1
+kerning first=191 second=253 amount=-1
+kerning first=191 second=121 amount=-1
+kerning first=191 second=119 amount=-1
+kerning first=65 second=86 amount=-1
+kerning first=65 second=87 amount=-1
+kerning first=191 second=118 amount=-1
+kerning first=191 second=102 amount=-1
+kerning first=191 second=221 amount=-1
+kerning first=191 second=89 amount=-1
+kerning first=65 second=89 amount=-2
+kerning first=191 second=86 amount=-1
+kerning first=65 second=221 amount=-2
+kerning first=191 second=84 amount=-1
+kerning first=122 second=113 amount=-1
+kerning first=65 second=116 amount=-1
+kerning first=122 second=248 amount=-1
+kerning first=122 second=246 amount=-1
+kerning first=122 second=245 amount=-1
+kerning first=65 second=121 amount=-1
+kerning first=122 second=244 amount=-1
+kerning first=65 second=253 amount=-1
+kerning first=122 second=243 amount=-1
+kerning first=65 second=255 amount=-1
+kerning first=65 second=63 amount=-1
+kerning first=122 second=242 amount=-1
+kerning first=122 second=111 amount=-1
+kerning first=122 second=235 amount=-1
+kerning first=122 second=234 amount=-1
+kerning first=122 second=233 amount=-1
+kerning first=122 second=232 amount=-1
+kerning first=122 second=101 amount=-1
+kerning first=122 second=100 amount=-1
+kerning first=122 second=231 amount=-1
+kerning first=122 second=99 amount=-1
+kerning first=255 second=46 amount=-2
+kerning first=255 second=44 amount=-2
+kerning first=253 second=46 amount=-2
+kerning first=253 second=44 amount=-2
+kerning first=121 second=46 amount=-2
+kerning first=121 second=44 amount=-2
+kerning first=120 second=113 amount=-1
+kerning first=120 second=248 amount=-1
+kerning first=120 second=246 amount=-1
+kerning first=120 second=245 amount=-1
+kerning first=120 second=244 amount=-1
+kerning first=120 second=243 amount=-1
+kerning first=120 second=242 amount=-1
+kerning first=120 second=111 amount=-1
+kerning first=120 second=235 amount=-1
+kerning first=120 second=234 amount=-1
+kerning first=120 second=233 amount=-1
+kerning first=120 second=232 amount=-1
+kerning first=120 second=101 amount=-1
+kerning first=120 second=100 amount=-1
+kerning first=120 second=231 amount=-1
+kerning first=120 second=99 amount=-1
+kerning first=119 second=46 amount=-2
+kerning first=119 second=44 amount=-2
+kerning first=118 second=46 amount=-2
+kerning first=118 second=44 amount=-2
+kerning first=223 second=255 amount=-1
+kerning first=223 second=253 amount=-1
+kerning first=223 second=121 amount=-1
+kerning first=114 second=46 amount=-3
+kerning first=114 second=44 amount=-2
+kerning first=114 second=230 amount=-1
+kerning first=114 second=229 amount=-1
+kerning first=114 second=228 amount=-1
+kerning first=114 second=227 amount=-1
+kerning first=114 second=226 amount=-1
+kerning first=114 second=225 amount=-1
+kerning first=114 second=224 amount=-1
+kerning first=114 second=97 amount=-1
+kerning first=254 second=120 amount=-1
+kerning first=112 second=120 amount=-1
+kerning first=248 second=120 amount=-1
+kerning first=246 second=120 amount=-1
+kerning first=245 second=120 amount=-1
+kerning first=244 second=120 amount=-1
+kerning first=243 second=120 amount=-1
+kerning first=242 second=120 amount=-1
+kerning first=111 second=120 amount=-1
+kerning first=192 second=84 amount=-2
+kerning first=107 second=113 amount=-1
+kerning first=107 second=248 amount=-1
+kerning first=107 second=246 amount=-1
+kerning first=107 second=245 amount=-1
+kerning first=107 second=244 amount=-1
+kerning first=107 second=243 amount=-1
+kerning first=107 second=242 amount=-1
+kerning first=107 second=111 amount=-1
+kerning first=107 second=235 amount=-1
+kerning first=107 second=234 amount=-1
+kerning first=107 second=233 amount=-1
+kerning first=107 second=232 amount=-1
+kerning first=107 second=101 amount=-1
+kerning first=192 second=86 amount=-1
+kerning first=192 second=87 amount=-1
+kerning first=107 second=100 amount=-1
+kerning first=107 second=231 amount=-1
+kerning first=107 second=99 amount=-1
+kerning first=103 second=47 amount=1
+kerning first=192 second=89 amount=-2
+kerning first=102 second=46 amount=-2
+kerning first=192 second=221 amount=-2
+kerning first=102 second=44 amount=-2
+kerning first=102 second=113 amount=-1
+kerning first=192 second=116 amount=-1
+kerning first=102 second=248 amount=-1
+kerning first=102 second=246 amount=-1
+kerning first=102 second=245 amount=-1
+kerning first=192 second=121 amount=-1
+kerning first=102 second=244 amount=-1
+kerning first=192 second=253 amount=-1
+kerning first=102 second=243 amount=-1
+kerning first=192 second=255 amount=-1
+kerning first=192 second=63 amount=-1
+kerning first=102 second=242 amount=-1
+kerning first=102 second=111 amount=-1
+kerning first=102 second=103 amount=-1
+kerning first=102 second=235 amount=-1
+kerning first=102 second=234 amount=-1
+kerning first=102 second=233 amount=-1
+kerning first=102 second=232 amount=-1
+kerning first=102 second=101 amount=-1
+kerning first=102 second=100 amount=-1
+kerning first=102 second=231 amount=-1
+kerning first=102 second=99 amount=-1
+kerning first=102 second=230 amount=-1
+kerning first=102 second=229 amount=-1
+kerning first=102 second=228 amount=-1
+kerning first=102 second=227 amount=-1
+kerning first=102 second=226 amount=-1
+kerning first=102 second=225 amount=-1
+kerning first=102 second=224 amount=-1
+kerning first=102 second=97 amount=-1
+kerning first=98 second=120 amount=-1
+kerning first=90 second=118 amount=-1
+kerning first=90 second=239 amount=1
+kerning first=90 second=238 amount=1
+kerning first=221 second=47 amount=-2
+kerning first=221 second=46 amount=-3
+kerning first=221 second=58 amount=-2
+kerning first=221 second=59 amount=-2
+kerning first=221 second=44 amount=-3
+kerning first=221 second=122 amount=-1
+kerning first=221 second=255 amount=-1
+kerning first=221 second=253 amount=-1
+kerning first=221 second=121 amount=-1
+kerning first=221 second=120 amount=-1
+kerning first=221 second=119 amount=-1
+kerning first=221 second=118 amount=-1
+kerning first=221 second=252 amount=-1
+kerning first=221 second=251 amount=-1
+kerning first=221 second=250 amount=-1
+kerning first=221 second=249 amount=-1
+kerning first=221 second=117 amount=-1
+kerning first=221 second=116 amount=-1
+kerning first=221 second=223 amount=-1
+kerning first=221 second=115 amount=-1
+kerning first=221 second=114 amount=-1
+kerning first=221 second=113 amount=-2
+kerning first=221 second=112 amount=-1
+kerning first=221 second=248 amount=-2
+kerning first=221 second=246 amount=-2
+kerning first=221 second=245 amount=-2
+kerning first=221 second=244 amount=-2
+kerning first=221 second=243 amount=-2
+kerning first=221 second=242 amount=-2
+kerning first=221 second=111 amount=-2
+kerning first=221 second=241 amount=-1
+kerning first=221 second=110 amount=-1
+kerning first=221 second=109 amount=-1
+kerning first=221 second=106 amount=-1
+kerning first=221 second=239 amount=1
+kerning first=193 second=84 amount=-2
+kerning first=221 second=238 amount=1
+kerning first=221 second=237 amount=-1
+kerning first=221 second=236 amount=1
+kerning first=221 second=103 amount=-2
+kerning first=221 second=102 amount=-1
+kerning first=221 second=235 amount=-2
+kerning first=221 second=234 amount=-2
+kerning first=221 second=233 amount=-2
+kerning first=221 second=232 amount=-2
+kerning first=221 second=101 amount=-2
+kerning first=221 second=100 amount=-2
+kerning first=221 second=231 amount=-2
+kerning first=221 second=99 amount=-2
+kerning first=193 second=86 amount=-1
+kerning first=193 second=87 amount=-1
+kerning first=221 second=230 amount=-2
+kerning first=221 second=229 amount=-2
+kerning first=221 second=228 amount=-2
+kerning first=221 second=227 amount=-2
+kerning first=193 second=89 amount=-2
+kerning first=221 second=226 amount=-2
+kerning first=193 second=221 amount=-2
+kerning first=221 second=225 amount=-2
+kerning first=221 second=224 amount=-2
+kerning first=193 second=116 amount=-1
+kerning first=221 second=97 amount=-2
+kerning first=221 second=81 amount=-1
+kerning first=221 second=214 amount=-1
+kerning first=193 second=121 amount=-1
+kerning first=221 second=213 amount=-1
+kerning first=193 second=253 amount=-1
+kerning first=221 second=212 amount=-1
+kerning first=193 second=255 amount=-1
+kerning first=193 second=63 amount=-1
+kerning first=221 second=211 amount=-1
+kerning first=221 second=210 amount=-1
+kerning first=221 second=79 amount=-1
+kerning first=221 second=74 amount=-1
+kerning first=221 second=71 amount=-1
+kerning first=221 second=199 amount=-1
+kerning first=221 second=67 amount=-1
+kerning first=221 second=198 amount=-2
+kerning first=221 second=197 amount=-2
+kerning first=221 second=196 amount=-2
+kerning first=221 second=195 amount=-2
+kerning first=221 second=194 amount=-2
+kerning first=221 second=193 amount=-2
+kerning first=221 second=192 amount=-2
+kerning first=221 second=65 amount=-2
+kerning first=89 second=47 amount=-2
+kerning first=89 second=46 amount=-3
+kerning first=89 second=58 amount=-2
+kerning first=89 second=59 amount=-2
+kerning first=89 second=44 amount=-3
+kerning first=89 second=122 amount=-1
+kerning first=89 second=255 amount=-1
+kerning first=89 second=253 amount=-1
+kerning first=89 second=121 amount=-1
+kerning first=89 second=120 amount=-1
+kerning first=89 second=119 amount=-1
+kerning first=89 second=118 amount=-1
+kerning first=89 second=252 amount=-1
+kerning first=89 second=251 amount=-1
+kerning first=89 second=250 amount=-1
+kerning first=89 second=249 amount=-1
+kerning first=89 second=117 amount=-1
+kerning first=89 second=116 amount=-1
+kerning first=89 second=223 amount=-1
+kerning first=89 second=115 amount=-1
+kerning first=89 second=114 amount=-1
+kerning first=89 second=113 amount=-2
+kerning first=89 second=112 amount=-1
+kerning first=89 second=248 amount=-2
+kerning first=89 second=246 amount=-2
+kerning first=89 second=245 amount=-2
+kerning first=89 second=244 amount=-2
+kerning first=89 second=243 amount=-2
+kerning first=89 second=242 amount=-2
+kerning first=89 second=111 amount=-2
+kerning first=89 second=241 amount=-1
+kerning first=89 second=110 amount=-1
+kerning first=89 second=109 amount=-1
+kerning first=89 second=106 amount=-1
+kerning first=89 second=239 amount=1
+kerning first=89 second=238 amount=1
+kerning first=89 second=237 amount=-1
+kerning first=89 second=236 amount=1
+kerning first=89 second=103 amount=-2
+kerning first=89 second=102 amount=-1
+kerning first=89 second=235 amount=-2
+kerning first=89 second=234 amount=-2
+kerning first=89 second=233 amount=-2
+kerning first=194 second=84 amount=-2
+kerning first=89 second=232 amount=-2
+kerning first=89 second=101 amount=-2
+kerning first=89 second=100 amount=-2
+kerning first=89 second=231 amount=-2
+kerning first=89 second=99 amount=-2
+kerning first=89 second=230 amount=-2
+kerning first=89 second=229 amount=-2
+kerning first=89 second=228 amount=-2
+kerning first=89 second=227 amount=-2
+kerning first=89 second=226 amount=-2
+kerning first=89 second=225 amount=-2
+kerning first=89 second=224 amount=-2
+kerning first=89 second=97 amount=-2
+kerning first=194 second=86 amount=-1
+kerning first=194 second=87 amount=-1
+kerning first=89 second=81 amount=-1
+kerning first=89 second=214 amount=-1
+kerning first=89 second=213 amount=-1
+kerning first=89 second=212 amount=-1
+kerning first=194 second=89 amount=-2
+kerning first=89 second=211 amount=-1
+kerning first=194 second=221 amount=-2
+kerning first=89 second=210 amount=-1
+kerning first=89 second=79 amount=-1
+kerning first=194 second=116 amount=-1
+kerning first=89 second=74 amount=-1
+kerning first=89 second=71 amount=-1
+kerning first=89 second=199 amount=-1
+kerning first=194 second=121 amount=-1
+kerning first=89 second=67 amount=-1
+kerning first=194 second=253 amount=-1
+kerning first=89 second=198 amount=-2
+kerning first=194 second=255 amount=-1
+kerning first=194 second=63 amount=-1
+kerning first=89 second=197 amount=-2
+kerning first=89 second=196 amount=-2
+kerning first=89 second=195 amount=-2
+kerning first=89 second=194 amount=-2
+kerning first=89 second=193 amount=-2
+kerning first=89 second=192 amount=-2
+kerning first=89 second=65 amount=-2
+kerning first=88 second=255 amount=-1
+kerning first=88 second=253 amount=-1
+kerning first=88 second=121 amount=-1
+kerning first=88 second=119 amount=-1
+kerning first=88 second=118 amount=-1
+kerning first=88 second=113 amount=-1
+kerning first=88 second=100 amount=-1
+kerning first=88 second=81 amount=-1
+kerning first=88 second=214 amount=-1
+kerning first=88 second=213 amount=-1
+kerning first=88 second=212 amount=-1
+kerning first=88 second=211 amount=-1
+kerning first=88 second=210 amount=-1
+kerning first=88 second=79 amount=-1
+kerning first=88 second=71 amount=-1
+kerning first=88 second=199 amount=-1
+kerning first=88 second=67 amount=-1
+kerning first=87 second=46 amount=-3
+kerning first=87 second=59 amount=-2
+kerning first=87 second=44 amount=-3
+kerning first=87 second=255 amount=-1
+kerning first=87 second=253 amount=-1
+kerning first=87 second=121 amount=-1
+kerning first=87 second=252 amount=-1
+kerning first=87 second=251 amount=-1
+kerning first=87 second=250 amount=-1
+kerning first=87 second=249 amount=-1
+kerning first=87 second=117 amount=-1
+kerning first=87 second=115 amount=-1
+kerning first=87 second=114 amount=-1
+kerning first=87 second=113 amount=-1
+kerning first=87 second=112 amount=-1
+kerning first=87 second=248 amount=-1
+kerning first=87 second=246 amount=-1
+kerning first=87 second=245 amount=-1
+kerning first=87 second=244 amount=-1
+kerning first=87 second=243 amount=-1
+kerning first=87 second=242 amount=-1
+kerning first=87 second=111 amount=-1
+kerning first=87 second=241 amount=-1
+kerning first=87 second=110 amount=-1
+kerning first=87 second=109 amount=-1
+kerning first=87 second=239 amount=1
+kerning first=87 second=103 amount=-1
+kerning first=87 second=235 amount=-1
+kerning first=87 second=234 amount=-1
+kerning first=87 second=233 amount=-1
+kerning first=87 second=232 amount=-1
+kerning first=87 second=101 amount=-1
+kerning first=87 second=100 amount=-1
+kerning first=87 second=231 amount=-1
+kerning first=195 second=84 amount=-2
+kerning first=87 second=99 amount=-1
+kerning first=87 second=230 amount=-1
+kerning first=87 second=229 amount=-1
+kerning first=87 second=228 amount=-1
+kerning first=87 second=227 amount=-1
+kerning first=87 second=226 amount=-1
+kerning first=87 second=225 amount=-1
+kerning first=87 second=224 amount=-1
+kerning first=87 second=97 amount=-1
+kerning first=87 second=74 amount=-1
+kerning first=87 second=198 amount=-2
+kerning first=87 second=197 amount=-1
+kerning first=87 second=196 amount=-1
+kerning first=195 second=86 amount=-1
+kerning first=195 second=87 amount=-1
+kerning first=87 second=195 amount=-1
+kerning first=87 second=194 amount=-1
+kerning first=87 second=193 amount=-1
+kerning first=87 second=192 amount=-1
+kerning first=195 second=89 amount=-2
+kerning first=87 second=65 amount=-1
+kerning first=195 second=221 amount=-2
+kerning first=86 second=47 amount=-1
+kerning first=86 second=46 amount=-3
+kerning first=195 second=116 amount=-1
+kerning first=86 second=58 amount=-1
+kerning first=86 second=59 amount=-1
+kerning first=86 second=44 amount=-2
+kerning first=195 second=121 amount=-1
+kerning first=86 second=122 amount=-1
+kerning first=195 second=253 amount=-1
+kerning first=86 second=252 amount=-1
+kerning first=195 second=255 amount=-1
+kerning first=195 second=63 amount=-1
+kerning first=86 second=251 amount=-1
+kerning first=86 second=250 amount=-1
+kerning first=86 second=249 amount=-1
+kerning first=86 second=117 amount=-1
+kerning first=86 second=115 amount=-1
+kerning first=86 second=114 amount=-1
+kerning first=86 second=113 amount=-1
+kerning first=86 second=112 amount=-1
+kerning first=86 second=248 amount=-1
+kerning first=86 second=246 amount=-1
+kerning first=86 second=245 amount=-1
+kerning first=86 second=244 amount=-1
+kerning first=86 second=243 amount=-1
+kerning first=86 second=242 amount=-1
+kerning first=86 second=111 amount=-1
+kerning first=86 second=241 amount=-1
+kerning first=86 second=110 amount=-1
+kerning first=86 second=109 amount=-1
+kerning first=86 second=239 amount=1
+kerning first=86 second=238 amount=1
+kerning first=86 second=236 amount=1
+kerning first=86 second=103 amount=-1
+kerning first=86 second=235 amount=-1
+kerning first=86 second=234 amount=-1
+kerning first=86 second=233 amount=-1
+kerning first=86 second=232 amount=-1
+kerning first=86 second=101 amount=-1
+kerning first=86 second=100 amount=-1
+kerning first=86 second=231 amount=-1
+kerning first=86 second=99 amount=-1
+kerning first=86 second=230 amount=-1
+kerning first=86 second=229 amount=-1
+kerning first=86 second=228 amount=-1
+kerning first=86 second=227 amount=-1
+kerning first=86 second=226 amount=-1
+kerning first=86 second=225 amount=-1
+kerning first=86 second=224 amount=-1
+kerning first=86 second=97 amount=-1
+kerning first=86 second=74 amount=-1
+kerning first=86 second=198 amount=-2
+kerning first=86 second=197 amount=-1
+kerning first=86 second=196 amount=-1
+kerning first=86 second=195 amount=-1
+kerning first=86 second=194 amount=-1
+kerning first=86 second=193 amount=-1
+kerning first=86 second=192 amount=-1
+kerning first=86 second=65 amount=-1
+kerning first=220 second=74 amount=-1
+kerning first=220 second=197 amount=-1
+kerning first=220 second=196 amount=-1
+kerning first=220 second=195 amount=-1
+kerning first=220 second=194 amount=-1
+kerning first=220 second=193 amount=-1
+kerning first=220 second=192 amount=-1
+kerning first=220 second=65 amount=-1
+kerning first=219 second=74 amount=-1
+kerning first=219 second=197 amount=-1
+kerning first=219 second=196 amount=-1
+kerning first=196 second=84 amount=-2
+kerning first=219 second=195 amount=-1
+kerning first=219 second=194 amount=-1
+kerning first=219 second=193 amount=-1
+kerning first=219 second=192 amount=-1
+kerning first=219 second=65 amount=-1
+kerning first=218 second=74 amount=-1
+kerning first=218 second=197 amount=-1
+kerning first=218 second=196 amount=-1
+kerning first=218 second=195 amount=-1
+kerning first=218 second=194 amount=-1
+kerning first=218 second=193 amount=-1
+kerning first=218 second=192 amount=-1
+kerning first=218 second=65 amount=-1
+kerning first=196 second=86 amount=-1
+kerning first=196 second=87 amount=-1
+kerning first=217 second=74 amount=-1
+kerning first=217 second=197 amount=-1
+kerning first=217 second=196 amount=-1
+kerning first=217 second=195 amount=-1
+kerning first=196 second=89 amount=-2
+kerning first=217 second=194 amount=-1
+kerning first=196 second=221 amount=-2
+kerning first=217 second=193 amount=-1
+kerning first=217 second=192 amount=-1
+kerning first=196 second=116 amount=-1
+kerning first=217 second=65 amount=-1
+kerning first=85 second=74 amount=-1
+kerning first=85 second=197 amount=-1
+kerning first=196 second=121 amount=-1
+kerning first=85 second=196 amount=-1
+kerning first=196 second=253 amount=-1
+kerning first=85 second=195 amount=-1
+kerning first=196 second=255 amount=-1
+kerning first=196 second=63 amount=-1
+kerning first=85 second=194 amount=-1
+kerning first=85 second=193 amount=-1
+kerning first=85 second=192 amount=-1
+kerning first=85 second=65 amount=-1
+kerning first=84 second=47 amount=-1
+kerning first=84 second=46 amount=-3
+kerning first=84 second=58 amount=-2
+kerning first=84 second=59 amount=-1
+kerning first=84 second=44 amount=-3
+kerning first=84 second=122 amount=-2
+kerning first=84 second=255 amount=-1
+kerning first=84 second=253 amount=-1
+kerning first=84 second=121 amount=-1
+kerning first=84 second=120 amount=-1
+kerning first=84 second=119 amount=-1
+kerning first=84 second=118 amount=-1
+kerning first=84 second=252 amount=-2
+kerning first=84 second=251 amount=-2
+kerning first=84 second=250 amount=-2
+kerning first=84 second=249 amount=-2
+kerning first=84 second=117 amount=-2
+kerning first=84 second=115 amount=-2
+kerning first=84 second=114 amount=-2
+kerning first=84 second=113 amount=-2
+kerning first=84 second=112 amount=-2
+kerning first=84 second=248 amount=-2
+kerning first=84 second=246 amount=-2
+kerning first=84 second=245 amount=-2
+kerning first=84 second=244 amount=-2
+kerning first=84 second=243 amount=-2
+kerning first=84 second=242 amount=-2
+kerning first=84 second=111 amount=-2
+kerning first=84 second=241 amount=-2
+kerning first=84 second=110 amount=-2
+kerning first=84 second=109 amount=-2
+kerning first=84 second=239 amount=1
+kerning first=84 second=238 amount=1
+kerning first=84 second=103 amount=-2
+kerning first=84 second=235 amount=-2
+kerning first=84 second=234 amount=-2
+kerning first=84 second=233 amount=-2
+kerning first=84 second=232 amount=-2
+kerning first=84 second=101 amount=-2
+kerning first=84 second=100 amount=-2
+kerning first=84 second=231 amount=-2
+kerning first=84 second=99 amount=-2
+kerning first=84 second=230 amount=-2
+kerning first=84 second=229 amount=-2
+kerning first=84 second=228 amount=-2
+kerning first=84 second=227 amount=-2
+kerning first=84 second=226 amount=-2
+kerning first=84 second=225 amount=-2
+kerning first=84 second=224 amount=-2
+kerning first=84 second=97 amount=-2
+kerning first=84 second=81 amount=-1
+kerning first=84 second=214 amount=-1
+kerning first=84 second=213 amount=-1
+kerning first=84 second=212 amount=-1
+kerning first=84 second=211 amount=-1
+kerning first=84 second=210 amount=-1
+kerning first=84 second=79 amount=-1
+kerning first=84 second=74 amount=-1
+kerning first=84 second=71 amount=-1
+kerning first=84 second=199 amount=-1
+kerning first=84 second=67 amount=-1
+kerning first=84 second=198 amount=-2
+kerning first=84 second=197 amount=-2
+kerning first=84 second=196 amount=-2
+kerning first=84 second=195 amount=-2
+kerning first=84 second=194 amount=-2
+kerning first=84 second=193 amount=-2
+kerning first=84 second=192 amount=-2
+kerning first=84 second=65 amount=-2
+kerning first=82 second=248 amount=-1
+kerning first=82 second=246 amount=-1
+kerning first=82 second=245 amount=-1
+kerning first=82 second=244 amount=-1
+kerning first=82 second=243 amount=-1
+kerning first=82 second=242 amount=-1
+kerning first=82 second=111 amount=-1
+kerning first=81 second=47 amount=2
+kerning first=81 second=59 amount=1
+kerning first=81 second=44 amount=1
+kerning first=81 second=106 amount=1
+kerning first=81 second=103 amount=1
+kerning first=81 second=221 amount=-1
+kerning first=81 second=89 amount=-1
+kerning first=81 second=84 amount=-1
+kerning first=81 second=74 amount=1
+kerning first=81 second=198 amount=1
+kerning first=80 second=47 amount=-1
+kerning first=80 second=46 amount=-3
+kerning first=80 second=44 amount=-3
+kerning first=80 second=248 amount=-1
+kerning first=80 second=246 amount=-1
+kerning first=80 second=245 amount=-1
+kerning first=80 second=244 amount=-1
+kerning first=80 second=243 amount=-1
+kerning first=80 second=242 amount=-1
+kerning first=80 second=111 amount=-1
+kerning first=80 second=235 amount=-1
+kerning first=80 second=234 amount=-1
+kerning first=80 second=233 amount=-1
+kerning first=80 second=232 amount=-1
+kerning first=80 second=101 amount=-1
+kerning first=80 second=231 amount=-1
+kerning first=80 second=99 amount=-1
+kerning first=80 second=230 amount=-1
+kerning first=80 second=229 amount=-1
+kerning first=80 second=228 amount=-1
+kerning first=80 second=227 amount=-1
+kerning first=80 second=226 amount=-1
+kerning first=80 second=225 amount=-1
+kerning first=80 second=224 amount=-1
+kerning first=80 second=97 amount=-1
+kerning first=80 second=74 amount=-2
+kerning first=80 second=198 amount=-2
+kerning first=80 second=197 amount=-2
+kerning first=80 second=196 amount=-2
+kerning first=80 second=195 amount=-2
+kerning first=80 second=194 amount=-2
+kerning first=80 second=193 amount=-2
+kerning first=80 second=192 amount=-2
+kerning first=80 second=65 amount=-2
+kerning first=214 second=44 amount=-1
+kerning first=214 second=221 amount=-1
+kerning first=214 second=89 amount=-1
+kerning first=214 second=88 amount=-1
+kerning first=214 second=84 amount=-1
+kerning first=213 second=44 amount=-1
+kerning first=213 second=221 amount=-1
+kerning first=213 second=89 amount=-1
+kerning first=213 second=88 amount=-1
+kerning first=213 second=84 amount=-1
+kerning first=212 second=44 amount=-1
+kerning first=212 second=221 amount=-1
+kerning first=212 second=89 amount=-1
+kerning first=212 second=88 amount=-1
+kerning first=212 second=84 amount=-1
+kerning first=211 second=44 amount=-1
+kerning first=211 second=221 amount=-1
+kerning first=211 second=89 amount=-1
+kerning first=211 second=88 amount=-1
+kerning first=211 second=84 amount=-1
+kerning first=210 second=44 amount=-1
+kerning first=210 second=221 amount=-1
+kerning first=210 second=89 amount=-1
+kerning first=210 second=88 amount=-1
+kerning first=210 second=84 amount=-1
+kerning first=79 second=44 amount=-1
+kerning first=79 second=221 amount=-1
+kerning first=79 second=89 amount=-1
+kerning first=79 second=88 amount=-1
+kerning first=79 second=84 amount=-1
+kerning first=76 second=255 amount=-1
+kerning first=76 second=253 amount=-1
+kerning first=76 second=121 amount=-1
+kerning first=76 second=119 amount=-1
+kerning first=76 second=118 amount=-1
+kerning first=76 second=221 amount=-2
+kerning first=76 second=89 amount=-2
+kerning first=76 second=87 amount=-2
+kerning first=76 second=86 amount=-2
+kerning first=76 second=220 amount=-1
+kerning first=76 second=219 amount=-1
+kerning first=76 second=218 amount=-1
+kerning first=76 second=217 amount=-1
+kerning first=76 second=85 amount=-1
+kerning first=76 second=84 amount=-2
+kerning first=76 second=81 amount=-1
+kerning first=76 second=214 amount=-1
+kerning first=76 second=213 amount=-1
+kerning first=76 second=212 amount=-1
+kerning first=76 second=211 amount=-1
+kerning first=76 second=210 amount=-1
+kerning first=76 second=79 amount=-1
+kerning first=76 second=71 amount=-1
+kerning first=76 second=198 amount=1
+kerning first=75 second=255 amount=-1
+kerning first=75 second=253 amount=-1
+kerning first=75 second=121 amount=-1
+kerning first=75 second=119 amount=-1
+kerning first=75 second=118 amount=-1
+kerning first=75 second=231 amount=-1
+kerning first=75 second=99 amount=-1
+kerning first=75 second=81 amount=-1
+kerning first=75 second=214 amount=-1
+kerning first=75 second=213 amount=-1
+kerning first=75 second=212 amount=-1
+kerning first=75 second=211 amount=-1
+kerning first=75 second=210 amount=-1
+kerning first=75 second=79 amount=-1
+kerning first=75 second=71 amount=-1
+kerning first=75 second=199 amount=-1
+kerning first=75 second=67 amount=-1
+kerning first=70 second=47 amount=-1
+kerning first=70 second=46 amount=-2
+kerning first=70 second=44 amount=-3
+kerning first=70 second=230 amount=-1
+kerning first=70 second=229 amount=-1
+kerning first=70 second=228 amount=-1
+kerning first=70 second=227 amount=-1
+kerning first=70 second=226 amount=-1
+kerning first=70 second=225 amount=-1
+kerning first=70 second=224 amount=-1
+kerning first=70 second=97 amount=-1
+kerning first=70 second=74 amount=-1
+kerning first=70 second=198 amount=-1
+kerning first=70 second=197 amount=-1
+kerning first=70 second=196 amount=-1
+kerning first=70 second=195 amount=-1
+kerning first=70 second=194 amount=-1
+kerning first=70 second=193 amount=-1
+kerning first=70 second=192 amount=-1
+kerning first=70 second=65 amount=-1
+kerning first=203 second=255 amount=-1
+kerning first=203 second=253 amount=-1
+kerning first=203 second=121 amount=-1
+kerning first=203 second=118 amount=-1
+kerning first=203 second=102 amount=-1
+kerning first=202 second=255 amount=-1
+kerning first=202 second=253 amount=-1
+kerning first=202 second=121 amount=-1
+kerning first=202 second=118 amount=-1
+kerning first=202 second=102 amount=-1
+kerning first=201 second=255 amount=-1
+kerning first=201 second=253 amount=-1
+kerning first=201 second=121 amount=-1
+kerning first=201 second=118 amount=-1
+kerning first=201 second=102 amount=-1
+kerning first=200 second=255 amount=-1
+kerning first=200 second=253 amount=-1
+kerning first=200 second=121 amount=-1
+kerning first=200 second=118 amount=-1
+kerning first=200 second=102 amount=-1
+kerning first=69 second=255 amount=-1
+kerning first=69 second=253 amount=-1
+kerning first=69 second=121 amount=-1
+kerning first=69 second=118 amount=-1
+kerning first=69 second=102 amount=-1
+kerning first=208 second=46 amount=-1
+kerning first=208 second=44 amount=-1
+kerning first=68 second=46 amount=-1
+kerning first=68 second=44 amount=-1
+kerning first=197 second=84 amount=-2
+kerning first=66 second=221 amount=-1
+kerning first=66 second=89 amount=-1
+kerning first=66 second=88 amount=-1
+kerning first=66 second=84 amount=-1
+kerning first=198 second=255 amount=-1
+kerning first=198 second=253 amount=-1
+kerning first=198 second=121 amount=-1
+kerning first=198 second=118 amount=-1
+kerning first=198 second=102 amount=-1
+kerning first=197 second=63 amount=-1
+kerning first=197 second=255 amount=-1
+kerning first=197 second=253 amount=-1
+kerning first=197 second=121 amount=-1
+kerning first=197 second=86 amount=-1
+kerning first=197 second=87 amount=-1
+kerning first=197 second=116 amount=-1
+kerning first=197 second=221 amount=-2
+kerning first=197 second=89 amount=-2
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/calibri32_0.png b/External tools/Myra.1.2.1.0/Assets/fonts/calibri32_0.png
new file mode 100644
index 0000000..686ae0f
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Assets/fonts/calibri32_0.png differ
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48.fnt b/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48.fnt
new file mode 100644
index 0000000..0ba8894
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48.fnt
@@ -0,0 +1,195 @@
+info face="Comic Sans MS" size=48 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=47 base=37 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="comicSans48_0.png"
+chars count=191
+char id=32 x=507 y=30 width=3 height=1 xoffset=-1 yoffset=46 xadvance=10 page=0 chnl=15
+char id=33 x=341 y=67 width=5 height=28 xoffset=1 yoffset=10 xadvance=8 page=0 chnl=15
+char id=34 x=269 y=172 width=11 height=11 xoffset=1 yoffset=11 xadvance=14 page=0 chnl=15
+char id=35 x=293 y=97 width=29 height=26 xoffset=0 yoffset=11 xadvance=29 page=0 chnl=15
+char id=36 x=441 y=0 width=20 height=34 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15
+char id=37 x=439 y=65 width=26 height=27 xoffset=2 yoffset=10 xadvance=28 page=0 chnl=15
+char id=38 x=49 y=74 width=22 height=28 xoffset=0 yoffset=11 xadvance=22 page=0 chnl=15
+char id=39 x=308 y=170 width=5 height=9 xoffset=4 yoffset=9 xadvance=13 page=0 chnl=15
+char id=40 x=82 y=38 width=11 height=34 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15
+char id=41 x=94 y=38 width=11 height=34 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15
+char id=42 x=110 y=181 width=17 height=14 xoffset=0 yoffset=10 xadvance=18 page=0 chnl=15
+char id=43 x=175 y=179 width=16 height=13 xoffset=0 yoffset=20 xadvance=16 page=0 chnl=15
+char id=44 x=370 y=168 width=6 height=8 xoffset=3 yoffset=35 xadvance=9 page=0 chnl=15
+char id=45 x=465 y=165 width=12 height=3 xoffset=1 yoffset=26 xadvance=13 page=0 chnl=15
+char id=46 x=383 y=168 width=5 height=4 xoffset=2 yoffset=35 xadvance=8 page=0 chnl=15
+char id=47 x=284 y=68 width=16 height=28 xoffset=1 yoffset=11 xadvance=17 page=0 chnl=15
+char id=48 x=112 y=130 width=21 height=26 xoffset=0 yoffset=11 xadvance=21 page=0 chnl=15
+char id=49 x=497 y=93 width=12 height=26 xoffset=2 yoffset=11 xadvance=15 page=0 chnl=15
+char id=50 x=330 y=123 width=17 height=26 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
+char id=51 x=348 y=123 width=17 height=26 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
+char id=52 x=134 y=128 width=21 height=26 xoffset=0 yoffset=11 xadvance=21 page=0 chnl=15
+char id=53 x=177 y=128 width=19 height=26 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
+char id=54 x=255 y=125 width=18 height=26 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
+char id=55 x=90 y=130 width=21 height=26 xoffset=0 yoffset=11 xadvance=21 page=0 chnl=15
+char id=56 x=197 y=127 width=19 height=26 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
+char id=57 x=115 y=71 width=19 height=28 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
+char id=58 x=32 y=185 width=6 height=17 xoffset=2 yoffset=18 xadvance=10 page=0 chnl=15
+char id=59 x=202 y=154 width=7 height=22 xoffset=1 yoffset=18 xadvance=10 page=0 chnl=15
+char id=60 x=140 y=181 width=11 height=14 xoffset=0 yoffset=20 xadvance=13 page=0 chnl=15
+char id=61 x=239 y=174 width=14 height=12 xoffset=1 yoffset=20 xadvance=17 page=0 chnl=15
+char id=62 x=56 y=184 width=13 height=16 xoffset=0 yoffset=18 xadvance=13 page=0 chnl=15
+char id=63 x=456 y=120 width=16 height=26 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15
+char id=64 x=423 y=35 width=27 height=29 xoffset=1 yoffset=10 xadvance=30 page=0 chnl=15
+char id=65 x=0 y=132 width=22 height=26 xoffset=1 yoffset=11 xadvance=24 page=0 chnl=15
+char id=66 x=19 y=104 width=18 height=27 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
+char id=67 x=466 y=65 width=20 height=27 xoffset=1 yoffset=10 xadvance=20 page=0 chnl=15
+char id=68 x=26 y=75 width=22 height=28 xoffset=2 yoffset=11 xadvance=25 page=0 chnl=15
+char id=69 x=95 y=73 width=19 height=28 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
+char id=70 x=135 y=71 width=19 height=28 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
+char id=71 x=23 y=132 width=22 height=26 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15
+char id=72 x=450 y=93 width=23 height=26 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=15
+char id=73 x=402 y=121 width=17 height=26 xoffset=1 yoffset=11 xadvance=19 page=0 chnl=15
+char id=74 x=72 y=73 width=22 height=28 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15
+char id=75 x=174 y=70 width=18 height=28 xoffset=3 yoffset=11 xadvance=21 page=0 chnl=15
+char id=76 x=212 y=69 width=18 height=28 xoffset=1 yoffset=11 xadvance=19 page=0 chnl=15
+char id=77 x=382 y=66 width=28 height=27 xoffset=1 yoffset=11 xadvance=29 page=0 chnl=15
+char id=78 x=349 y=94 width=25 height=26 xoffset=1 yoffset=11 xadvance=27 page=0 chnl=15
+char id=79 x=323 y=96 width=25 height=26 xoffset=1 yoffset=11 xadvance=27 page=0 chnl=15
+char id=80 x=420 y=121 width=17 height=26 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
+char id=81 x=106 y=37 width=29 height=33 xoffset=1 yoffset=11 xadvance=30 page=0 chnl=15
+char id=82 x=156 y=128 width=20 height=26 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
+char id=83 x=473 y=120 width=21 height=25 xoffset=2 yoffset=13 xadvance=24 page=0 chnl=15
+char id=84 x=375 y=94 width=24 height=26 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15
+char id=85 x=474 y=93 width=22 height=26 xoffset=2 yoffset=11 xadvance=25 page=0 chnl=15
+char id=86 x=46 y=132 width=21 height=26 xoffset=2 yoffset=11 xadvance=22 page=0 chnl=15
+char id=87 x=347 y=66 width=34 height=27 xoffset=2 yoffset=11 xadvance=35 page=0 chnl=15
+char id=88 x=425 y=93 width=24 height=26 xoffset=0 yoffset=11 xadvance=25 page=0 chnl=15
+char id=89 x=68 y=131 width=21 height=26 xoffset=0 yoffset=12 xadvance=22 page=0 chnl=15
+char id=90 x=400 y=94 width=24 height=26 xoffset=0 yoffset=11 xadvance=24 page=0 chnl=15
+char id=91 x=238 y=36 width=11 height=32 xoffset=2 yoffset=12 xadvance=13 page=0 chnl=15
+char id=92 x=318 y=67 width=16 height=28 xoffset=2 yoffset=11 xadvance=19 page=0 chnl=15
+char id=93 x=226 y=36 width=11 height=32 xoffset=2 yoffset=12 xadvance=13 page=0 chnl=15
+char id=94 x=281 y=171 width=15 height=9 xoffset=3 yoffset=10 xadvance=19 page=0 chnl=15
+char id=95 x=413 y=166 width=23 height=3 xoffset=-1 yoffset=40 xadvance=21 page=0 chnl=15
+char id=96 x=361 y=169 width=8 height=8 xoffset=2 yoffset=10 xadvance=19 page=0 chnl=15
+char id=97 x=460 y=147 width=17 height=17 xoffset=0 yoffset=20 xadvance=17 page=0 chnl=15
+char id=98 x=114 y=102 width=17 height=27 xoffset=2 yoffset=10 xadvance=20 page=0 chnl=15
+char id=99 x=0 y=185 width=15 height=17 xoffset=1 yoffset=20 xadvance=17 page=0 chnl=15
+char id=100 x=38 y=104 width=18 height=27 xoffset=1 yoffset=10 xadvance=20 page=0 chnl=15
+char id=101 x=405 y=148 width=18 height=17 xoffset=1 yoffset=20 xadvance=19 page=0 chnl=15
+char id=102 x=494 y=35 width=16 height=29 xoffset=0 yoffset=10 xadvance=17 page=0 chnl=15
+char id=103 x=366 y=121 width=17 height=26 xoffset=0 yoffset=20 xadvance=18 page=0 chnl=15
+char id=104 x=132 y=100 width=17 height=27 xoffset=2 yoffset=10 xadvance=20 page=0 chnl=15
+char id=105 x=101 y=157 width=6 height=24 xoffset=2 yoffset=13 xadvance=10 page=0 chnl=15
+char id=106 x=40 y=39 width=13 height=34 xoffset=-1 yoffset=13 xadvance=14 page=0 chnl=15
+char id=107 x=150 y=100 width=17 height=27 xoffset=2 yoffset=11 xadvance=18 page=0 chnl=15
+char id=108 x=335 y=67 width=5 height=28 xoffset=2 yoffset=10 xadvance=9 page=0 chnl=15
+char id=109 x=276 y=152 width=25 height=18 xoffset=1 yoffset=20 xadvance=26 page=0 chnl=15
+char id=110 x=442 y=147 width=17 height=17 xoffset=1 yoffset=20 xadvance=18 page=0 chnl=15
+char id=111 x=495 y=146 width=16 height=17 xoffset=1 yoffset=20 xadvance=18 page=0 chnl=15
+char id=112 x=301 y=68 width=16 height=28 xoffset=1 yoffset=19 xadvance=18 page=0 chnl=15
+char id=113 x=312 y=124 width=17 height=26 xoffset=0 yoffset=20 xadvance=18 page=0 chnl=15
+char id=114 x=16 y=185 width=15 height=17 xoffset=1 yoffset=20 xadvance=16 page=0 chnl=15
+char id=115 x=227 y=154 width=16 height=19 xoffset=0 yoffset=18 xadvance=17 page=0 chnl=15
+char id=116 x=145 y=155 width=16 height=23 xoffset=0 yoffset=14 xadvance=16 page=0 chnl=15
+char id=117 x=478 y=146 width=16 height=17 xoffset=1 yoffset=20 xadvance=18 page=0 chnl=15
+char id=118 x=345 y=150 width=17 height=18 xoffset=0 yoffset=20 xadvance=17 page=0 chnl=15
+char id=119 x=363 y=150 width=22 height=17 xoffset=1 yoffset=20 xadvance=23 page=0 chnl=15
+char id=120 x=324 y=151 width=20 height=18 xoffset=0 yoffset=20 xadvance=20 page=0 chnl=15
+char id=121 x=487 y=65 width=19 height=27 xoffset=-1 yoffset=20 xadvance=18 page=0 chnl=15
+char id=122 x=424 y=148 width=17 height=17 xoffset=1 yoffset=20 xadvance=18 page=0 chnl=15
+char id=123 x=68 y=38 width=13 height=34 xoffset=-1 yoffset=10 xadvance=12 page=0 chnl=15
+char id=124 x=502 y=0 width=4 height=34 xoffset=5 yoffset=9 xadvance=14 page=0 chnl=15
+char id=125 x=54 y=39 width=13 height=34 xoffset=-1 yoffset=10 xadvance=12 page=0 chnl=15
+char id=126 x=314 y=170 width=19 height=8 xoffset=1 yoffset=21 xadvance=19 page=0 chnl=15
+char id=160 x=507 y=28 width=3 height=1 xoffset=-1 yoffset=46 xadvance=10 page=0 chnl=15
+char id=161 x=287 y=97 width=5 height=27 xoffset=1 yoffset=11 xadvance=8 page=0 chnl=15
+char id=162 x=193 y=70 width=18 height=28 xoffset=1 yoffset=8 xadvance=21 page=0 chnl=15
+char id=163 x=317 y=36 width=25 height=30 xoffset=0 yoffset=10 xadvance=27 page=0 chnl=15
+char id=164 x=302 y=151 width=21 height=18 xoffset=0 yoffset=16 xadvance=21 page=0 chnl=15
+char id=165 x=81 y=158 width=19 height=24 xoffset=2 yoffset=13 xadvance=22 page=0 chnl=15
+char id=166 x=507 y=0 width=4 height=27 xoffset=5 yoffset=10 xadvance=14 page=0 chnl=15
+char id=167 x=236 y=126 width=18 height=26 xoffset=1 yoffset=11 xadvance=22 page=0 chnl=15
+char id=168 x=437 y=166 width=14 height=3 xoffset=3 yoffset=14 xadvance=19 page=0 chnl=15
+char id=169 x=177 y=155 width=24 height=22 xoffset=1 yoffset=10 xadvance=26 page=0 chnl=15
+char id=170 x=225 y=174 width=13 height=13 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15
+char id=171 x=90 y=183 width=19 height=14 xoffset=0 yoffset=20 xadvance=20 page=0 chnl=15
+char id=172 x=334 y=170 width=16 height=8 xoffset=0 yoffset=25 xadvance=16 page=0 chnl=15
+char id=173 x=452 y=165 width=12 height=3 xoffset=1 yoffset=26 xadvance=13 page=0 chnl=15
+char id=174 x=35 y=159 width=24 height=24 xoffset=1 yoffset=10 xadvance=26 page=0 chnl=15
+char id=175 x=389 y=166 width=23 height=3 xoffset=-1 yoffset=6 xadvance=21 page=0 chnl=15
+char id=176 x=254 y=172 width=14 height=12 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15
+char id=177 x=210 y=154 width=16 height=19 xoffset=0 yoffset=20 xadvance=16 page=0 chnl=15
+char id=178 x=128 y=181 width=11 height=14 xoffset=6 yoffset=8 xadvance=22 page=0 chnl=15
+char id=179 x=164 y=179 width=10 height=14 xoffset=6 yoffset=9 xadvance=22 page=0 chnl=15
+char id=180 x=351 y=169 width=9 height=8 xoffset=3 yoffset=10 xadvance=17 page=0 chnl=15
+char id=181 x=60 y=159 width=20 height=24 xoffset=0 yoffset=20 xadvance=18 page=0 chnl=15
+char id=182 x=451 y=35 width=23 height=29 xoffset=0 yoffset=11 xadvance=24 page=0 chnl=15
+char id=183 x=377 y=168 width=5 height=4 xoffset=2 yoffset=24 xadvance=8 page=0 chnl=15
+char id=184 x=297 y=171 width=10 height=9 xoffset=5 yoffset=35 xadvance=19 page=0 chnl=15
+char id=185 x=152 y=179 width=11 height=14 xoffset=6 yoffset=8 xadvance=22 page=0 chnl=15
+char id=186 x=192 y=178 width=16 height=13 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15
+char id=187 x=70 y=184 width=19 height=14 xoffset=0 yoffset=20 xadvance=20 page=0 chnl=15
+char id=188 x=20 y=40 width=19 height=34 xoffset=2 yoffset=9 xadvance=22 page=0 chnl=15
+char id=189 x=0 y=40 width=19 height=34 xoffset=2 yoffset=9 xadvance=22 page=0 chnl=15
+char id=190 x=482 y=0 width=19 height=34 xoffset=2 yoffset=9 xadvance=22 page=0 chnl=15
+char id=191 x=438 y=120 width=17 height=26 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15
+char id=192 x=241 y=0 width=22 height=35 xoffset=1 yoffset=2 xadvance=24 page=0 chnl=15
+char id=193 x=418 y=0 width=22 height=34 xoffset=1 yoffset=3 xadvance=24 page=0 chnl=15
+char id=194 x=218 y=0 width=22 height=35 xoffset=1 yoffset=2 xadvance=24 page=0 chnl=15
+char id=195 x=136 y=37 width=24 height=33 xoffset=1 yoffset=4 xadvance=24 page=0 chnl=15
+char id=196 x=343 y=35 width=22 height=30 xoffset=1 yoffset=7 xadvance=24 page=0 chnl=15
+char id=197 x=161 y=36 width=22 height=33 xoffset=1 yoffset=4 xadvance=24 page=0 chnl=15
+char id=198 x=383 y=35 width=39 height=29 xoffset=0 yoffset=10 xadvance=38 page=0 chnl=15
+char id=199 x=205 y=36 width=20 height=32 xoffset=1 yoffset=11 xadvance=20 page=0 chnl=15
+char id=200 x=40 y=0 width=19 height=38 xoffset=2 yoffset=1 xadvance=21 page=0 chnl=15
+char id=201 x=20 y=0 width=19 height=39 xoffset=2 yoffset=0 xadvance=21 page=0 chnl=15
+char id=202 x=0 y=0 width=19 height=39 xoffset=2 yoffset=0 xadvance=21 page=0 chnl=15
+char id=203 x=462 y=0 width=19 height=34 xoffset=2 yoffset=5 xadvance=21 page=0 chnl=15
+char id=204 x=287 y=0 width=17 height=35 xoffset=1 yoffset=2 xadvance=19 page=0 chnl=15
+char id=205 x=305 y=0 width=17 height=35 xoffset=1 yoffset=2 xadvance=19 page=0 chnl=15
+char id=206 x=125 y=0 width=17 height=36 xoffset=1 yoffset=1 xadvance=19 page=0 chnl=15
+char id=207 x=299 y=36 width=17 height=31 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
+char id=208 x=0 y=75 width=25 height=28 xoffset=-1 yoffset=11 xadvance=25 page=0 chnl=15
+char id=209 x=340 y=0 width=25 height=34 xoffset=1 yoffset=3 xadvance=27 page=0 chnl=15
+char id=210 x=169 y=0 width=25 height=35 xoffset=1 yoffset=2 xadvance=27 page=0 chnl=15
+char id=211 x=392 y=0 width=25 height=34 xoffset=1 yoffset=3 xadvance=27 page=0 chnl=15
+char id=212 x=143 y=0 width=25 height=35 xoffset=1 yoffset=2 xadvance=27 page=0 chnl=15
+char id=213 x=366 y=0 width=25 height=34 xoffset=1 yoffset=3 xadvance=27 page=0 chnl=15
+char id=214 x=250 y=36 width=25 height=31 xoffset=1 yoffset=6 xadvance=27 page=0 chnl=15
+char id=215 x=209 y=177 width=15 height=13 xoffset=0 yoffset=20 xadvance=16 page=0 chnl=15
+char id=216 x=411 y=65 width=27 height=27 xoffset=1 yoffset=11 xadvance=27 page=0 chnl=15
+char id=217 x=195 y=0 width=22 height=35 xoffset=2 yoffset=2 xadvance=25 page=0 chnl=15
+char id=218 x=264 y=0 width=22 height=35 xoffset=2 yoffset=2 xadvance=25 page=0 chnl=15
+char id=219 x=102 y=0 width=22 height=36 xoffset=2 yoffset=1 xadvance=25 page=0 chnl=15
+char id=220 x=276 y=36 width=22 height=31 xoffset=2 yoffset=6 xadvance=25 page=0 chnl=15
+char id=221 x=60 y=0 width=21 height=37 xoffset=0 yoffset=1 xadvance=22 page=0 chnl=15
+char id=222 x=384 y=121 width=17 height=26 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
+char id=223 x=366 y=35 width=16 height=30 xoffset=0 yoffset=10 xadvance=16 page=0 chnl=15
+char id=224 x=0 y=104 width=18 height=27 xoffset=0 yoffset=10 xadvance=17 page=0 chnl=15
+char id=225 x=76 y=102 width=18 height=27 xoffset=0 yoffset=10 xadvance=17 page=0 chnl=15
+char id=226 x=231 y=69 width=18 height=28 xoffset=0 yoffset=9 xadvance=17 page=0 chnl=15
+char id=227 x=217 y=127 width=18 height=26 xoffset=0 yoffset=11 xadvance=17 page=0 chnl=15
+char id=228 x=108 y=157 width=18 height=23 xoffset=0 yoffset=14 xadvance=17 page=0 chnl=15
+char id=229 x=475 y=35 width=18 height=29 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=15
+char id=230 x=244 y=153 width=31 height=18 xoffset=0 yoffset=20 xadvance=31 page=0 chnl=15
+char id=231 x=19 y=159 width=15 height=25 xoffset=1 yoffset=20 xadvance=17 page=0 chnl=15
+char id=232 x=57 y=103 width=18 height=27 xoffset=1 yoffset=10 xadvance=19 page=0 chnl=15
+char id=233 x=95 y=102 width=18 height=27 xoffset=1 yoffset=10 xadvance=19 page=0 chnl=15
+char id=234 x=155 y=71 width=18 height=28 xoffset=1 yoffset=9 xadvance=19 page=0 chnl=15
+char id=235 x=0 y=159 width=18 height=25 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15
+char id=236 x=278 y=97 width=8 height=27 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15
+char id=237 x=268 y=97 width=9 height=27 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15
+char id=238 x=252 y=97 width=15 height=27 xoffset=-3 yoffset=10 xadvance=10 page=0 chnl=15
+char id=239 x=162 y=155 width=14 height=23 xoffset=-2 yoffset=14 xadvance=10 page=0 chnl=15
+char id=240 x=236 y=98 width=15 height=27 xoffset=2 yoffset=10 xadvance=17 page=0 chnl=15
+char id=241 x=274 y=125 width=18 height=26 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
+char id=242 x=168 y=100 width=16 height=27 xoffset=1 yoffset=10 xadvance=18 page=0 chnl=15
+char id=243 x=185 y=99 width=16 height=27 xoffset=1 yoffset=10 xadvance=18 page=0 chnl=15
+char id=244 x=267 y=68 width=16 height=28 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15
+char id=245 x=293 y=124 width=18 height=26 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
+char id=246 x=127 y=157 width=17 height=23 xoffset=1 yoffset=14 xadvance=18 page=0 chnl=15
+char id=247 x=39 y=184 width=16 height=16 xoffset=0 yoffset=18 xadvance=16 page=0 chnl=15
+char id=248 x=386 y=148 width=18 height=17 xoffset=0 yoffset=20 xadvance=18 page=0 chnl=15
+char id=249 x=219 y=98 width=16 height=27 xoffset=1 yoffset=10 xadvance=18 page=0 chnl=15
+char id=250 x=202 y=99 width=16 height=27 xoffset=1 yoffset=10 xadvance=18 page=0 chnl=15
+char id=251 x=250 y=68 width=16 height=28 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15
+char id=252 x=495 y=120 width=16 height=25 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
+char id=253 x=82 y=0 width=19 height=37 xoffset=-1 yoffset=10 xadvance=18 page=0 chnl=15
+char id=254 x=323 y=0 width=16 height=35 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
+char id=255 x=184 y=36 width=20 height=33 xoffset=-1 yoffset=14 xadvance=18 page=0 chnl=15
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48_0.png b/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48_0.png
new file mode 100644
index 0000000..c34875b
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48_0.png differ
diff --git a/External tools/Myra.1.2.1.0/Assets/images/LogoOnly_64px.png b/External tools/Myra.1.2.1.0/Assets/images/LogoOnly_64px.png
new file mode 100644
index 0000000..f772cea
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Assets/images/LogoOnly_64px.png differ
diff --git a/External tools/Myra.1.2.1.0/Cyotek.Drawing.BitmapFont.dll b/External tools/Myra.1.2.1.0/Cyotek.Drawing.BitmapFont.dll
new file mode 100644
index 0000000..c1ac309
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Cyotek.Drawing.BitmapFont.dll differ
diff --git a/External tools/Myra.1.2.1.0/FontStashSharp.MonoGame.dll b/External tools/Myra.1.2.1.0/FontStashSharp.MonoGame.dll
new file mode 100644
index 0000000..726576c
Binary files /dev/null and b/External tools/Myra.1.2.1.0/FontStashSharp.MonoGame.dll differ
diff --git a/External tools/Myra.1.2.1.0/MonoGame.Framework.dll b/External tools/Myra.1.2.1.0/MonoGame.Framework.dll
new file mode 100644
index 0000000..9625655
Binary files /dev/null and b/External tools/Myra.1.2.1.0/MonoGame.Framework.dll differ
diff --git a/External tools/Myra.1.2.1.0/MonoGame.Framework.dll.config b/External tools/Myra.1.2.1.0/MonoGame.Framework.dll.config
new file mode 100644
index 0000000..09710ae
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/MonoGame.Framework.dll.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.AllWidgets.exe b/External tools/Myra.1.2.1.0/Myra.Samples.AllWidgets.exe
new file mode 100644
index 0000000..76d1d54
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.AllWidgets.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.AssetManagement.exe b/External tools/Myra.1.2.1.0/Myra.Samples.AssetManagement.exe
new file mode 100644
index 0000000..d3fe2c1
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.AssetManagement.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.CustomUIStylesheet.exe b/External tools/Myra.1.2.1.0/Myra.Samples.CustomUIStylesheet.exe
new file mode 100644
index 0000000..a07c836
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.CustomUIStylesheet.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.CustomWidgets.exe b/External tools/Myra.1.2.1.0/Myra.Samples.CustomWidgets.exe
new file mode 100644
index 0000000..f9e4116
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.CustomWidgets.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.DebugConsole.exe b/External tools/Myra.1.2.1.0/Myra.Samples.DebugConsole.exe
new file mode 100644
index 0000000..676ed3c
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.DebugConsole.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.GridContainer.exe b/External tools/Myra.1.2.1.0/Myra.Samples.GridContainer.exe
new file mode 100644
index 0000000..3c75f3f
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.GridContainer.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.NonModalWindows.exe b/External tools/Myra.1.2.1.0/Myra.Samples.NonModalWindows.exe
new file mode 100644
index 0000000..b86c9b5
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.NonModalWindows.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.Notepad.exe b/External tools/Myra.1.2.1.0/Myra.Samples.Notepad.exe
new file mode 100644
index 0000000..ff20055
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.Notepad.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.ObjectEditor.exe b/External tools/Myra.1.2.1.0/Myra.Samples.ObjectEditor.exe
new file mode 100644
index 0000000..379de96
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.ObjectEditor.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.SplitPaneContainer.exe b/External tools/Myra.1.2.1.0/Myra.Samples.SplitPaneContainer.exe
new file mode 100644
index 0000000..9e117cb
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.Samples.SplitPaneContainer.exe differ
diff --git a/External tools/Myra.1.2.1.0/Myra.dll b/External tools/Myra.1.2.1.0/Myra.dll
new file mode 100644
index 0000000..6681c3b
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Myra.dll differ
diff --git a/External tools/Myra.1.2.1.0/MyraPad.exe b/External tools/Myra.1.2.1.0/MyraPad.exe
new file mode 100644
index 0000000..a30dbf1
Binary files /dev/null and b/External tools/Myra.1.2.1.0/MyraPad.exe differ
diff --git a/External tools/Myra.1.2.1.0/StbImageSharp.dll b/External tools/Myra.1.2.1.0/StbImageSharp.dll
new file mode 100644
index 0000000..2e60d67
Binary files /dev/null and b/External tools/Myra.1.2.1.0/StbImageSharp.dll differ
diff --git a/External tools/Myra.1.2.1.0/StbTrueTypeSharp.dll b/External tools/Myra.1.2.1.0/StbTrueTypeSharp.dll
new file mode 100644
index 0000000..a3a030e
Binary files /dev/null and b/External tools/Myra.1.2.1.0/StbTrueTypeSharp.dll differ
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/allControls.xmmp b/External tools/Myra.1.2.1.0/Stylesheets/allControls.xmmp
new file mode 100644
index 0000000..3d9ffaa
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Stylesheets/allControls.xmmp
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/commodore-64.fnt b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/commodore-64.fnt
new file mode 100644
index 0000000..b6cec83
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/commodore-64.fnt
@@ -0,0 +1,101 @@
+info face="Commodore 64 Pixelized" size=20 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2
+common lineHeight=20 base=18 scaleW=512 scaleH=64 pages=1 packed=0
+page id=0 file="ui_stylesheet.atlas:commodore-64"
+chars count=96
+char id=10 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=0
+char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=17 xadvance=16 page=0 chnl=0
+char id=33 x=502 y=0 width=6 height=16 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
+char id=34 x=188 y=34 width=14 height=6 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=35 x=248 y=18 width=18 height=16 xoffset=-1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=36 x=220 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=37 x=234 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=38 x=266 y=18 width=16 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=39 x=142 y=34 width=10 height=8 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
+char id=40 x=90 y=18 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
+char id=41 x=100 y=18 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
+char id=42 x=114 y=34 width=18 height=12 xoffset=-1 yoffset=5 xadvance=16 page=0 chnl=0
+char id=43 x=100 y=34 width=14 height=12 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
+char id=44 x=152 y=34 width=8 height=8 xoffset=3 yoffset=13 xadvance=16 page=0 chnl=0
+char id=45 x=208 y=34 width=14 height=4 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=0
+char id=46 x=202 y=34 width=6 height=6 xoffset=5 yoffset=13 xadvance=16 page=0 chnl=0
+char id=47 x=392 y=18 width=16 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
+char id=48 x=56 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=49 x=430 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=50 x=444 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=51 x=458 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=52 x=472 y=0 width=16 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=53 x=488 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=54 x=0 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=55 x=14 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=56 x=28 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=57 x=42 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=58 x=84 y=18 width=6 height=16 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
+char id=59 x=0 y=0 width=8 height=18 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
+char id=60 x=158 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=61 x=160 y=34 width=14 height=8 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=62 x=172 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=63 x=70 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=64 x=192 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=65 x=8 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=66 x=22 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=67 x=36 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=68 x=50 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=69 x=64 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
+char id=70 x=78 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
+char id=71 x=92 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=72 x=106 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=73 x=120 y=0 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
+char id=74 x=130 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=75 x=144 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=76 x=158 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
+char id=77 x=172 y=0 width=16 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=78 x=188 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=79 x=202 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=80 x=216 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=81 x=230 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=82 x=244 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=83 x=258 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=84 x=272 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=85 x=286 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=86 x=300 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=87 x=314 y=0 width=16 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=88 x=330 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=89 x=344 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=90 x=358 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=91 x=110 y=18 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
+char id=92 x=408 y=18 width=16 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
+char id=93 x=120 y=18 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
+char id=94 x=206 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=95 x=222 y=34 width=18 height=4 xoffset=-1 yoffset=15 xadvance=16 page=0 chnl=0
+char id=96 x=132 y=34 width=10 height=8 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
+char id=97 x=424 y=18 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=98 x=282 y=18 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
+char id=99 x=438 y=18 width=12 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=100 x=296 y=18 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
+char id=101 x=450 y=18 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=102 x=310 y=18 width=12 height=14 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=0
+char id=103 x=322 y=18 width=14 height=14 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=104 x=372 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=105 x=386 y=0 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
+char id=106 x=396 y=0 width=10 height=16 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=0
+char id=107 x=406 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=108 x=420 y=0 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
+char id=109 x=464 y=18 width=16 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=110 x=480 y=18 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=111 x=494 y=18 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=112 x=336 y=18 width=14 height=14 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=113 x=350 y=18 width=14 height=14 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=114 x=0 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=115 x=14 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=116 x=364 y=18 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
+char id=117 x=28 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=118 x=42 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=119 x=56 y=34 width=16 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=120 x=72 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=121 x=378 y=18 width=14 height=14 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=122 x=86 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
+char id=123 x=130 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=124 x=186 y=18 width=6 height=16 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
+char id=125 x=144 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+char id=126 x=174 y=34 width=14 height=8 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
+kernings count=0
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.atlas b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.atlas
new file mode 100644
index 0000000..28ec4b0
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.atlas
@@ -0,0 +1,274 @@
+
+ui_stylesheet_atlas.png
+size: 860,229
+format: RGBA8888
+filter: Nearest,Nearest
+repeat: none
+blue
+ rotate: false
+ xy: 106, 137
+ size: 2, 2
+ orig: 2, 2
+ offset: 0, 0
+ index: -1
+button
+ rotate: false
+ xy: 715, 139
+ size: 36, 24
+ split: 18, 17, 11, 12
+ pad: 14, 14, 4, 4
+ orig: 36, 24
+ offset: 0, 0
+ index: -1
+button-down
+ rotate: false
+ xy: 106, 140
+ size: 36, 24
+ split: 18, 17, 12, 11
+ pad: 14, 14, 4, 4
+ orig: 36, 24
+ offset: 0, 0
+ index: -1
+check-box
+ rotate: false
+ xy: 162, 152
+ size: 12, 12
+ orig: 12, 12
+ offset: 0, 0
+ index: -1
+check-box-off
+ rotate: false
+ xy: 715, 109
+ size: 12, 12
+ orig: 12, 12
+ offset: 0, 0
+ index: -1
+commodore-64
+ rotate: false
+ xy: 1, 165
+ size: 512, 64
+ orig: 512, 64
+ offset: 0, 0
+ index: -1
+cursor
+ rotate: false
+ xy: 143, 148
+ size: 18, 16
+ split: 9, 8, 7, 8
+ pad: 2, 0, 0, 0
+ orig: 18, 16
+ offset: 0, 0
+ index: -1
+cursor-black
+ rotate: false
+ xy: 1, 14
+ size: 18, 16
+ split: 9, 8, 7, 8
+ pad: 2, 0, 0, 0
+ orig: 18, 16
+ offset: 0, 0
+ index: -1
+dialog
+ rotate: false
+ xy: 1, 31
+ size: 38, 38
+ split: 19, 18, 18, 19
+ pad: 13, 13, 24, 13
+ orig: 38, 38
+ offset: 0, 0
+ index: -1
+grey
+ rotate: false
+ xy: 752, 161
+ size: 2, 2
+ orig: 2, 2
+ offset: 0, 0
+ index: -1
+horizontal-split-pane
+ rotate: false
+ xy: 732, 128
+ size: 14, 10
+ split: 6, 6, 0, 0
+ pad: 0, 0, 0, 0
+ orig: 14, 10
+ offset: 0, 0
+ index: -1
+light-blue
+ rotate: false
+ xy: 143, 145
+ size: 2, 2
+ orig: 2, 2
+ offset: 0, 0
+ index: -1
+list
+ rotate: false
+ xy: 821, 215
+ size: 22, 14
+ split: 0, 21, 0, 13
+ pad: 0, 17, 0, 2
+ orig: 22, 14
+ offset: 0, 0
+ index: -1
+minus
+ rotate: false
+ xy: 78, 117
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+music
+ rotate: false
+ xy: 715, 164
+ size: 46, 32
+ orig: 46, 32
+ offset: 0, 0
+ index: -1
+music-off
+ rotate: false
+ xy: 774, 197
+ size: 46, 32
+ orig: 46, 32
+ offset: 0, 0
+ index: -1
+plus
+ rotate: false
+ xy: 821, 200
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+progress-bar
+ rotate: false
+ xy: 777, 180
+ size: 16, 16
+ split: 7, 8, 7, 8
+ pad: 2, 2, 2, 2
+ orig: 16, 16
+ offset: 0, 0
+ index: -1
+progress-bar-knob
+ rotate: false
+ xy: 715, 122
+ size: 16, 16
+ split: 4, 4, 4, 4
+ pad: 0, 0, 0, 0
+ orig: 16, 16
+ offset: 0, 0
+ index: -1
+radio-button
+ rotate: false
+ xy: 844, 217
+ size: 16, 12
+ orig: 16, 12
+ offset: 0, 0
+ index: -1
+radio-button
+ rotate: false
+ xy: 844, 217
+ size: 16, 12
+ split: 14, 0, 5, 5
+ pad: 13, 0, 0, 0
+ orig: 16, 12
+ offset: 0, 0
+ index: -1
+radio-button-off
+ rotate: false
+ xy: 1, 1
+ size: 16, 12
+ orig: 16, 12
+ offset: 0, 0
+ index: -1
+scroll-bar
+ rotate: false
+ xy: 20, 16
+ size: 14, 14
+ split: 6, 6, 6, 6
+ pad: 0, 0, 0, 0
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+scroll-bar-horizontal-knob
+ rotate: false
+ xy: 47, 117
+ size: 30, 14
+ split: 15, 14, 7, 6
+ pad: 0, 0, 0, 0
+ orig: 30, 14
+ offset: 0, 0
+ index: -1
+scroll-bar-vertical-knob
+ rotate: false
+ xy: 762, 166
+ size: 14, 30
+ split: 7, 6, 16, 13
+ pad: 0, 0, 0, 0
+ orig: 14, 30
+ offset: 0, 0
+ index: -1
+slider
+ rotate: false
+ xy: 40, 65
+ size: 4, 4
+ orig: 4, 4
+ offset: 0, 0
+ index: -1
+slider-knob
+ rotate: false
+ xy: 777, 167
+ size: 10, 12
+ orig: 10, 12
+ offset: 0, 0
+ index: -1
+sound
+ rotate: false
+ xy: 715, 197
+ size: 58, 32
+ orig: 58, 32
+ offset: 0, 0
+ index: -1
+sound-off
+ rotate: false
+ xy: 47, 132
+ size: 58, 32
+ orig: 58, 32
+ offset: 0, 0
+ index: -1
+touchpad
+ rotate: false
+ xy: 514, 29
+ size: 200, 200
+ orig: 200, 200
+ offset: 0, 0
+ index: -1
+touchpad-knob
+ rotate: false
+ xy: 1, 70
+ size: 44, 44
+ orig: 44, 44
+ offset: 0, 0
+ index: -1
+vertical-split-pane
+ rotate: false
+ xy: 794, 182
+ size: 10, 14
+ split: 0, 0, 6, 6
+ pad: 0, 1, 0, 0
+ orig: 10, 14
+ offset: 0, 0
+ index: -1
+white
+ rotate: false
+ xy: 93, 129
+ size: 2, 2
+ orig: 2, 2
+ offset: 0, 0
+ index: -1
+window
+ rotate: false
+ xy: 1, 115
+ size: 45, 49
+ split: 20, 20, 22, 22
+ pad: 22, 22, 24, 24
+ orig: 45, 49
+ offset: 0, 0
+ index: -1
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.xmms b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.xmms
new file mode 100644
index 0000000..33906fa
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.xmms
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet_atlas.png b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet_atlas.png
new file mode 100644
index 0000000..04554a5
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet_atlas.png differ
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_font.fnt b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_font.fnt
new file mode 100644
index 0000000..60ea417
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_font.fnt
@@ -0,0 +1,101 @@
+info face="Droid Sans" size=17 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1
+common lineHeight=20 base=18 scaleW=256 scaleH=128 pages=1 packed=0
+page id=0 file="ui_stylesheet.atlas:default"
+chars count=95
+char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=16 xadvance=4 page=0 chnl=0
+char id=124 x=0 y=0 width=6 height=20 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=0
+char id=106 x=6 y=0 width=9 height=20 xoffset=-4 yoffset=3 xadvance=4 page=0 chnl=0
+char id=81 x=15 y=0 width=15 height=19 xoffset=-2 yoffset=3 xadvance=12 page=0 chnl=0
+char id=74 x=30 y=0 width=11 height=19 xoffset=-5 yoffset=3 xadvance=4 page=0 chnl=0
+char id=125 x=41 y=0 width=10 height=18 xoffset=-3 yoffset=3 xadvance=6 page=0 chnl=0
+char id=123 x=51 y=0 width=10 height=18 xoffset=-3 yoffset=3 xadvance=6 page=0 chnl=0
+char id=93 x=61 y=0 width=8 height=18 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
+char id=91 x=69 y=0 width=8 height=18 xoffset=-2 yoffset=3 xadvance=5 page=0 chnl=0
+char id=41 x=77 y=0 width=9 height=18 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
+char id=40 x=86 y=0 width=9 height=18 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
+char id=64 x=95 y=0 width=18 height=17 xoffset=-3 yoffset=3 xadvance=14 page=0 chnl=0
+char id=121 x=113 y=0 width=13 height=17 xoffset=-3 yoffset=6 xadvance=8 page=0 chnl=0
+char id=113 x=126 y=0 width=13 height=17 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
+char id=112 x=139 y=0 width=13 height=17 xoffset=-2 yoffset=6 xadvance=9 page=0 chnl=0
+char id=103 x=152 y=0 width=13 height=17 xoffset=-3 yoffset=6 xadvance=8 page=0 chnl=0
+char id=38 x=165 y=0 width=16 height=16 xoffset=-3 yoffset=3 xadvance=11 page=0 chnl=0
+char id=37 x=181 y=0 width=18 height=16 xoffset=-3 yoffset=3 xadvance=14 page=0 chnl=0
+char id=36 x=199 y=0 width=12 height=16 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
+char id=63 x=211 y=0 width=11 height=16 xoffset=-3 yoffset=3 xadvance=7 page=0 chnl=0
+char id=33 x=222 y=0 width=7 height=16 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0
+char id=48 x=229 y=0 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=57 x=242 y=0 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=56 x=0 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=54 x=13 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=53 x=26 y=20 width=12 height=16 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
+char id=51 x=38 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=100 x=51 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=98 x=64 y=20 width=13 height=16 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
+char id=85 x=77 y=20 width=14 height=16 xoffset=-2 yoffset=3 xadvance=11 page=0 chnl=0
+char id=83 x=91 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=8 page=0 chnl=0
+char id=79 x=104 y=20 width=15 height=16 xoffset=-2 yoffset=3 xadvance=12 page=0 chnl=0
+char id=71 x=119 y=20 width=14 height=16 xoffset=-2 yoffset=3 xadvance=11 page=0 chnl=0
+char id=67 x=133 y=20 width=13 height=16 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
+char id=127 x=146 y=20 width=12 height=15 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
+char id=35 x=158 y=20 width=15 height=15 xoffset=-3 yoffset=3 xadvance=10 page=0 chnl=0
+char id=92 x=173 y=20 width=11 height=15 xoffset=-3 yoffset=3 xadvance=6 page=0 chnl=0
+char id=47 x=184 y=20 width=11 height=15 xoffset=-3 yoffset=3 xadvance=6 page=0 chnl=0
+char id=59 x=195 y=20 width=8 height=15 xoffset=-3 yoffset=6 xadvance=4 page=0 chnl=0
+char id=55 x=203 y=20 width=13 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=52 x=216 y=20 width=14 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=50 x=230 y=20 width=13 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=49 x=243 y=20 width=9 height=15 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
+char id=116 x=0 y=36 width=10 height=15 xoffset=-3 yoffset=4 xadvance=5 page=0 chnl=0
+char id=108 x=10 y=36 width=6 height=15 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0
+char id=107 x=16 y=36 width=12 height=15 xoffset=-2 yoffset=3 xadvance=8 page=0 chnl=0
+char id=105 x=28 y=36 width=7 height=15 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0
+char id=104 x=35 y=36 width=12 height=15 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
+char id=102 x=47 y=36 width=11 height=15 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
+char id=90 x=58 y=36 width=13 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=89 x=71 y=36 width=13 height=15 xoffset=-3 yoffset=3 xadvance=8 page=0 chnl=0
+char id=88 x=84 y=36 width=14 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=87 x=98 y=36 width=19 height=15 xoffset=-3 yoffset=3 xadvance=15 page=0 chnl=0
+char id=86 x=117 y=36 width=14 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=84 x=131 y=36 width=13 height=15 xoffset=-3 yoffset=3 xadvance=8 page=0 chnl=0
+char id=82 x=144 y=36 width=13 height=15 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
+char id=80 x=157 y=36 width=12 height=15 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
+char id=78 x=169 y=36 width=14 height=15 xoffset=-2 yoffset=3 xadvance=12 page=0 chnl=0
+char id=77 x=183 y=36 width=17 height=15 xoffset=-2 yoffset=3 xadvance=14 page=0 chnl=0
+char id=76 x=200 y=36 width=11 height=15 xoffset=-2 yoffset=3 xadvance=8 page=0 chnl=0
+char id=75 x=211 y=36 width=13 height=15 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
+char id=73 x=224 y=36 width=10 height=15 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
+char id=72 x=234 y=36 width=14 height=15 xoffset=-2 yoffset=3 xadvance=11 page=0 chnl=0
+char id=70 x=0 y=51 width=11 height=15 xoffset=-2 yoffset=3 xadvance=8 page=0 chnl=0
+char id=69 x=11 y=51 width=11 height=15 xoffset=-2 yoffset=3 xadvance=8 page=0 chnl=0
+char id=68 x=22 y=51 width=14 height=15 xoffset=-2 yoffset=3 xadvance=11 page=0 chnl=0
+char id=66 x=36 y=51 width=13 height=15 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
+char id=65 x=49 y=51 width=15 height=15 xoffset=-3 yoffset=3 xadvance=10 page=0 chnl=0
+char id=58 x=64 y=51 width=7 height=13 xoffset=-2 yoffset=6 xadvance=4 page=0 chnl=0
+char id=117 x=71 y=51 width=12 height=13 xoffset=-2 yoffset=6 xadvance=10 page=0 chnl=0
+char id=115 x=83 y=51 width=11 height=13 xoffset=-3 yoffset=6 xadvance=7 page=0 chnl=0
+char id=111 x=94 y=51 width=13 height=13 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
+char id=101 x=107 y=51 width=13 height=13 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
+char id=99 x=120 y=51 width=12 height=13 xoffset=-3 yoffset=6 xadvance=7 page=0 chnl=0
+char id=97 x=132 y=51 width=12 height=13 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
+char id=60 x=144 y=51 width=13 height=12 xoffset=-3 yoffset=5 xadvance=9 page=0 chnl=0
+char id=122 x=157 y=51 width=11 height=12 xoffset=-3 yoffset=6 xadvance=7 page=0 chnl=0
+char id=120 x=168 y=51 width=13 height=12 xoffset=-3 yoffset=6 xadvance=8 page=0 chnl=0
+char id=119 x=181 y=51 width=17 height=12 xoffset=-3 yoffset=6 xadvance=12 page=0 chnl=0
+char id=118 x=198 y=51 width=13 height=12 xoffset=-3 yoffset=6 xadvance=8 page=0 chnl=0
+char id=114 x=211 y=51 width=10 height=12 xoffset=-2 yoffset=6 xadvance=6 page=0 chnl=0
+char id=110 x=221 y=51 width=12 height=12 xoffset=-2 yoffset=6 xadvance=10 page=0 chnl=0
+char id=109 x=233 y=51 width=17 height=12 xoffset=-2 yoffset=6 xadvance=15 page=0 chnl=0
+char id=94 x=0 y=66 width=13 height=11 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=62 x=13 y=66 width=13 height=11 xoffset=-3 yoffset=5 xadvance=9 page=0 chnl=0
+char id=42 x=26 y=66 width=13 height=10 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
+char id=43 x=39 y=66 width=13 height=10 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
+char id=61 x=52 y=66 width=13 height=8 xoffset=-3 yoffset=7 xadvance=9 page=0 chnl=0
+char id=39 x=65 y=66 width=6 height=8 xoffset=-2 yoffset=3 xadvance=3 page=0 chnl=0
+char id=34 x=71 y=66 width=9 height=8 xoffset=-2 yoffset=3 xadvance=6 page=0 chnl=0
+char id=44 x=80 y=66 width=8 height=7 xoffset=-3 yoffset=14 xadvance=4 page=0 chnl=0
+char id=126 x=88 y=66 width=13 height=6 xoffset=-3 yoffset=8 xadvance=9 page=0 chnl=0
+char id=46 x=101 y=66 width=7 height=6 xoffset=-2 yoffset=13 xadvance=4 page=0 chnl=0
+char id=96 x=108 y=66 width=8 height=6 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0
+char id=45 x=116 y=66 width=9 height=5 xoffset=-3 yoffset=10 xadvance=5 page=0 chnl=0
+char id=95 x=125 y=66 width=13 height=4 xoffset=-4 yoffset=17 xadvance=6 page=0 chnl=0
+kernings count=-1
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.atlas b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.atlas
new file mode 100644
index 0000000..32d78c1
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.atlas
@@ -0,0 +1,201 @@
+
+ui_stylesheet_atlas.png
+size: 256,128
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+check-off
+ rotate: false
+ xy: 11, 5
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+textfield
+ rotate: false
+ xy: 11, 5
+ size: 14, 14
+ split: 3, 3, 3, 3
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+check-on
+ rotate: false
+ xy: 125, 35
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+cursor
+ rotate: false
+ xy: 23, 1
+ size: 3, 3
+ split: 1, 1, 1, 1
+ orig: 3, 3
+ offset: 0, 0
+ index: -1
+default
+ rotate: false
+ xy: 1, 50
+ size: 254, 77
+ orig: 254, 77
+ offset: 0, 0
+ index: -1
+default-pane
+ rotate: false
+ xy: 11, 1
+ size: 5, 3
+ split: 1, 1, 1, 1
+ orig: 5, 3
+ offset: 0, 0
+ index: -1
+default-rect-pad
+ rotate: false
+ xy: 11, 1
+ size: 5, 3
+ split: 1, 1, 1, 1
+ orig: 5, 3
+ offset: 0, 0
+ index: -1
+default-pane-noborder
+ rotate: false
+ xy: 170, 44
+ size: 1, 1
+ split: 0, 0, 0, 0
+ orig: 1, 1
+ offset: 0, 0
+ index: -1
+default-rect
+ rotate: false
+ xy: 38, 25
+ size: 3, 3
+ split: 1, 1, 1, 1
+ orig: 3, 3
+ offset: 0, 0
+ index: -1
+default-rect-down
+ rotate: false
+ xy: 170, 46
+ size: 3, 3
+ split: 1, 1, 1, 1
+ orig: 3, 3
+ offset: 0, 0
+ index: -1
+default-round
+ rotate: false
+ xy: 112, 29
+ size: 12, 20
+ split: 5, 5, 5, 4
+ pad: 4, 4, 1, 1
+ orig: 12, 20
+ offset: 0, 0
+ index: -1
+default-round-down
+ rotate: false
+ xy: 99, 29
+ size: 12, 20
+ split: 5, 5, 5, 4
+ pad: 4, 4, 1, 1
+ orig: 12, 20
+ offset: 0, 0
+ index: -1
+default-round-large
+ rotate: false
+ xy: 57, 29
+ size: 20, 20
+ split: 5, 5, 5, 4
+ orig: 20, 20
+ offset: 0, 0
+ index: -1
+default-scroll
+ rotate: false
+ xy: 78, 29
+ size: 20, 20
+ split: 2, 2, 2, 2
+ orig: 20, 20
+ offset: 0, 0
+ index: -1
+default-select
+ rotate: false
+ xy: 29, 29
+ size: 27, 20
+ split: 4, 14, 4, 4
+ orig: 27, 20
+ offset: 0, 0
+ index: -1
+default-select-selection
+ rotate: false
+ xy: 26, 16
+ size: 3, 3
+ split: 1, 1, 1, 1
+ orig: 3, 3
+ offset: 0, 0
+ index: -1
+default-slider
+ rotate: false
+ xy: 29, 20
+ size: 8, 8
+ split: 2, 2, 2, 2
+ orig: 8, 8
+ offset: 0, 0
+ index: -1
+default-slider-knob
+ rotate: false
+ xy: 1, 1
+ size: 9, 18
+ orig: 9, 18
+ offset: 0, 0
+ index: -1
+default-splitpane
+ rotate: false
+ xy: 17, 1
+ size: 5, 3
+ split: 0, 5, 0, 0
+ orig: 5, 3
+ offset: 0, 0
+ index: -1
+default-splitpane-vertical
+ rotate: false
+ xy: 125, 29
+ size: 3, 5
+ split: 0, 0, 0, 5
+ orig: 3, 5
+ offset: 0, 0
+ index: -1
+default-window
+ rotate: false
+ xy: 1, 20
+ size: 27, 29
+ split: 4, 3, 20, 3
+ orig: 27, 29
+ offset: 0, 0
+ index: -1
+selection
+ rotate: false
+ xy: 174, 48
+ size: 1, 1
+ orig: 1, 1
+ offset: 0, 0
+ index: -1
+tree-minus
+ rotate: false
+ xy: 140, 35
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+tree-plus
+ rotate: false
+ xy: 155, 35
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+white
+ rotate: false
+ xy: 129, 31
+ size: 3, 3
+ orig: 3, 3
+ offset: 0, 0
+ index: -1
+
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.xmms b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.xmms
new file mode 100644
index 0000000..16c1204
--- /dev/null
+++ b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.xmms
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet_atlas.png b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet_atlas.png
new file mode 100644
index 0000000..f51c5bd
Binary files /dev/null and b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet_atlas.png differ
diff --git a/External tools/Myra.1.2.1.0/image.png b/External tools/Myra.1.2.1.0/image.png
new file mode 100644
index 0000000..2567fe7
Binary files /dev/null and b/External tools/Myra.1.2.1.0/image.png differ
diff --git a/External tools/Myra.1.2.1.0/info.lundin.math.dll b/External tools/Myra.1.2.1.0/info.lundin.math.dll
new file mode 100644
index 0000000..45cad3a
Binary files /dev/null and b/External tools/Myra.1.2.1.0/info.lundin.math.dll differ
diff --git a/External tools/Myra.1.2.1.0/libSDL2-2.0.0.dylib b/External tools/Myra.1.2.1.0/libSDL2-2.0.0.dylib
new file mode 100644
index 0000000..221b678
Binary files /dev/null and b/External tools/Myra.1.2.1.0/libSDL2-2.0.0.dylib differ
diff --git a/External tools/Myra.1.2.1.0/libopenal.1.dylib b/External tools/Myra.1.2.1.0/libopenal.1.dylib
new file mode 100644
index 0000000..883af95
Binary files /dev/null and b/External tools/Myra.1.2.1.0/libopenal.1.dylib differ
diff --git a/README.md b/README.md
index a4a586e..7169fbe 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,2 @@
# Map
-to start the container run:
-
-```
-docker run --name= -p:5000:80 -v /home/michele/sledgemapper/:/app/db -d privateregistry.michelescandura.com/michele/sledgemapper:
-```
-
-Curl
-
-Register user
-```
- curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/users/register -d '{\"FirstName\":\"Michele\",\"LastName\":\"Scandura\", \"Username\":\"michele.scandura@outlook.com\", \"Password\":\"password1\", \"Initials\":\"MS\"}'
-```
-
-Login
-```
- curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/users/authenticate -d '{\"Username\":\"michele.scandura@outlook.com\", \"Password\":\"password1\"}'
-```
-
-New Campaign
-```
-curl -i -X POST -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6IjEiLCJuYmYiOjE2MTM3MjgzMjksImV4cCI6MTYxNDMzMzEyOCwiaWF0IjoxNjEzNzI4MzI5fQ.VEsDbYUTnnvpgWnB5buE88JyGx_cg3TJb5ybC3eLvmc" http://localhost:5000/campaign/highfell -d '""'
-```
-
-Get Campaigns
-```
-curl -i -X GET -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6IjEiLCJuYmYiOjE2MTM3MjgzMjksImV4cCI6MTYxNDMzMzEyOCwiaWF0IjoxNjEzNzI4MzI5fQ.VEsDbYUTnnvpgWnB5buE88JyGx_cg3TJb5ybC3eLvmc" http://localhost:5000/campaign -d '""'
-```
-
-
-```
-curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/AuthManagement/register -d '{\"FirstName\":\"Michele\",\"LastName\":\"Scandura\", \"UserName\":\"michele\", \"Password\":\"Password1!\", \"Initials\":\"MS\", \"Email\":\"michele.scandura@outlook.com\"}'
-```
-
-```
-curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/AuthManagement/login -d '{ \"Password\":\"Password1!\", \"Email\":\"michele.scandura@outlook.com\"}'
-```
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/BaseCommand.cs b/Sledgemapper.Api/Commands/BaseCommand.cs
index 08d526b..ec640ea 100644
--- a/Sledgemapper.Api/Commands/BaseCommand.cs
+++ b/Sledgemapper.Api/Commands/BaseCommand.cs
@@ -7,31 +7,13 @@ namespace Sledgemapper.Api.Commands
{
public double Timestamp { get; private set; }
public string SessionName { get; private set; }
- public Guid SessionId { get; private set; }
- public Guid Campaign { get; private set; }
- public string UserId { get; private set; }
+ public int UserId { get; private set; }
- public BaseCommand(string sessionName, string userId)
+ public BaseCommand(string sessionName, int userId)
{
Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
SessionName = sessionName;
UserId = userId;
}
-
- public BaseCommand(string campaign, string sessionName, string userId)
- {
- Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
- SessionName = sessionName;
- Campaign = new Guid(campaign);
- UserId = userId;
- }
-
- public BaseCommand(Guid campaign, Guid sessionId, string userId)
- {
- Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
- SessionId = sessionId;
- Campaign = campaign;
- UserId = userId;
- }
}
}
diff --git a/Sledgemapper.Api/Commands/DeleteNoteCommand.cs b/Sledgemapper.Api/Commands/DeleteNoteCommand.cs
index c60bfb0..f1a0e9e 100644
--- a/Sledgemapper.Api/Commands/DeleteNoteCommand.cs
+++ b/Sledgemapper.Api/Commands/DeleteNoteCommand.cs
@@ -1,4 +1,3 @@
-using System;
using Sledgemapper.Shared.Entities;
namespace Sledgemapper.Api.Commands
@@ -7,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Note Note { get; private set; }
- public DeleteNoteCommand(Guid campaign, Guid mapName, Note note, string userId) : base(campaign, mapName, userId)
+ public DeleteNoteCommand(string sessionName, Note note, int userId) : base(sessionName, userId)
{
Note = note;
}
diff --git a/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs b/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs
index abd504d..e3731d5 100644
--- a/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs
+++ b/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs
@@ -1,13 +1,12 @@
-using System;
using Sledgemapper.Shared.Entities;
namespace Sledgemapper.Api.Commands
{
- public class DeleteOverlayCommand : BaseCommand
+ public class DeleteOverlayCommand : BaseCommand
{
public Overlay Overlay { get; private set; }
- public DeleteOverlayCommand(Guid campaign, Guid mapName, Overlay overlay, string userId) : base(campaign, mapName, userId)
+ public DeleteOverlayCommand(string sessionName, Overlay overlay, int userId) : base(sessionName, userId)
{
Overlay = overlay;
}
diff --git a/Sledgemapper.Api/Commands/DeleteTileCommand.cs b/Sledgemapper.Api/Commands/DeleteTileCommand.cs
index bfc2d31..491a7a2 100644
--- a/Sledgemapper.Api/Commands/DeleteTileCommand.cs
+++ b/Sledgemapper.Api/Commands/DeleteTileCommand.cs
@@ -1,4 +1,3 @@
-using System;
using Sledgemapper.Shared.Entities;
namespace Sledgemapper.Api.Commands
@@ -7,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Tile Tile { get; private set; }
- public DeleteTileCommand(Guid campaign, Guid mapName, Tile tile, string userId) : base(campaign, mapName, userId)
+ public DeleteTileCommand(string sessionName, Tile tile, int userId) : base(sessionName, userId)
{
Tile = tile;
}
diff --git a/Sledgemapper.Api/Commands/DeleteWallCommand.cs b/Sledgemapper.Api/Commands/DeleteWallCommand.cs
index 4b38b77..f04edcf 100644
--- a/Sledgemapper.Api/Commands/DeleteWallCommand.cs
+++ b/Sledgemapper.Api/Commands/DeleteWallCommand.cs
@@ -1,4 +1,3 @@
-using System;
using Sledgemapper.Shared.Entities;
namespace Sledgemapper.Api.Commands
@@ -7,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Wall Wall { get; private set; }
- public DeleteWallCommand(Guid campaign, Guid mapName, Wall wall, string userId) : base(campaign, mapName, userId)
+ public DeleteWallCommand(string sessionName, Wall wall, int userId) : base(sessionName, userId)
{
Wall = wall;
}
diff --git a/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs b/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs
deleted file mode 100644
index ac420d1..0000000
--- a/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-using System.Collections.Generic;
-using MediatR;
-using Sledgemapper.Shared.Entities;
-
-namespace Sledgemapper.Api.Commands
-{
- public class GetCampaignMapsCommand : IRequest>
- {
- public double Timestamp { get; private set; }
- public Guid CampaignId { get; private set; }
- public string UserId { get; private set; }
-
- public GetCampaignMapsCommand(Guid campaignId, string userId)
- {
- Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
- CampaignId = campaignId;
- UserId = userId;
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs b/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs
deleted file mode 100644
index 0b733f7..0000000
--- a/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-using System.Collections.Generic;
-using MediatR;
-using Sledgemapper.Shared.Entities;
-
-namespace Sledgemapper.Api.Commands
-{
- public class GetCampaignPlayersCommand : IRequest>
- {
- public double Timestamp { get; private set; }
- public string CampaignName { get; private set; }
- public string UserId { get; private set; }
- public Guid CampaignId { get; private set; }
-
- public GetCampaignPlayersCommand(string campaingName, string userId)
- {
- Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
- CampaignName = campaingName;
- UserId = userId;
- }
-
- public GetCampaignPlayersCommand(Guid campaignId, string userId)
- {
- Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
- CampaignId = campaignId;
- UserId = userId;
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/GetCampaignsCommand.cs b/Sledgemapper.Api/Commands/GetCampaignsCommand.cs
deleted file mode 100644
index 520717d..0000000
--- a/Sledgemapper.Api/Commands/GetCampaignsCommand.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System.Collections.Generic;
-using MediatR;
-using Sledgemapper.Shared.Entities;
-
-namespace Sledgemapper.Api.Commands
-{
- public class GetCampaignsCommand : IRequest>
- {
- public string UserId { get; private set; }
- public GetCampaignsCommand(string userId)
- {
- UserId = userId;
- }
- }
-
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs b/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs
index 228d855..74047a8 100644
--- a/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs
+++ b/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs
@@ -1,18 +1,14 @@
using MediatR;
using Sledgemapper.Shared.Entities;
-using System;
namespace Sledgemapper.Api.Commands
{
public class GetMapSnapshotCommand : IRequest
{
- public Guid MapId { get; private set; }
- public Guid CampaignId { get; private set;
- }
- public GetMapSnapshotCommand(Guid campaignId, Guid mapId)
+ public string SessionName { get; private set; }
+ public GetMapSnapshotCommand(string sessionName)
{
- MapId = mapId;
- CampaignId = campaignId;
+ SessionName = sessionName;
}
}
}
diff --git a/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs b/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs
deleted file mode 100644
index de5aa7c..0000000
--- a/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-using MediatR;
-
-namespace Sledgemapper.Api.Commands
-{
- public class InvitePlayerToCampaignCommand : IRequest
- {
- public double Timestamp { get; private set; }
- public Guid CampaignId { get; private set; }
- public string Email { get; private set; }
- public string UserId { get; private set; }
- public InvitePlayerToCampaignCommand(Guid campaignId, string email, string userId)
- {
- Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
- CampaignId = campaignId;
- UserId = userId;
- Email = email;
- }
- }
-
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/NewCampaignCommand.cs b/Sledgemapper.Api/Commands/NewCampaignCommand.cs
deleted file mode 100644
index 26399bf..0000000
--- a/Sledgemapper.Api/Commands/NewCampaignCommand.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using MediatR;
-
-namespace Sledgemapper.Api.Commands
-{
- public class NewCampaignCommand : IRequest
- {
- public double Timestamp { get; private set; }
- public string CampaignName { get; private set; }
- public string UserId { get; private set; }
- public NewCampaignCommand(string campaingName, string userId)
- {
- Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
- CampaignName = campaingName;
- UserId = userId;
- }
- }
-
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/NewLineCommand.cs b/Sledgemapper.Api/Commands/NewLineCommand.cs
index ce98c1a..3bfe3cf 100644
--- a/Sledgemapper.Api/Commands/NewLineCommand.cs
+++ b/Sledgemapper.Api/Commands/NewLineCommand.cs
@@ -1,5 +1,4 @@
using Sledgemapper.Shared.Entities;
-using System;
namespace Sledgemapper.Api.Commands
{
@@ -7,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Line Line { get; private set; }
- public NewLineCommand(Guid campaign, Guid mapName, Line line, string userId) : base(campaign, mapName, userId)
+ public NewLineCommand(string sessionName, Line line, int userId) : base(sessionName, userId)
{
Line = line;
}
diff --git a/Sledgemapper.Api/Commands/NewNoteCommand.cs b/Sledgemapper.Api/Commands/NewNoteCommand.cs
index 97a9b31..5c2dfb6 100644
--- a/Sledgemapper.Api/Commands/NewNoteCommand.cs
+++ b/Sledgemapper.Api/Commands/NewNoteCommand.cs
@@ -1,5 +1,4 @@
using Sledgemapper.Shared.Entities;
-using System;
namespace Sledgemapper.Api.Commands
{
@@ -7,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Note Note { get; private set; }
- public NewNoteCommand(Guid campaignId, Guid mapId, Note note, string userId) : base(campaignId, mapId, userId)
+ public NewNoteCommand(string sessionName, Note note, int userId) : base(sessionName, userId)
{
Note = note;
}
diff --git a/Sledgemapper.Api/Commands/NewOverlayCommand.cs b/Sledgemapper.Api/Commands/NewOverlayCommand.cs
index 8d2d659..0aa4078 100644
--- a/Sledgemapper.Api/Commands/NewOverlayCommand.cs
+++ b/Sledgemapper.Api/Commands/NewOverlayCommand.cs
@@ -1,5 +1,4 @@
using Sledgemapper.Shared.Entities;
-using System;
namespace Sledgemapper.Api.Commands
{
@@ -7,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Overlay Overlay { get; private set; }
- public NewOverlayCommand(Guid campaignId, Guid mapId, Overlay overlay, string userId) : base(campaignId, mapId, userId)
+ public NewOverlayCommand(string sessionName, Overlay overlay, int userId) : base(sessionName, userId)
{
Overlay = overlay;
}
diff --git a/Sledgemapper.Api/Commands/NewRoomCommand.cs b/Sledgemapper.Api/Commands/NewRoomCommand.cs
index a44c836..5b7619e 100644
--- a/Sledgemapper.Api/Commands/NewRoomCommand.cs
+++ b/Sledgemapper.Api/Commands/NewRoomCommand.cs
@@ -1,5 +1,4 @@
using Sledgemapper.Shared.Entities;
-using System;
namespace Sledgemapper.Api.Commands
{
@@ -7,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Room Room { get; private set; }
- public NewRoomCommand(Guid campaignId, Guid mapId, Room room, string userId) : base(campaignId, mapId, userId)
+ public NewRoomCommand(string sessionName, Room room, int userId) : base(sessionName, userId)
{
Room = room;
}
diff --git a/Sledgemapper.Api/Commands/NewSessionCommand.cs b/Sledgemapper.Api/Commands/NewSessionCommand.cs
index ab42380..4b184cb 100644
--- a/Sledgemapper.Api/Commands/NewSessionCommand.cs
+++ b/Sledgemapper.Api/Commands/NewSessionCommand.cs
@@ -1,12 +1,9 @@
-using System;
-
namespace Sledgemapper.Api.Commands
{
- public class NewSessionCommand : BaseCommand
+ public class NewSessionCommand : BaseCommand
{
- public NewSessionCommand(string campaign, string sessionName, string userId) : base(campaign, sessionName, userId)
+ public NewSessionCommand(string sessionName, int userId):base(sessionName, userId)
{
}
}
-
}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/NewSnapshotCommand.cs b/Sledgemapper.Api/Commands/NewSnapshotCommand.cs
index 057ec88..8ec87b1 100644
--- a/Sledgemapper.Api/Commands/NewSnapshotCommand.cs
+++ b/Sledgemapper.Api/Commands/NewSnapshotCommand.cs
@@ -5,7 +5,7 @@ namespace Sledgemapper.Api.Commands
public class NewSnapshotCommand : BaseCommand
{
public Session Session { get; private set; }
- public NewSnapshotCommand(string sessionName, Session session, string userId) : base(sessionName, userId)
+ public NewSnapshotCommand(string sessionName, Session session, int userId) : base(sessionName, userId)
{
Session = session;
}
diff --git a/Sledgemapper.Api/Commands/NewTileCommand.cs b/Sledgemapper.Api/Commands/NewTileCommand.cs
index 522adf6..4fbd5f3 100644
--- a/Sledgemapper.Api/Commands/NewTileCommand.cs
+++ b/Sledgemapper.Api/Commands/NewTileCommand.cs
@@ -5,7 +5,7 @@ namespace Sledgemapper.Api.Commands
public class NewTileCommand : BaseCommand
{
public Tile Tile { get; private set; }
- public NewTileCommand(string sessionName, Tile tile, string userId) : base(sessionName, userId)
+ public NewTileCommand(string sessionName, Tile tile, int userId) : base(sessionName, userId)
{
Tile = tile;
}
diff --git a/Sledgemapper.Api/Commands/NewWallCommand.cs b/Sledgemapper.Api/Commands/NewWallCommand.cs
index f9682fb..c8c72fd 100644
--- a/Sledgemapper.Api/Commands/NewWallCommand.cs
+++ b/Sledgemapper.Api/Commands/NewWallCommand.cs
@@ -1,5 +1,4 @@
using Sledgemapper.Shared.Entities;
-using System;
namespace Sledgemapper.Api.Commands
{
@@ -7,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Wall Wall { get; private set; }
- public NewWallCommand(Guid campaignId, Guid mapId, Wall wall, string userId) : base(campaignId, mapId, userId)
+ public NewWallCommand(string sessionName, Wall wall, int userId) : base(sessionName, userId)
{
Wall = wall;
}
diff --git a/Sledgemapper.Api/Commands/PingCommand.cs b/Sledgemapper.Api/Commands/PingCommand.cs
deleted file mode 100644
index ef4db06..0000000
--- a/Sledgemapper.Api/Commands/PingCommand.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-// using Sledgemapper.Shared.Entities;
-
-// namespace Sledgemapper.Api.Commands
-// {
-// public class PingCommand : BaseCommand
-// {
-// public Ping Location { get; private set; }
-// public PingCommand(string sessionName, Ping location, int userId) : base(sessionName, userId)
-// {
-// Location = location;
-// }
-// }
-// }
diff --git a/Sledgemapper.Api/Controllers/AuthManagementController.cs b/Sledgemapper.Api/Controllers/AuthManagementController.cs
deleted file mode 100644
index 33b088c..0000000
--- a/Sledgemapper.Api/Controllers/AuthManagementController.cs
+++ /dev/null
@@ -1,185 +0,0 @@
-using AutoMapper;
-using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Options;
-using Microsoft.IdentityModel.Tokens;
-using System;
-using System.Collections.Generic;
-using System.IdentityModel.Tokens.Jwt;
-using System.Linq;
-using System.Security.Claims;
-using System.Text;
-using System.Threading.Tasks;
-using Sledgemapper.Api.Core.Entities;
-using Sledgemapper.Api.Models;
-
-namespace Sledgemapper.Api.Controllers
-{
- [Route("[controller]")] // api/authmanagement
- [ApiController]
- public class AuthManagementController : ControllerBase
- {
- private readonly UserManager _userManager;
- private readonly JwtConfig _jwtConfig;
- private readonly IMapper _mapper;
-
- public AuthManagementController(UserManager userManager,
- IOptionsMonitor optionsMonitor,
- IMapper mapper)
- {
- _userManager = userManager;
- _jwtConfig = optionsMonitor.CurrentValue;
- _mapper = mapper;
- }
-
- [HttpPost]
- [Route("Register")]
- public async Task Register([FromBody] RegisterModel user)
- {
- // Check if the incoming request is valid
- if (ModelState.IsValid)
- {
- // check i the user with the same email exist
- var existingUser = await _userManager.FindByEmailAsync(user.Email);
-
- if (existingUser != null)
- {
- return BadRequest(new RegistrationResponse()
- {
- Result = false,
- Errors = new List(){
- "Email already exist"
- }
- });
- }
-
- var newUser = _mapper.Map(user);
- // var newUser = new User() { Email = user.Email, UserName = user.UserName };
- var isCreated = await _userManager.CreateAsync(newUser, user.Password);
- if (isCreated.Succeeded)
- {
- var jwtToken = GenerateJwtToken(newUser);
-
- return Ok(new RegistrationResponse()
- {
- Result = true,
- Token = jwtToken
- });
- }
-
- return new JsonResult(new RegistrationResponse()
- {
- Result = false,
- Errors = isCreated.Errors.Select(x => x.Description).ToList()
- }
- )
- { StatusCode = 500 };
- }
-
- return BadRequest(new RegistrationResponse()
- {
- Result = false,
- Errors = new List(){
- "Invalid payload"
- }
- });
- }
-
- [HttpPost]
- [Route("Login")]
- public async Task Login([FromBody] UserLoginRequest user)
- {
- if (ModelState.IsValid)
- {
- // check if the user with the same email exist
- var existingUser = await _userManager.FindByEmailAsync(user.Email);
-
- if (existingUser == null)
- {
- // We dont want to give to much information on why the request has failed for security reasons
- return BadRequest(new RegistrationResponse()
- {
- Result = false,
- Errors = new List(){
- "Invalid authentication request"
- }
- });
- }
-
- // Now we need to check if the user has inputed the right password
- var isCorrect = await _userManager.CheckPasswordAsync(existingUser, user.Password);
-
- if (isCorrect)
- {
- var jwtToken = GenerateJwtToken(existingUser);
-
- return Ok(new LoginResponse()
- {
- Result = true,
- Token = jwtToken,
- Username = existingUser.Email,
- Initials = existingUser.Initials,
- Id = existingUser.Id
- });
- }
- else
- {
- // We dont want to give to much information on why the request has failed for security reasons
- return BadRequest(new RegistrationResponse()
- {
- Result = false,
- Errors = new List(){
- "Invalid authentication request"
- }
- });
- }
- }
-
- return BadRequest(new RegistrationResponse()
- {
- Result = false,
- Errors = new List(){
- "Invalid payload"
- }
- });
- }
-
- private string GenerateJwtToken(User user)
- {
- // Now its ime to define the jwt token which will be responsible of creating our tokens
- var jwtTokenHandler = new JwtSecurityTokenHandler();
-
- // We get our secret from the appsettings
- var key = Encoding.ASCII.GetBytes(_jwtConfig.Secret);
-
- // we define our token descriptor
- // We need to utilise claims which are properties in our token which gives information about the token
- // which belong to the specific user who it belongs to
- // so it could contain their id, name, email the good part is that these information
- // are generated by our server and identity framework which is valid and trusted
- var tokenDescriptor = new SecurityTokenDescriptor
- {
-
- Subject = new ClaimsIdentity(new[]
- {
- new Claim("Id", user.Id),
- new Claim(JwtRegisteredClaimNames.Sub, user.Email),
- new Claim(JwtRegisteredClaimNames.Email, user.Email),
- // the JTI is used for our refresh token which we will be convering in the next video
- new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
- }),
- // the life span of the token needs to be shorter and utilise refresh token to keep the user signedin
- // but since this is a demo app we can extend it to fit our current need
- Expires = DateTime.UtcNow.AddHours(6),
- // here we are adding the encryption alogorithim information which will be used to decrypt our token
- SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha512Signature)
- };
-
- var token = jwtTokenHandler.CreateToken(tokenDescriptor);
-
- var jwtToken = jwtTokenHandler.WriteToken(token);
-
- return jwtToken;
- }
- }
-}
diff --git a/Sledgemapper.Api/Controllers/CampaignController.cs b/Sledgemapper.Api/Controllers/CampaignController.cs
deleted file mode 100644
index 77a6dc5..0000000
--- a/Sledgemapper.Api/Controllers/CampaignController.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using MediatR;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Shared.Entities;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace Sledgemapper.Api.Controllers
-{
- [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
- [Route("[controller]")]
- public class CampaignController : ControllerBase
- {
- private readonly IMediator _mediator;
- private string UserId => HttpContext.User.Claims.FirstOrDefault(m => m.Type == "Id").Value;
-
- public CampaignController(IMediator mediator) => _mediator = mediator;
-
- [HttpPost]
- [Route("{campaignName}")]
- public async Task> Post(string campaignName)
- {
- var result = await _mediator.Send(new NewCampaignCommand(campaignName, UserId));
- if (!result)
- {
- return BadRequest();
- }
- return result;
- }
-
- //[HttpPost]
- //[Route("{campaignName}")]
- //public async Task Get(string campaignName)
- //{
- // var result = await _mediator.Send(new GetCampaignCommand(campaignName, UserId.ToString()));
- // return result;
- //}
-
- [HttpGet]
- public async Task> Get()
- {
- var result = await _mediator.Send(new GetCampaignsCommand(UserId));
- return result;
- }
-
- [HttpPost]
- [Route("{campaignId}/players/{email}")]
- public async Task Invite(Guid campaignId, string email)
- {
- var result = await _mediator.Send(new InvitePlayerToCampaignCommand(campaignId, email, UserId));
- return result;
- }
-
- [HttpGet]
- [Route("{campaignName}/players")]
- public async Task> GetPlayers(Guid campaignName)
- {
- var result = await _mediator.Send(new GetCampaignPlayersCommand(campaignName, UserId));
- return result;
- }
-
-
- [HttpGet]
- [Route("{campaignName}/maps")]
- public async Task> GetMaps(Guid campaignName)
- {
- var result = await _mediator.Send(new GetCampaignMapsCommand(campaignName, UserId));
- return result;
- }
-
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Controllers/MapController.cs b/Sledgemapper.Api/Controllers/MapController.cs
deleted file mode 100644
index 361a9a8..0000000
--- a/Sledgemapper.Api/Controllers/MapController.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-using System.Linq;
-using System.Threading.Tasks;
-using MediatR;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Shared.Entities;
-
-namespace Sledgemapper.Api.Controllers
-{
- [Authorize]
- [Route("[controller]/{campaign}/{mapName}")]
- public class MapController : ControllerBase
- {
- private readonly IMediator _mediator;
-
- public MapController(IMediator mediator)
- {
- _mediator = mediator;
- }
-
- private string UserId => HttpContext.User.Claims.FirstOrDefault(m => m.Type == "Id").Value;
-
- [HttpDelete("overlay")]
- public async Task Delete(Guid campaign, Guid mapName, [FromBody] Overlay overlay)
- {
- await _mediator.Send(new DeleteOverlayCommand(campaign, mapName, overlay, UserId));
- }
-
- [HttpDelete("wall")]
- public async Task Delete(Guid campaign, Guid mapName, [FromBody] Wall wall)
- {
- await _mediator.Send(new DeleteWallCommand(campaign, mapName, wall, UserId));
- }
-
- [HttpDelete("note")]
- public async Task Delete(Guid campaign, Guid mapName, [FromBody] Note note)
- {
- await _mediator.Send(new DeleteNoteCommand(campaign, mapName, note, UserId));
- }
-
-
- [HttpDelete("tile")]
- public async Task Delete(Guid campaign, Guid mapName, [FromBody] Tile tile)
- {
- await _mediator.Send(new DeleteTileCommand(campaign, mapName, tile, UserId));
- }
-
- [HttpGet]
- public async Task Get(Guid campaign, Guid mapName)
- {
- var result = await _mediator.Send(new GetMapSnapshotCommand(campaign, mapName));
- return result;
- }
-
- [HttpPost]
- public async Task Post(string campaign, string mapName)
- {
- var result = await _mediator.Send(new NewSessionCommand(campaign, mapName, UserId));
- return result;
- }
-
- [HttpPost("snapshot")]
- public async Task Post(string campaign, string mapName, [FromBody] Session session)
- {
- await _mediator.Send(new NewSnapshotCommand(mapName, session, UserId));
- }
-
- [HttpPost("overlay")]
- public async Task Post(Guid campaign, Guid mapName, [FromBody] Overlay overlay)
- {
- await _mediator.Send(new NewOverlayCommand(campaign, mapName, overlay, UserId));
- }
-
- [HttpPost("wall")]
- public async Task Post(Guid campaign, Guid mapName, [FromBody] Wall wall)
- {
- await _mediator.Send(new NewWallCommand(campaign, mapName, wall, UserId));
- }
-
- [HttpPost("note")]
- public async Task Post(Guid campaign, Guid mapName, [FromBody] Note note)
- {
- await _mediator.Send(new NewNoteCommand(campaign, mapName, note, UserId));
- }
-
- [HttpPost("room")]
- public async Task Post(Guid campaign, Guid mapName, [FromBody] Room room)
- {
- await _mediator.Send(new NewRoomCommand(campaign, mapName, room, UserId));
- }
-
- [HttpPost("line")]
- public async Task Post(Guid campaign, Guid mapName, [FromBody] Line line)
- {
- await _mediator.Send(new NewLineCommand(campaign, mapName, line, UserId));
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Controllers/SessionController.cs b/Sledgemapper.Api/Controllers/SessionController.cs
new file mode 100644
index 0000000..2638ac5
--- /dev/null
+++ b/Sledgemapper.Api/Controllers/SessionController.cs
@@ -0,0 +1,99 @@
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Shared.Entities;
+using System.Threading.Tasks;
+
+namespace Sledgemapper.Api.Controllers
+{
+ [Authorize]
+ [Route("[controller]/{sessionName}")]
+ public class SessionController : ControllerBase
+ {
+ private readonly IMediator _mediator;
+ private int UserId => int.Parse(HttpContext.User.Identity.Name);
+
+ public SessionController(IMediator mediator) => _mediator = mediator;
+
+ [HttpPost]
+ public async Task Post(string sessionName)
+ {
+ var result = await _mediator.Send(new NewSessionCommand(sessionName, UserId));
+ return result;
+ }
+
+ [HttpGet]
+ public async Task Get(string sessionName)
+ {
+ var result = await _mediator.Send(new GetMapSnapshotCommand(sessionName));
+ return result;
+ }
+
+ [HttpPost("snapshot")]
+ public async Task Post(string sessionName, [FromBody] Session session)
+ {
+ await _mediator.Send(new NewSnapshotCommand(sessionName, session, UserId));
+ }
+
+ [HttpPost("tile")]
+ public async Task Post(string sessionName, [FromBody] Tile tile)
+ {
+ await _mediator.Send(new NewTileCommand(sessionName, tile, UserId));
+ }
+
+ [HttpPost("overlay")]
+ public async Task Post(string sessionName, [FromBody] Overlay overlay)
+ {
+ await _mediator.Send(new NewOverlayCommand(sessionName, overlay, UserId));
+ }
+
+ [HttpPost("wall")]
+ public async Task Post(string sessionName, [FromBody] Wall wall)
+ {
+ await _mediator.Send(new NewWallCommand(sessionName, wall, UserId));
+ }
+
+ [HttpPost("note")]
+ public async Task Post(string sessionName, [FromBody] Note note)
+ {
+ await _mediator.Send(new NewNoteCommand(sessionName, note, UserId));
+ }
+
+ [HttpPost("room")]
+ public async Task Post(string sessionName, [FromBody] Room room)
+ {
+ await _mediator.Send(new NewRoomCommand(sessionName, room, UserId));
+ }
+
+ [HttpPost("line")]
+ public async Task Post(string sessionName, [FromBody] Line line)
+ {
+ await _mediator.Send(new NewLineCommand(sessionName, line, UserId));
+ }
+
+ [HttpDelete("tile")]
+ public async Task Delete(string sessionName, [FromBody] Tile tile)
+ {
+ await _mediator.Send(new DeleteTileCommand(sessionName, tile, UserId));
+ }
+
+ [HttpDelete("overlay")]
+ public async Task Delete(string sessionName, [FromBody] Overlay overlay)
+ {
+ await _mediator.Send(new DeleteOverlayCommand(sessionName, overlay, UserId));
+ }
+
+ [HttpDelete("wall")]
+ public async Task Delete(string sessionName, [FromBody] Wall wall)
+ {
+ await _mediator.Send(new DeleteWallCommand(sessionName, wall, UserId));
+ }
+
+ [HttpDelete("note")]
+ public async Task Delete(string sessionName, [FromBody] Note note)
+ {
+ await _mediator.Send(new DeleteNoteCommand(sessionName, note, UserId));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Controllers/UsersController.cs b/Sledgemapper.Api/Controllers/UsersController.cs
new file mode 100644
index 0000000..7988025
--- /dev/null
+++ b/Sledgemapper.Api/Controllers/UsersController.cs
@@ -0,0 +1,136 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.AspNetCore.Mvc;
+using AutoMapper;
+using System.IdentityModel.Tokens.Jwt;
+
+using Microsoft.Extensions.Options;
+using System.Text;
+using Microsoft.IdentityModel.Tokens;
+using System.Security.Claims;
+using Microsoft.AspNetCore.Authorization;
+using Sledgemapper.Services;
+using Sledgemapper.Entities;
+using Sledgemapper.Models.Users;
+using Sledgemapper.Helpers;
+
+namespace Sledgemapper.Controllers
+{
+ [Authorize]
+ [ApiController]
+ [Route("[controller]")]
+ public class UsersController : ControllerBase
+ {
+ private IUserService _userService;
+ private IMapper _mapper;
+ private readonly AppSettings _appSettings;
+
+ public UsersController(
+ IUserService userService,
+ IMapper mapper,
+ IOptions appSettings)
+ {
+ _userService = userService;
+ _mapper = mapper;
+ _appSettings = appSettings.Value;
+ }
+
+ [AllowAnonymous]
+ [HttpPost("authenticate")]
+ public IActionResult Authenticate([FromBody]AuthenticateModel model)
+ {
+ var user = _userService.Authenticate(model.Username, model.Password);
+
+ if (user == null)
+ return BadRequest(new { message = "Username or password is incorrect" });
+
+ var tokenHandler = new JwtSecurityTokenHandler();
+ var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
+ var tokenDescriptor = new SecurityTokenDescriptor
+ {
+ Subject = new ClaimsIdentity(new Claim[]
+ {
+ new Claim(ClaimTypes.Name, user.Id.ToString())
+ }),
+ Expires = DateTime.UtcNow.AddDays(7),
+ SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
+ };
+ var token = tokenHandler.CreateToken(tokenDescriptor);
+ var tokenString = tokenHandler.WriteToken(token);
+
+ // return basic user info and authentication token
+ return Ok(new
+ {
+ Id = user.Id,
+ Username = user.Username,
+ FirstName = user.FirstName,
+ LastName = user.LastName,
+ Initials = user.Initials,
+ Token = tokenString
+ });
+ }
+
+ [AllowAnonymous]
+ [HttpPost("register")]
+ public IActionResult Register([FromBody]RegisterModel model)
+ {
+ // map model to entity
+ var user = _mapper.Map(model);
+
+ try
+ {
+ // create user
+ _userService.Create(user, model.Password);
+ return Ok();
+ }
+ catch (AppException ex)
+ {
+ // return error message if there was an exception
+ return BadRequest(new { message = ex.Message });
+ }
+ }
+
+ [HttpGet]
+ public IActionResult GetAll()
+ {
+ var users = _userService.GetAll();
+ var model = _mapper.Map>(users);
+ return Ok(model);
+ }
+
+ [HttpGet("{id}")]
+ public IActionResult GetById(int id)
+ {
+ var user = _userService.GetById(id);
+ var model = _mapper.Map(user);
+ return Ok(model);
+ }
+
+ [HttpPut("{id}")]
+ public IActionResult Update(int id, [FromBody]UpdateModel model)
+ {
+ // map model to entity and set id
+ var user = _mapper.Map(model);
+ user.Id = id;
+
+ try
+ {
+ // update user
+ _userService.Update(user, model.Password);
+ return Ok();
+ }
+ catch (AppException ex)
+ {
+ // return error message if there was an exception
+ return BadRequest(new { message = ex.Message });
+ }
+ }
+
+ [HttpDelete("{id}")]
+ public IActionResult Delete(int id)
+ {
+ _userService.Delete(id);
+ return Ok();
+ }
+ }
+}
diff --git a/Sledgemapper.Api/Core/Entities/BaseEntity.cs b/Sledgemapper.Api/Core/Entities/BaseEntity.cs
deleted file mode 100644
index 5196c35..0000000
--- a/Sledgemapper.Api/Core/Entities/BaseEntity.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using System.ComponentModel.DataAnnotations;
-
-public abstract class BaseEntity
-{
- [Key]
- public int Id { get; set; }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Core/Entities/Campaign.cs b/Sledgemapper.Api/Core/Entities/Campaign.cs
deleted file mode 100644
index 04a18de..0000000
--- a/Sledgemapper.Api/Core/Entities/Campaign.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations.Schema;
-using Microsoft.EntityFrameworkCore;
-using Sledgemapper.Api.Models;
-
-namespace Sledgemapper.Api.Core.Entities
-{
- [Index(nameof(CampaignName), nameof(OwnerId), IsUnique = true)]
- public class Campaign
- {
- [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- public Guid CampaignId { get; set; }
-
- public string CampaignName { get; set; }
-
- public string OwnerId { get; set; }
-
- public User Owner { get; set; }
-
- public ICollection InvitedUsers { get; set; }
-
- public ICollection Maps { get; set; }
- }
-}
diff --git a/Sledgemapper.Api/Core/Entities/Map.cs b/Sledgemapper.Api/Core/Entities/Map.cs
deleted file mode 100644
index b46a373..0000000
--- a/Sledgemapper.Api/Core/Entities/Map.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System.ComponentModel.DataAnnotations;
-
-namespace Sledgemapper.Api.Core.Entities
-{
- public class Map
- {
- [Key]
- public int MapId { get; set; }
-
- [Required]
- public string MapName { get; set; }
-
- [Required]
- public int CampaignId { get; set; }
-
- }
-}
diff --git a/Sledgemapper.Api/Core/Entities/Session.cs b/Sledgemapper.Api/Core/Entities/Session.cs
deleted file mode 100644
index 52029db..0000000
--- a/Sledgemapper.Api/Core/Entities/Session.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-
-namespace Sledgemapper.Api.Core.Entities
-{
- [Index(nameof(CampaignId), nameof(SessionName), IsUnique = true)]
- public class Session
- {
- [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- [Key]
- public Guid SessionId { get; set; }
-
- [Required]
- public Guid CampaignId { get; set; }
-
- [Required]
- public string SessionName { get; set; }
-
- [Required]
- public string OwnerUserId { get; set; }
- }
-}
diff --git a/Sledgemapper.Api/Core/Entities/User.cs b/Sledgemapper.Api/Core/Entities/User.cs
deleted file mode 100644
index bc29784..0000000
--- a/Sledgemapper.Api/Core/Entities/User.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System.Collections.Generic;
-using Microsoft.AspNetCore.Identity;
-
-namespace Sledgemapper.Api.Core.Entities
-{
- public class User : IdentityUser
- {
- // public int Id { get; set; }
- public string FirstName { get; set; }
- public string LastName { get; set; }
- // public string Email { get; set; }
- // public string Username { get; set; }
- public string Initials { get; set; }
- // public byte[] PasswordHash { get; set; }
- public byte[] PasswordSalt { get; set; }
- public ICollection Campaigns { get; set; }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Data/MyDbContext.cs b/Sledgemapper.Api/Data/MyDbContext.cs
new file mode 100644
index 0000000..aca62cd
--- /dev/null
+++ b/Sledgemapper.Api/Data/MyDbContext.cs
@@ -0,0 +1,81 @@
+using Microsoft.EntityFrameworkCore;
+using Sledgemapper.Api.Models;
+namespace Sledgemapper.Api.Data
+{
+ public static class DbInitializer
+ {
+ public static void Initialize(MyDbContext context)
+ {
+ context.Database.EnsureCreated();
+ }
+ }
+
+ public class MyDbContext : DbContext
+ {
+ public DbSet MapLogs { get; set; }
+ public DbSet Sessions { get; set; }
+ public DbSet UserConnections { get; set; }
+ public DbSet SessionUsers { get; set; }
+ public DbSet Snapshots { get; set; }
+
+ public MyDbContext(DbContextOptions options) : base(options)
+ {
+
+ }
+
+ // protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
+ // {
+ // // optionsBuilder.
+ // // options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName);
+ // // optionsBuilder.UseSqlite("Filename=SledgemapperDatabase.db", options =>
+ // // {
+ // // options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName);
+ // // });
+ // optionsBuilder.UseSqlite("Filename=MyDatabase.db").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
+
+ // base.OnConfiguring(optionsBuilder);
+ // }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ // Map table names
+ modelBuilder.Entity().ToTable("MapLog", "dbo");
+ modelBuilder.Entity(entity =>
+ {
+ entity.HasKey(e => e.MapLogId);
+ });
+
+ modelBuilder.Entity().ToTable("Session", "dbo");
+ modelBuilder.Entity(entity =>
+ {
+ entity.HasKey(e => e.SessionId);
+ entity.HasIndex(e => e.SessionName).IsUnique();
+ });
+
+
+ modelBuilder.Entity().ToTable("UserConnection", "dbo");
+ modelBuilder.Entity(entity =>
+ {
+ entity.HasKey(e => e.UserConnectionId);
+ entity.HasIndex(e => e.UserId);
+
+ });
+
+ modelBuilder.Entity().ToTable("SessionUser", "dbo");
+ modelBuilder.Entity(entity =>
+ {
+ entity.HasKey(e => e.SessionUserId);
+ entity.HasIndex(e => e.SessionId);
+
+ });
+
+ modelBuilder.Entity().ToTable("Snapshot", "dbo");
+ modelBuilder.Entity(entity =>
+ {
+ entity.HasKey(e => e.SnapshotId);
+ });
+
+ base.OnModelCreating(modelBuilder);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Entities/User.cs b/Sledgemapper.Api/Entities/User.cs
new file mode 100644
index 0000000..00eb6d7
--- /dev/null
+++ b/Sledgemapper.Api/Entities/User.cs
@@ -0,0 +1,13 @@
+namespace Sledgemapper.Entities
+{
+ public class User
+ {
+ public int Id { get; set; }
+ public string FirstName { get; set; }
+ public string LastName { get; set; }
+ public string Username { get; set; }
+ public string Initials { get; set; }
+ public byte[] PasswordHash { get; set; }
+ public byte[] PasswordSalt { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/BaseCommandHandler.cs b/Sledgemapper.Api/Handlers/BaseCommandHandler.cs
deleted file mode 100644
index f9a8dea..0000000
--- a/Sledgemapper.Api/Handlers/BaseCommandHandler.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using MediatR;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using System;
-using Microsoft.EntityFrameworkCore;
-using Sledgemapper.Api.Models;
-using Sledgemapper.Api.Core.Entities;
-
-namespace Sledgemapper.Api.Handlers
-{
- public abstract class BaseCommandHandler : IRequestHandler where TRequest : BaseCommand
- {
- protected SledgemapperDbContext DbContext { get; }
-
- protected IMediator Mediator { get; }
-
-
- public abstract Task Handle(TRequest request, CancellationToken cancellationToken);
-
- protected BaseCommandHandler(IMediator mediator, SledgemapperDbContext dbContext)
- {
- DbContext = dbContext;
- Mediator = mediator;
- }
-
- protected async Task CheckAuthorization(TRequest command)
- {
- var user = await DbContext.Users.FindAsync(command.UserId);
- DbContext.Attach(user);
-
-
- var campaign = await GetCampaignForUser(command);
-
- var maps = campaign.Maps.Any(s => s.SessionId == command.SessionId);
-
- if (!maps)
- {
- throw new Exception("Unauthorized");
- }
- }
-
- protected async Task GetCampaignForUser(TRequest command)
- {
- var user = await DbContext.Users.FindAsync(command.UserId);
- DbContext.Attach(user);
- var campaign = await DbContext
- .Campaigns
- .Where(campaign => campaign.CampaignId == command.Campaign)
- .Include(c => c.InvitedUsers)
- .Include(c => c.Maps)
- .Include(c => c.Owner)
- .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)).FirstAsync();
- return campaign;
- }
-
- protected async Task SaveLog(TRequest command, string operation, string type, string data, CancellationToken cancellationToken)
- {
- var session = DbContext.Sessions.First(m => m.SessionId == command.SessionId);
- DbContext.MapLogs.Add(new MapLog
- {
- Operation = operation,
- SessionId = session.SessionId,
- Type = type,
- Timestamp = command.Timestamp,
- Object = data,
- UserId = command.UserId,
- });
- await DbContext.SaveChangesAsync(cancellationToken);
- return session;
- }
-
- }
-}
diff --git a/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs
index e2d55c3..dc8223b 100644
--- a/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs
@@ -1,25 +1,42 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Shared.Entities;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class DeleteNoteCommandHandler : BaseCommandHandler
- {
- public DeleteNoteCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
- {
- }
- public override async Task Handle(DeleteNoteCommand command, CancellationToken cancellationToken)
+ public class DeleteNoteCommandHandler : IRequestHandler
+ {
+ private readonly MyDbContext _dbcontext;
+
+ private readonly IMediator _mediator;
+
+ public DeleteNoteCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+
+ public async Task Handle(DeleteNoteCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Note);
- var session = await SaveLog(command, "D", "N", jsonString, cancellationToken);
- await Mediator.Publish(new DeleteNoteNotification(session, command.Note, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Note);
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "D",
+ SessionId = session.SessionId,
+ Type = "N",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new DeleteNoteNotification(session, notification.Note, notification.UserId));
+
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs
index a6b2956..5069970 100644
--- a/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs
@@ -1,25 +1,40 @@
using MediatR;
using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
+using Sledgemapper.Shared.Entities;
using Sledgemapper.Api.Notifications;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class DeleteOverlayCommandHandler : BaseCommandHandler
+ public class DeleteOverlayCommandHandler : IRequestHandler
{
- public DeleteOverlayCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
- {
- }
+ private readonly MyDbContext _dbcontext;
- public override async Task Handle(DeleteOverlayCommand command, CancellationToken cancellationToken)
+ private readonly IMediator _mediator;
+
+ public DeleteOverlayCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+ public async Task Handle(DeleteOverlayCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Overlay);
- var session = await SaveLog(command, "D", "O", jsonString, cancellationToken);
- await Mediator.Publish(new DeleteOverlayNotification(session, command.Overlay, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Overlay);
+ var session = _dbcontext.Sessions.First(m=>m.SessionName== notification.SessionName);
+
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "D",
+ SessionId = session.SessionId,
+ Type = "O",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId=notification.UserId
+ });
+
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new DeleteOverlayNotification(session, notification.Overlay, notification.UserId));
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs
index 5c1cd1d..40e9858 100644
--- a/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs
@@ -1,25 +1,39 @@
using MediatR;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
+using Sledgemapper.Shared.Entities;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class DeleteTileCommandHandler : BaseCommandHandler
+ public class DeleteTileCommandHandler : IRequestHandler
{
- public DeleteTileCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
- {
- }
+ private readonly MyDbContext _dbcontext;
- public override async Task Handle(DeleteTileCommand command, CancellationToken cancellationToken)
+ private readonly IMediator _mediator;
+
+ public DeleteTileCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+ public async Task Handle(DeleteTileCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Tile);
- var session = await SaveLog(command, "D", "T", jsonString, cancellationToken);
- await Mediator.Publish(new DeleteTileNotification(session, command.Tile, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Tile);
+ var session = _dbcontext.Sessions.First(m=>m.SessionName== notification.SessionName);
+
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "D",
+ SessionId = session.SessionId,
+ Type = "T",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new DeleteTileNotification(session, notification.Tile, notification.UserId));
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs
index aeb0f30..5fdb16a 100644
--- a/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs
@@ -1,25 +1,42 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Shared.Entities;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class DeleteWallCommandHandler : BaseCommandHandler
- {
- public DeleteWallCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
- {
- }
- public override async Task Handle(DeleteWallCommand command, CancellationToken cancellationToken)
+ public class DeleteWallCommandHandler : IRequestHandler
+ {
+ private readonly MyDbContext _dbcontext;
+
+ private readonly IMediator _mediator;
+
+ public DeleteWallCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+
+ public async Task Handle(DeleteWallCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Wall);
- var session = await SaveLog(command, "D", "W", jsonString, cancellationToken);
- await Mediator.Publish(new DeleteWallNotification(session, command.Wall, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Wall);
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "D",
+ SessionId = session.SessionId,
+ Type = "W",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new DeleteWallNotification(session, notification.Wall, notification.UserId));
+
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs
deleted file mode 100644
index 289b8e1..0000000
--- a/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using MediatR;
-using Microsoft.EntityFrameworkCore;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
-using Sledgemapper.Shared.Entities;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Sledgemapper.Api.Handlers
-{
- public class GetCampaignMapsCommandHandler : IRequestHandler>
- {
- private readonly IMediator _mediator;
- private readonly SledgemapperDbContext _dbcontext;
-
- public GetCampaignMapsCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
- {
- _mediator = mediator;
- _dbcontext = dbcontext;
- }
-
- public async Task> Handle(GetCampaignMapsCommand command, CancellationToken cancellationToken)
- {
- try
- {
- var user = await _dbcontext.Users.FindAsync(command.UserId);
- _dbcontext.Attach(user);
-
-
-
- var campaign = await _dbcontext
- .Campaigns
- .Where(campaign => campaign.CampaignId == command.CampaignId)
- .Include(c => c.InvitedUsers)
- .Include(c => c.Maps)
- .Include(c => c.Owner)
- .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)).FirstAsync();
-
-
-
-
- //var campaign = await _dbcontext.Campaigns.Where(campaign => campaign.CampaignId == command.CampaignId && campaign.OwnerId == command.UserId).Include(campaign => campaign.Maps).FirstAsync();
-
- var maps = campaign.Maps.Select(session => new Session { SessionName = session.SessionName, SessionId = session.SessionId }).ToList();
- return maps;
- }
- catch (Exception ex)
- {
- }
- return null;
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs
deleted file mode 100644
index e915643..0000000
--- a/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using MediatR;
-using Microsoft.EntityFrameworkCore;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
-using Sledgemapper.Shared.Entities;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Sledgemapper.Api.Handlers
-{
- public class GetCampaignPlayersCommandHandler : IRequestHandler>
- {
- private readonly IMediator _mediator;
- private readonly SledgemapperDbContext _dbcontext;
-
- public GetCampaignPlayersCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
- {
- _mediator = mediator;
- _dbcontext = dbcontext;
- }
-
- public async Task> Handle(GetCampaignPlayersCommand command, CancellationToken cancellationToken)
- {
- try
- {
- var user = await _dbcontext.Users.FindAsync(command.UserId);
- _dbcontext.Attach(user);
-
-
- var campaign = await _dbcontext
- .Campaigns
- .Where(campaign => campaign.CampaignId == command.CampaignId)
- .Include(c => c.InvitedUsers)
-
- .Include(c => c.Owner)
- .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)).FirstAsync();
-
-
-
- //var campaign = await _dbcontext.Campaigns.Where(campaign => campaign.CampaignId == command.CampaignId && campaign.OwnerId == command.UserId).Include(campaign => campaign.InvitedUsers).FirstAsync();
-
- var players = campaign.InvitedUsers.Select(user => new Player { Initials = user.Initials, UserName = user.UserName , UserId = new Guid(user.Id)}).ToList();
- return players;
- }
- catch (Exception ex)
- {
- }
- return null;
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs
deleted file mode 100644
index 666f17f..0000000
--- a/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using MediatR;
-using Microsoft.EntityFrameworkCore;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
-using Sledgemapper.Shared.Entities;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Sledgemapper.Api.Handlers
-{
- public class GetCampaignsCommandHandler : IRequestHandler>
- {
- private readonly IMediator _mediator;
- private readonly SledgemapperDbContext _dbcontext;
-
- public GetCampaignsCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
- {
- _mediator = mediator;
- _dbcontext = dbcontext;
- }
-
- public async Task> Handle(GetCampaignsCommand command, CancellationToken cancellationToken)
- {
- try
- {
- var user = await _dbcontext.Users.FindAsync(command.UserId);
- _dbcontext.Attach(user);
- var campaigns = await _dbcontext.Campaigns
- .Include(c => c.InvitedUsers)
- .Include(c => c.Owner)
- .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)).ToListAsync();
-
- return campaigns.Select(c => new Campaign { Id = c.CampaignId, Name = c.CampaignName }).ToList();
-
- }
- catch (Exception ex)
- {
- }
- return new List();
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs b/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs
index 14ad035..6b542c1 100644
--- a/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs
@@ -1,37 +1,36 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
using Sledgemapper.Shared.Entities;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Core.Entities;
-using Session = Sledgemapper.Shared.Entities.Session;
+using Sledgemapper.Api.Models;
-namespace Sledgemapper.Api.Handlers
+namespace Sledgemapper.Api.Commands
{
- public class GetMapSnapshotCommandHandler : IRequestHandler
+ public class GetMapSnapshotCommandHandler : IRequestHandler
{
- private readonly SledgemapperDbContext _dbcontext;
+ private readonly MyDbContext _dbcontext;
- public GetMapSnapshotCommandHandler(SledgemapperDbContext dbcontext) { _dbcontext = dbcontext; }
+ public GetMapSnapshotCommandHandler(MyDbContext dbcontext) { _dbcontext = dbcontext; }
- public async Task Handle(GetMapSnapshotCommand notification, CancellationToken cancellationToken)
+ public async Task Handle(GetMapSnapshotCommand notification, CancellationToken cancellationToken)
{
+ Snapshot snapshot;
double timestamp;
- Session mapSession;
- var session = _dbcontext.Sessions.First(m => m.SessionId == notification.MapId);
- var snapshot = _dbcontext.Snapshots.OrderByDescending(s => s.Timestamp).FirstOrDefault(m => m.SessionId == session.SessionId);
+ Sledgemapper.Shared.Entities.Session mapSession;
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+ snapshot = _dbcontext.Snapshots.OrderByDescending(s => s.Timestamp).FirstOrDefault(m => m.SessionId == session.SessionId);
if (snapshot is null)
{
timestamp = 0;
- mapSession = new Session();
+ mapSession = new Shared.Entities.Session();
}
else
{
- mapSession = JsonSerializer.Deserialize(snapshot.Object);
+ mapSession = JsonSerializer.Deserialize(snapshot.Object);
timestamp = snapshot.Timestamp;
}
@@ -58,7 +57,7 @@ namespace Sledgemapper.Api.Handlers
var note = JsonSerializer.Deserialize(mapUpdate.Object);
mapSession.NewNote(note);
break;
- case "L":
+ case "L":
var line = JsonSerializer.Deserialize(mapUpdate.Object);
mapSession.NewLine(line);
break;
@@ -66,6 +65,10 @@ namespace Sledgemapper.Api.Handlers
var room = JsonSerializer.Deserialize(mapUpdate.Object);
mapSession.NewRoom(room);
break;
+
+
+
+
}
}
@@ -98,10 +101,10 @@ namespace Sledgemapper.Api.Handlers
{
SessionId = session.SessionId,
Timestamp = mapUpdates.Max(mapSession => mapSession.Timestamp),
- Object = JsonSerializer.Serialize(mapSession)
+ Object = JsonSerializer.Serialize(mapSession)
};
- await _dbcontext.Snapshots.AddAsync(newSnapshot, cancellationToken);
- await _dbcontext.SaveChangesAsync(cancellationToken);
+ await _dbcontext.Snapshots.AddAsync(newSnapshot);
+ await _dbcontext.SaveChangesAsync();
}
return mapSession;
}
diff --git a/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs b/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs
deleted file mode 100644
index aefdac0..0000000
--- a/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediatR;
-using Microsoft.EntityFrameworkCore;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
-
-namespace Sledgemapper.Api.Handlers
-{
- public class InvitePlayerToCampaignCommandHandler : IRequestHandler
- {
- private readonly SledgemapperDbContext _dbContext;
- private readonly IMediator _mediator;
-
- public InvitePlayerToCampaignCommandHandler(IMediator mediator, SledgemapperDbContext dbContext)
- {
- _mediator = mediator;
- _dbContext = dbContext;
- }
-
- public async Task Handle(InvitePlayerToCampaignCommand command, CancellationToken cancellationToken)
- {
- try
- {
- var user = await _dbContext.Users.FindAsync(command.UserId);
-
- var campaign = await _dbContext
- .Campaigns
- .Where(campaign => campaign.CampaignId == command.CampaignId)
- .Include(c => c.InvitedUsers)
- .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user))
- .FirstAsync(cancellationToken);
-
-
- var invitedUser =
- await _dbContext.Users.FirstOrDefaultAsync(iUser => iUser.Email == command.Email,
- cancellationToken);
- _dbContext.Attach(invitedUser);
- _dbContext.Attach(campaign);
- campaign.InvitedUsers.Add(invitedUser);
-
- await _dbContext.SaveChangesAsync(cancellationToken);
- return true;
- }
- catch (Exception ex)
- {
- }
-
- return false;
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs b/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs
deleted file mode 100644
index f6b505e..0000000
--- a/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using MediatR;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Sledgemapper.Api.Core.Entities;
-
-namespace Sledgemapper.Api.Handlers
-{
- public class NewCampaignCommandHandler : IRequestHandler
- {
- private readonly IMediator _mediator;
- private readonly SledgemapperDbContext _dbcontext;
-
- public NewCampaignCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
- {
- _mediator = mediator;
- _dbcontext = dbcontext;
- }
-
- public async Task Handle(NewCampaignCommand notification, CancellationToken cancellationToken)
- {
- try
- {
- var user = await _dbcontext.Users.FindAsync(new object[] { notification.UserId }, cancellationToken);
- _dbcontext.Attach(user);
- var campaign = new Core.Entities.Campaign
- {
- CampaignName = notification.CampaignName,
- OwnerId = user.Id,
- InvitedUsers = new System.Collections.Generic.List { user }
- };
-
- _dbcontext.Campaigns.Add(campaign);
-
- await _dbcontext.SaveChangesAsync(cancellationToken);
- return true;
- }
- catch (Exception ex)
- {
-
-
- }
- return false;
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs b/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs
index c499145..4901dae 100644
--- a/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs
@@ -1,6 +1,8 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
+using Sledgemapper.Shared.Entities;
using Sledgemapper.Api.Commands;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
@@ -8,18 +10,29 @@ using Sledgemapper.Api.Notifications;
namespace Sledgemapper.Api.Handlers
{
- public class NewLineCommandHandler : BaseCommandHandler
+ public class NewLineCommandHandler : IRequestHandler
{
- public NewLineCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext)
- {
- }
+ private readonly MyDbContext _dbcontext;
- public override async Task Handle(NewLineCommand command, CancellationToken cancellationToken)
+ private readonly IMediator _mediator;
+
+ public NewLineCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+ public async Task Handle(NewLineCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Line);
- var session = await SaveLog(command, "N", "L", jsonString, cancellationToken);
- await Mediator.Publish(new NewLineNotification(session, command.Line, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Line);
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "N",
+ SessionId = session.SessionId,
+ Type = "L",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId,
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new NewLineNotification(session, notification.Line, notification.UserId));
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs b/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs
index 8be5287..5a50e45 100644
--- a/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs
@@ -1,25 +1,38 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
+using Sledgemapper.Shared.Entities;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class NewNoteCommandHandler : BaseCommandHandler
+ public class NewNoteCommandHandler : IRequestHandler
{
- public NewNoteCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
- {
- }
+ private readonly MyDbContext _dbcontext;
- public override async Task Handle(NewNoteCommand command, CancellationToken cancellationToken)
+ private readonly IMediator _mediator;
+
+ public NewNoteCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+ public async Task Handle(NewNoteCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Note);
- var session = await SaveLog(command, "N", "N", jsonString, cancellationToken);
- await Mediator.Publish(new NewNoteNotification(session, command.Note, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Note);
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "N",
+ SessionId = session.SessionId,
+ Type = "N",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId,
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new NewNoteNotification(session, notification.Note, notification.UserId));
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs b/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs
index 68a6793..817a37f 100644
--- a/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs
@@ -1,26 +1,38 @@
using MediatR;
using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Api.Data;
+using Sledgemapper.Shared.Entities;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
-
- public class NewOverlayCommandHandler : BaseCommandHandler
+ public class NewOverlayCommandHandler : IRequestHandler
{
- public NewOverlayCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
- {
- }
+ private readonly MyDbContext _dbcontext;
- public override async Task Handle(NewOverlayCommand command, CancellationToken cancellationToken)
+ private readonly IMediator _mediator;
+
+ public NewOverlayCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+ public async Task Handle(NewOverlayCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Overlay);
- var session = await SaveLog(command, "N", "O", jsonString, cancellationToken);
- await Mediator.Publish(new NewOverlayNotification(session, command.Overlay, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Overlay);
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "N",
+ SessionId = session.SessionId,
+ Type = "O",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId,
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new NewOverlayNotification(session, notification.Overlay, notification.UserId));
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs b/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs
index f5093ba..73561a1 100644
--- a/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs
@@ -1,6 +1,8 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
+using Sledgemapper.Shared.Entities;
using Sledgemapper.Api.Commands;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
@@ -8,17 +10,29 @@ using Sledgemapper.Api.Notifications;
namespace Sledgemapper.Api.Handlers
{
- public class NewRoomCommandHandler : BaseCommandHandler
+ public class NewRoomCommandHandler : IRequestHandler
{
- public NewRoomCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
- { }
+ private readonly MyDbContext _dbcontext;
- public override async Task Handle(NewRoomCommand command, CancellationToken cancellationToken)
+ private readonly IMediator _mediator;
+
+ public NewRoomCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+ public async Task Handle(NewRoomCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Room);
- var session = await SaveLog(command, "N", "R", jsonString, cancellationToken);
- await Mediator.Publish(new NewRoomNotification(session, command.Room, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Room);
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "N",
+ SessionId = session.SessionId,
+ Type = "R",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId,
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new NewRoomNotification(session, notification.Room, notification.UserId));
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs b/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs
index 941fbb6..e6d88e0 100644
--- a/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs
@@ -1,37 +1,34 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Core.Entities;
-namespace Sledgemapper.Api.Handlers
+namespace Sledgemapper.Api.Commands
{
public class NewSnapshotCommandHandler : IRequestHandler
{
- private readonly SledgemapperDbContext _dbcontext;
+ private readonly MyDbContext _dbcontext;
private readonly IMediator _mediator;
- public NewSnapshotCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+ public NewSnapshotCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
public async Task Handle(NewSnapshotCommand notification, CancellationToken cancellationToken)
{
-
+
var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
- var newSnapshot = new Snapshot
- {
- SessionId = session.SessionId,
- Timestamp = notification.Timestamp,
- Object = JsonSerializer.Serialize(notification.Session)
-
- };
- await _dbcontext.Snapshots.AddAsync(newSnapshot, cancellationToken);
- await _dbcontext.SaveChangesAsync(cancellationToken);
+ var newSnapshot = new Sledgemapper.Api.Models.Snapshot{
+ SessionId=session.SessionId,
+ Timestamp=notification.Timestamp,
+ Object = JsonSerializer.Serialize(notification.Session)
+};
+await _dbcontext.Snapshots.AddAsync(newSnapshot);
+ await _dbcontext.SaveChangesAsync();
+
return true;
}
diff --git a/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs b/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs
index 5db3d32..3169384 100644
--- a/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs
@@ -1,26 +1,41 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
+
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Api.Commands;
+using System.Linq;
+using Sledgemapper.Shared.Entities;
-namespace Sledgemapper.Api.Handlers
+namespace Sledgemapper.Api.Commands
{
- public class NewTileCommandHandler : BaseCommandHandler
+ public class NewTileCommandHandler : IRequestHandler
{
- public NewTileCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext)
- {
- }
+ private readonly MyDbContext _dbcontext;
+ private readonly IMediator _mediator;
- public override async Task Handle(NewTileCommand command, CancellationToken cancellationToken)
+ public NewTileCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+ public async Task Handle(NewTileCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Tile);
- var session = await SaveLog(command, "N", "T", jsonString, cancellationToken);
- await Mediator.Publish(new NewTileNotification(session, command.Tile, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Tile);
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "N",
+ SessionId = session.SessionId,
+ Type = "T",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new NewTileNotification(session, notification.Tile, notification.UserId));
return true;
}
+
+
}
}
diff --git a/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs b/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs
index c2c480d..af69b69 100644
--- a/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs
@@ -1,25 +1,38 @@
using MediatR;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
+using Sledgemapper.Shared.Entities;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
+using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class NewWallCommandHandler : BaseCommandHandler
+ public class NewWallCommandHandler : IRequestHandler
{
- public NewWallCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext)
- {
- }
+ private readonly MyDbContext _dbcontext;
- public override async Task Handle(NewWallCommand command, CancellationToken cancellationToken)
+ private readonly IMediator _mediator;
+
+ public NewWallCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+
+ public async Task Handle(NewWallCommand notification, CancellationToken cancellationToken)
{
- await CheckAuthorization(command);
- var jsonString = JsonSerializer.Serialize(command.Wall);
- var session = await SaveLog(command, "N", "W", jsonString, cancellationToken);
- await Mediator.Publish(new NewWallNotification(session, command.Wall, command.UserId), cancellationToken);
+ var jsonString = JsonSerializer.Serialize(notification.Wall);
+ var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+ _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
+ {
+ Operation = "N",
+ SessionId = session.SessionId,
+ Type = "W",
+ Timestamp = notification.Timestamp,
+ Object = jsonString,
+ UserId = notification.UserId,
+ });
+ await _dbcontext.SaveChangesAsync();
+ await _mediator.Publish(new NewWallNotification(session, notification.Wall, notification.UserId));
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs
index 1c66299..1f6a112 100644
--- a/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs
@@ -1,6 +1,6 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
-using Sledgemapper.Shared.Clients;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(DeleteNoteNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteNote(notification.Note);
+ await _hub.Clients.Groups(notification.Session.SessionName).DeleteNote(notification.Note);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs
index 35b07aa..cb0b922 100644
--- a/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs
@@ -2,9 +2,9 @@ using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Hubs;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(DeleteOverlayNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteOverlay(notification.Overlay);
+ await _hub.Clients.Groups(notification.Session.SessionName).DeleteOverlay(notification.Overlay);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs
index 78f07ee..75c0c03 100644
--- a/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs
@@ -2,9 +2,9 @@ using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Hubs;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(DeleteTileNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteTile(notification.Tile);
+ await _hub.Clients.Groups(notification.Session.SessionName).DeleteTile(notification.Tile);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs
index 99f4e2a..e853012 100644
--- a/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(DeleteWallNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteWall(notification.Wall);
+ await _hub.Clients.Groups(notification.Session.SessionName).DeleteWall(notification.Wall);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewLineMessage.cs b/Sledgemapper.Api/Handlers/SendNewLineMessage.cs
index 1447351..e0e9c86 100644
--- a/Sledgemapper.Api/Handlers/SendNewLineMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewLineMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewLineNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewLine(notification.Line);
+ await _hub.Clients.Groups(notification.Session.SessionName).NewLine(notification.Line);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs b/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs
index 88eafe6..37e9f5a 100644
--- a/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewNoteNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewNote(notification.Note);
+ await _hub.Clients.Groups(notification.Session.SessionName).NewNote(notification.Note);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs b/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs
index 782742e..6cfe0ef 100644
--- a/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs
@@ -2,9 +2,9 @@ using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Hubs;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewOverlayNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewOverlay(notification.Overlay);
+ await _hub.Clients.Groups(notification.Session.SessionName).NewOverlay(notification.Overlay);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs b/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs
index e8dcd7e..adbf4ec 100644
--- a/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewRoomNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewRoom(notification.Room);
+ await _hub.Clients.Groups(notification.Session.SessionName).NewRoom(notification.Room);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewTileMessage.cs b/Sledgemapper.Api/Handlers/SendNewTileMessage.cs
index 268bc99..7fa2541 100644
--- a/Sledgemapper.Api/Handlers/SendNewTileMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewTileMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -17,7 +17,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewTileNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewTile(notification.Tile);
+ await _hub.Clients.Groups(notification.Session.SessionName).NewTile(notification.Tile);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewWallMessage.cs b/Sledgemapper.Api/Handlers/SendNewWallMessage.cs
index 0ed117a..34d5567 100644
--- a/Sledgemapper.Api/Handlers/SendNewWallMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewWallMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
+using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
-using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewWallNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewWall(notification.Wall);
+ await _hub.Clients.Groups(notification.Session.SessionName).NewWall(notification.Wall);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs b/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs
index a9d687e..211b019 100644
--- a/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs
+++ b/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs
@@ -1,37 +1,32 @@
using MediatR;
using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
using Sledgemapper.Api.Models;
-using System;
using System.Threading;
using System.Threading.Tasks;
-using Sledgemapper.Api.Core.Entities;
namespace Sledgemapper.Api.Handlers
{
- public class StartNewSessionHandler : BaseCommandHandler
+ public class StartNewSessionHandler : IRequestHandler
{
-
+ private readonly IMediator _mediator;
+ private readonly MyDbContext _dbcontext;
- public StartNewSessionHandler(IMediator mediator, SledgemapperDbContext dbcontext):base(mediator, dbcontext)
+ public StartNewSessionHandler(IMediator mediator, MyDbContext dbcontext)
{
-
+ _mediator = mediator;
+ _dbcontext = dbcontext;
}
- public override async Task Handle(NewSessionCommand command, CancellationToken cancellationToken)
+ public async Task Handle(NewSessionCommand notification, CancellationToken cancellationToken)
{
- var campaign = await GetCampaignForUser(command);
-
- var session = new Session
+ _dbcontext.Sessions.Add(new Session
{
- SessionName = command.SessionName,
- OwnerUserId = command.UserId,
- CampaignId = campaign.CampaignId
-
- };
- DbContext.Sessions.Add(session);
- await DbContext.SaveChangesAsync(cancellationToken);
- return session.SessionId;
+ SessionName = notification.SessionName,
+ OwnerUserId = notification.UserId
+ });
+ await _dbcontext.SaveChangesAsync();
+ return true;
}
}
}
diff --git a/Sledgemapper.Api/Helpers/AppException.cs b/Sledgemapper.Api/Helpers/AppException.cs
index 957826f..c9601e5 100644
--- a/Sledgemapper.Api/Helpers/AppException.cs
+++ b/Sledgemapper.Api/Helpers/AppException.cs
@@ -1,17 +1,17 @@
using System;
using System.Globalization;
-namespace Sledgemapper.Api.Helpers
+namespace Sledgemapper.Helpers
{
// Custom exception class for throwing application specific exceptions (e.g. for validation)
// that can be caught and handled within the application
public class AppException : Exception
{
- public AppException() : base() { }
+ public AppException() : base() {}
public AppException(string message) : base(message) { }
- public AppException(string message, params object[] args)
+ public AppException(string message, params object[] args)
: base(string.Format(CultureInfo.CurrentCulture, message, args))
{
}
diff --git a/Sledgemapper.Api/Helpers/AppSettings.cs b/Sledgemapper.Api/Helpers/AppSettings.cs
new file mode 100644
index 0000000..bcf36f3
--- /dev/null
+++ b/Sledgemapper.Api/Helpers/AppSettings.cs
@@ -0,0 +1,7 @@
+namespace Sledgemapper.Helpers
+{
+ public class AppSettings
+ {
+ public string Secret { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Helpers/AutoMapperProfile.cs b/Sledgemapper.Api/Helpers/AutoMapperProfile.cs
index 1fc8edb..fe86397 100644
--- a/Sledgemapper.Api/Helpers/AutoMapperProfile.cs
+++ b/Sledgemapper.Api/Helpers/AutoMapperProfile.cs
@@ -1,14 +1,16 @@
using AutoMapper;
-using Sledgemapper.Api.Core.Entities;
-using Sledgemapper.Api.Models;
+using Sledgemapper.Entities;
+using Sledgemapper.Models.Users;
-namespace Sledgemapper.Api.Helpers
+namespace Sledgemapper.Helpers
{
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
+ CreateMap();
CreateMap();
+ CreateMap();
}
}
}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Helpers/DataContext.cs b/Sledgemapper.Api/Helpers/DataContext.cs
new file mode 100644
index 0000000..905b1b2
--- /dev/null
+++ b/Sledgemapper.Api/Helpers/DataContext.cs
@@ -0,0 +1,24 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
+using Sledgemapper.Entities;
+
+namespace Sledgemapper.Helpers
+{
+ public class DataContext : DbContext
+ {
+ protected readonly IConfiguration Configuration;
+
+ public DataContext(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ protected override void OnConfiguring(DbContextOptionsBuilder options)
+ {
+ // connect to sql server database
+ options.UseSqlServer(Configuration.GetConnectionString("WebApiDatabase"));
+ }
+
+ public DbSet Users { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Helpers/SqliteDataContext.cs b/Sledgemapper.Api/Helpers/SqliteDataContext.cs
new file mode 100644
index 0000000..5b799b9
--- /dev/null
+++ b/Sledgemapper.Api/Helpers/SqliteDataContext.cs
@@ -0,0 +1,16 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
+
+namespace Sledgemapper.Helpers
+{
+ public class SqliteDataContext : DataContext
+ {
+ public SqliteDataContext(IConfiguration configuration) : base(configuration) { }
+
+ protected override void OnConfiguring(DbContextOptionsBuilder options)
+ {
+ // connect to sqlite database
+ options.UseSqlite(Configuration.GetConnectionString("WebApiDatabase"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Hubs/SledgemapperHub.cs b/Sledgemapper.Api/Hubs/SledgemapperHub.cs
index 9484d99..c356461 100644
--- a/Sledgemapper.Api/Hubs/SledgemapperHub.cs
+++ b/Sledgemapper.Api/Hubs/SledgemapperHub.cs
@@ -4,24 +4,26 @@ using System.Linq;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using Sledgemapper.Shared.Entities;
+using Sledgemapper.Clients;
using System;
-using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Api.Data;
using Microsoft.AspNetCore.Authorization;
-using Sledgemapper.Api.Core.Entities;
using Sledgemapper.Api.Models;
-using Sledgemapper.Shared.Clients;
+using Sledgemapper.Helpers;
namespace Sledgemapper.Api.Hubs
{
[Authorize]
public class SledgemapperHub : Hub
{
- private static readonly ConcurrentDictionary UserColors = new();
- private readonly SledgemapperDbContext _dbContext;
+ private static readonly ConcurrentDictionary UserColors = new();
+ private readonly MyDbContext _dbContext;
+ private readonly DataContext _datacontext;
- public SledgemapperHub(SledgemapperDbContext dbContext/*, DataContext datacontext*/)
+ public SledgemapperHub(MyDbContext dbContext, DataContext datacontext)
{
_dbContext = dbContext;
+ _datacontext = datacontext;
}
// other colors
@@ -49,7 +51,7 @@ namespace Sledgemapper.Api.Hubs
await Clients.Group(sessionName).NewRoom(room);
}
- public async Task NewLine(string sessionName, Line line)
+ public async Task NewLine(string sessionName, Line line)
{
await Clients.Group(sessionName).NewLine(line);
}
@@ -59,9 +61,9 @@ namespace Sledgemapper.Api.Hubs
await Clients.Group(sessionName).NewWall(tile);
}
- public async Task NewOverlay(Guid mapId, Overlay tile)
+ public async Task NewOverlay(string sessionName, Overlay tile)
{
- await Clients.Group(mapId.ToString()).NewOverlay(tile);
+ await Clients.Group(sessionName).NewOverlay(tile);
}
public async Task NewNote(string sessionName, Note note)
@@ -84,70 +86,54 @@ namespace Sledgemapper.Api.Hubs
await Clients.Group(sessionName).DeleteOverlay(tile);
}
- public async Task Ping(string sessionName, Tile location)
+ public async Task JoinSession(string sessionName)
{
- var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value);
-
- var user = _dbContext.Users.First(u => u.Id == userId.ToString());
-
- var player = new Player { UserId = userId, Initials = user.Initials, Position = new Tile { X = 0, Y = 0 }, Color = UserColors[userId] };
- await Clients.Group(sessionName).Ping(new Ping { X = location.X, Y = location.Y, Player = player });
- }
-
- public async Task JoinSession(Guid mapId)
- {
- var session = _dbContext.Sessions.FirstOrDefault(s => s.SessionId == mapId);
-
- var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value);
+ var session = _dbContext.Sessions.FirstOrDefault(s => s.SessionName == sessionName);
+ var userId = int.Parse(Context.User.Identity.Name);
if (session != null)
{
var userSession = new SessionUser { SessionId = session.SessionId, UserId = userId };
_dbContext.SessionUsers.Add(userSession);
await _dbContext.SaveChangesAsync();
- await Groups.AddToGroupAsync(Context.ConnectionId, session.SessionId.ToString());
- var user = _dbContext.Users.First(u => u.Id == userId.ToString());
+ await Groups.AddToGroupAsync(Context.ConnectionId, session.SessionName);
+ var user = _datacontext.Users.First(u => u.Id == userId);
var player = new Player { UserId = userId, Initials = user.Initials, Position = new Tile { X = 0, Y = 0 }, Color = UserColors[userId] };
- await Clients.Group(session.SessionId.ToString()).NewPlayer(player);
- await Clients.Group(session.SessionId.ToString()).RefreshPlayers();
+ await Clients.Group(session.SessionName).NewPlayer(player);
+ await Clients.Group(session.SessionName).RefreshPlayers();
+ var newSession = new Sledgemapper.Shared.Entities.Session
+ {
+ SessionName = session.SessionName,
+ SessionId = session.SessionId
+ };
-
- return true;
+ return newSession;
}
else
{
- return false;
+ return null;
}
}
- //public async Task UpdatePosition(string sessionName, int sessionId, Tile tile)
- //{
- // //var userId = int.Parse(Context.User.Identity.Name);
- // //var SessionUsers = _dbContext.SessionUsers.Where(m => m.SessionId == sessionId).OrderBy(m => m.UserId).ToList();
- // //var user = _dbContext.Users.First(u => u.Id == Context.User.Identity.Name);
- // //var player = new Player { UserId = userId, Initials = user.Initials, Position = tile, Color = UserColors[userId] };
- // //await Clients.Group(sessionName).PlayerUpdate(player);
- //}
-
- public async Task UpdatePosition(string sessionName, Guid sessionId, Tile tile)
+ public async Task UpdatePosition(string sessionName, int sessionId, Tile tile)
{
- var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value);
- var sessionUsers = _dbContext.SessionUsers.Where(m => m.SessionId == sessionId).OrderBy(m => m.UserId).ToList();
- var user = _dbContext.Users.First(u => u.Id == userId.ToString());
+ var userId = int.Parse(Context.User.Identity.Name);
+ var SessionUsers = _dbContext.SessionUsers.Where(m => m.SessionId == sessionId).OrderBy(m => m.UserId).ToList();
+ var user = _datacontext.Users.First(u => u.Id == userId);
var player = new Player { UserId = userId, Initials = user.Initials, Position = tile, Color = UserColors[userId] };
- await Clients.Group(sessionId.ToString()).PlayerUpdate(player);
+ await Clients.Group(sessionName).PlayerUpdate(player);
}
public override async Task OnConnectedAsync()
{
- var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value);
+ var userId = int.Parse(Context.User.Identity.Name);
var userConnection = new UserConnection { ConnectionId = Context.ConnectionId, UserId = userId };
_dbContext.UserConnections.Add(userConnection);
await _dbContext.SaveChangesAsync();
- var availableColor = Colors.First(m => !UserColors.Values.Contains(m));
+ var availableColor = Colors.Where(m => !UserColors.Values.Contains(m)).First();
UserColors.AddOrUpdate(userId, availableColor, (key, oldValue) => availableColor);
await base.OnConnectedAsync();
}
@@ -155,37 +141,26 @@ namespace Sledgemapper.Api.Hubs
public override async Task OnDisconnectedAsync(Exception exception)
{
var userConnection = _dbContext.UserConnections.FirstOrDefault(m => m.ConnectionId == Context.ConnectionId);
+ var userId = userConnection.UserId;
if (userConnection != null)
{
- var userId = userConnection.UserId;
-
_dbContext.UserConnections.Remove(userConnection);
-
- var userSessions = _dbContext.SessionUsers.Where(m => m.UserId == userId).ToList();
- {
- foreach (var userSession in userSessions)
- {
- var session = _dbContext.Sessions.FirstOrDefault(m => m.SessionId == userSession.SessionId);
- if (session != null)
- {
-
- try
- {
- await Clients.GroupExcept(session.SessionId.ToString(), new List { Context.ConnectionId }).RemovePlayer(new Player { UserId = userId }); //send remove player
- }
- catch (Exception e)
- {
- Console.WriteLine(e);
- }
- _dbContext.SessionUsers.Remove(userSession);
- }
-
- }
- }
- await _dbContext.SaveChangesAsync();
-
- await base.OnDisconnectedAsync(exception);
}
+
+ var userSessions = _dbContext.SessionUsers.Where(m => m.UserId == userId).ToList();
+ {
+ foreach (var userSession in userSessions)
+ {
+ var session = _dbContext.Sessions.FirstOrDefault(m => m.SessionId == userSession.SessionId);
+
+ await Clients.Group(session.SessionName).RemovePlayer(new Player { UserId = userId }); //send remove player
+ _dbContext.SessionUsers.Remove(userSession);
+ }
+ }
+ await _dbContext.SaveChangesAsync();
+
+ await base.OnDisconnectedAsync(exception);
+
}
}
}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs b/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs
deleted file mode 100644
index 195b192..0000000
--- a/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore;
-using Sledgemapper.Api.Core.Entities;
-
-namespace Sledgemapper.Api.Infrastructure.Data
-{
- // public static class DbInitializer
- // {
- // public static void Initialize(SledgemapperDbContext context)
- // {
- // context.Database.EnsureCreated();
- // }
- // }
-
- public class SledgemapperDbContext : IdentityDbContext
- {
- public DbSet Campaigns { get; set; }
- public DbSet MapLogs { get; set; }
- public DbSet