Browse Source

upd pokemons

MX 2 years ago
parent
commit
24fde89639
62 changed files with 1910 additions and 954 deletions
  1. BIN
      .flipcorg/banner.png
  2. BIN
      .flipcorg/gallery/1.png
  3. BIN
      .flipcorg/gallery/2.png
  4. BIN
      .flipcorg/gallery/3.png
  5. BIN
      .flipcorg/gallery/4.png
  6. BIN
      .flipcorg/gallery/5.png
  7. BIN
      .flipcorg/gallery/6.png
  8. 95 20
      README.md
  9. 2 2
      application.fam
  10. BIN
      docs/images/EXT-Link.png
  11. BIN
      docs/images/GPIO-GBPIN-v2.png
  12. BIN
      docs/images/GPIO-GBPIN_light-v2.png
  13. BIN
      docs/images/back.png
  14. 0 9
      docs/images/back.svg
  15. BIN
      docs/images/cut-cable-v3.png
  16. BIN
      docs/images/dmg_link_port_pinout.png
  17. BIN
      docs/images/flipper-zero-flat-1.png
  18. BIN
      docs/images/flipper-zero-flat-2.png
  19. BIN
      docs/images/flipper-zero-flat-3.png
  20. BIN
      docs/images/flipper-zero-flat-4.png
  21. BIN
      docs/images/flipper-zero-flat-5.png
  22. BIN
      docs/images/flipper-zero-flat-6.png
  23. BIN
      docs/images/flipper-zero-flat-7.png
  24. BIN
      docs/images/flipper-zero-flat.png
  25. BIN
      docs/images/flipper-zero-flat.psd
  26. BIN
      docs/images/flipper-zero-pcb.png
  27. BIN
      docs/images/game_boy_pokemon_center.png
  28. BIN
      docs/images/game_boy_save.png
  29. BIN
      docs/images/game_boy_save_trade.png
  30. BIN
      docs/images/game_boy_trade_list.png
  31. BIN
      docs/images/game_boy_trade_list_select_trade.png
  32. BIN
      docs/images/game_boy_trade_list_select_trade_confirm.png
  33. BIN
      docs/images/game_boy_trade_room.png
  34. BIN
      docs/images/game_boy_trade_room_2.png
  35. BIN
      docs/images/gb_spi.png
  36. BIN
      docs/images/gblpof.gif
  37. 0 7
      docs/images/implemented.svg
  38. BIN
      docs/images/left.png
  39. 0 6
      docs/images/left.svg
  40. BIN
      docs/images/pcb.png
  41. BIN
      docs/images/qFlipper.png
  42. BIN
      docs/images/reboot.png
  43. BIN
      docs/images/wgbl-0.png
  44. 0 744
      docs/images/white_flat.svg
  45. BIN
      docs/images/youtube.png
  46. 250 151
      pokemon_app.cpp
  47. 46 0
      pokemon_app.h
  48. 13 14
      pokemon_data.h
  49. 170 0
      views/select_level.cpp
  50. 25 0
      views/select_level.hpp
  51. 172 0
      views/select_move1.cpp
  52. 25 0
      views/select_move1.hpp
  53. 173 0
      views/select_move2.cpp
  54. 25 0
      views/select_move2.hpp
  55. 174 0
      views/select_move3.cpp
  56. 25 0
      views/select_move3.hpp
  57. 174 0
      views/select_move4.cpp
  58. 25 0
      views/select_move4.hpp
  59. 2 1
      views/select_pokemon.cpp
  60. 195 0
      views/select_stats.cpp
  61. 25 0
      views/select_stats.hpp
  62. 294 0
      views/trade.cpp

BIN
.flipcorg/banner.png


BIN
.flipcorg/gallery/1.png


BIN
.flipcorg/gallery/2.png


BIN
.flipcorg/gallery/3.png


BIN
.flipcorg/gallery/4.png


BIN
.flipcorg/gallery/5.png


BIN
.flipcorg/gallery/6.png


+ 95 - 20
README.md

@@ -16,9 +16,9 @@
 
 
 ## Introduction
 ## Introduction
 
 
-This is a Pokemon exchange application from Flipper Zero to Game Boy [(Generacn I)](https://bulbapedia.bulbagarden.net/wiki/Generation_I). Flipper Zero emulates a "Slave" Game Boy connected to a Game Link Cable to be able to exchange any Pokemon from the First Generation (Red, Blue, Yellow) to a real Game Boy.
+This is a Pokemon exchange application from Flipper Zero to Game Boy [(Generaction I)](https://bulbapedia.bulbagarden.net/wiki/Generation_I). Flipper Zero emulates a "Slave" Game Boy connected to a Game Link Cable to be able to exchange any Pokemon from the First Generation (Red, Blue, Yellow) to a real Game Boy.
 
 
-It is a Proof of Concept (POC) for using views, GPIO, and FURI (Flipper Universal Registry Implementation).
+It currently trades a Pokemon based on your choice of Pokemon, Level, Stats and 4 Moves.
 
 
 ## Installation Directions
 ## Installation Directions
 
 
@@ -49,7 +49,7 @@ And use [**qFlipper**](https://flipperzero.one/update) to copy the generated **p
 These instructions assume that you are starting at the Flipper Zero desktop. Otherwise, press the Back button until you are at the desktop.
 These instructions assume that you are starting at the Flipper Zero desktop. Otherwise, press the Back button until you are at the desktop.
 
 
 - Press the `OK` button on the Flipper to open the main menu.
 - Press the `OK` button on the Flipper to open the main menu.
-- Choose `Aplicaciones` from the menu.
+- Choose `Applications` from the menu.
 - Choose `Game Boy` from the submenu.
 - Choose `Game Boy` from the submenu.
 - Choose `Pokemon Trading`
 - Choose `Pokemon Trading`
 - The Flipper Zero should show the selection of Pokemon that you want to trade, and by default, it appears as bulbasaur.
 - The Flipper Zero should show the selection of Pokemon that you want to trade, and by default, it appears as bulbasaur.
@@ -63,69 +63,145 @@ These instructions assume that you are starting at the Flipper Zero desktop. Oth
 - Press the `LEFT`/`RIGHT` buttons to paginate the selection of Pokemon by 1.
 - Press the `LEFT`/`RIGHT` buttons to paginate the selection of Pokemon by 1.
 - Press the `UP`/`DOWN` buttons to paginate the selection of Pokemon by 10.
 - Press the `UP`/`DOWN` buttons to paginate the selection of Pokemon by 10.
 - Press the `OK` button to select the Pokemon to trade.
 - Press the `OK` button to select the Pokemon to trade.
+
     <p align='center'>
     <p align='center'>
          <br />
          <br />
         <img src="./docs/images/flipper-zero-flat-2.png" width="400" /><br />
         <img src="./docs/images/flipper-zero-flat-2.png" width="400" /><br />
     </p>
     </p>
+
+- The Flipper Zero should show the selection of the Pokemon's level that you want to trade, and by default, it appears as level 1.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-3.png" width="400" />
+        <br />
+    </p>
+
+- Press the `LEFT`/`RIGHT` buttons to paginate the selection of the Pokemon's level by 1.
+- Press the `UP`/`DOWN` buttons to paginate the selection of the Pokemon's level by 10.
+- Press the `OK` button to select the Pokemon's level to trade.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-4.png" width="400" />
+        <br />
+    </p>
+
+- The Flipper Zero should show the selection for the Pokemon's moves that you want to trade, this will happen 4 times with default bing no move.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-5.png" width="400" />
+        <br />
+    </p>
+
+- Press the `LEFT`/`RIGHT` buttons to paginate the selection of the Pokemon's current move selection by 1.
+- Press the `UP`/`DOWN` buttons to paginate the selection of the Pokemon's current move selection by 10.
+- Press the `OK` button to select the Pokemon's current move selection to trade.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-6.png" width="400" />
+        <br />
+    </p>
+
+- The Flipper Zero should show the selection for the Pokemon's stats that you want to trade, and by default, it appears as random IV and zero EV.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-7.png" width="400" />
+        <br />
+    </p>
+
+- Press the `RIGHT`/`UP` buttons to paginate the selection of the Pokemon's stats selection by 1 positively.
+- Press the `LEFT`/`DOWN` buttons to paginate the selection of the Pokemon's stats selection by 1 negatively.
+- Press the `OK` button to select the Pokemon's current move selection to trade.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-8.png" width="400" />
+        <br />
+    </p>
+
 - The Flipper Zero will display the view to connect the Game Boy.
 - The Flipper Zero will display the view to connect the Game Boy.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-3.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-9.png" width="400" /><br />
     </p>
     </p>
+
 - On your Game Boy, you should connect the  **Game Link Cable** to the Game Boy and in the game, go to the nearest  **Pokemon Center**.
 - On your Game Boy, you should connect the  **Game Link Cable** to the Game Boy and in the game, go to the nearest  **Pokemon Center**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_pokemon_center.png" width="400" /><br />
         <img src="./docs/images/game_boy_pokemon_center.png" width="400" /><br />
     </p>
     </p>
+
 - Talk to the girl at the counter on the right. The girl will tell us that we have to save the game before playing, we will answer **YES** by pressing the **A** button.
 - Talk to the girl at the counter on the right. The girl will tell us that we have to save the game before playing, we will answer **YES** by pressing the **A** button.
 
 
-.
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_save.png" width="400" /><br />
         <img src="./docs/images/game_boy_save.png" width="400" /><br />
     </p>
     </p>
+
 - The Flipper Zero will show that we are connected.
 - The Flipper Zero will show that we are connected.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-4.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-10.png" width="400" /><br />
     </p>
     </p>
+
 - On the Game Boy, we will be asked which option we want, and we select **TRADE CENTER**.
 - On the Game Boy, we will be asked which option we want, and we select **TRADE CENTER**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_save_trade.png" width="400" /><br />
         <img src="./docs/images/game_boy_save_trade.png" width="400" /><br />
     </p>
     </p>
+
 - You will enter the Trade Center where you must press the A button on the Game Boy on your side of the table.
 - You will enter the Trade Center where you must press the A button on the Game Boy on your side of the table.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_trade_room_2.png" width="400" /><br />
         <img src="./docs/images/game_boy_trade_room_2.png" width="400" /><br />
     </p>
     </p>
+
 - Flipper Zero will remain on a waiting screen with the Pokemon you selected.
 - Flipper Zero will remain on a waiting screen with the Pokemon you selected.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-5.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-10.png" width="400" /><br />
     </p>
     </p>
+
 - You will see your Pokemon and the Pokemon you selected on the Flipper Zero, in this case, `Mew`. You must select the Pokemon you want to trade and press **TRADE**.
 - You will see your Pokemon and the Pokemon you selected on the Flipper Zero, in this case, `Mew`. You must select the Pokemon you want to trade and press **TRADE**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_trade_list_select_trade.png" width="400" /><br />
         <img src="./docs/images/game_boy_trade_list_select_trade.png" width="400" /><br />
     </p>
     </p>
+
 - You must confirm the selected trade by selecting **TRADE**.
 - You must confirm the selected trade by selecting **TRADE**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_trade_list_select_trade_confirm.png" width="400" /><br />
         <img src="./docs/images/game_boy_trade_list_select_trade_confirm.png" width="400" /><br />
     </p>
     </p>
+
 - Flipper Zero will remain on a waiting screen with the Pokemon you selected.
 - Flipper Zero will remain on a waiting screen with the Pokemon you selected.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-6.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-11.png" width="400" /><br />
     </p>
     </p>
+
 - Finally, the Pokemon exchange will start from **Flipper Zero** to the **Game Boy**.
 - Finally, the Pokemon exchange will start from **Flipper Zero** to the **Game Boy**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-7.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-12.png" width="400" /><br />
     </p>
     </p>
 
 
     If the Flipper Zero gets stuck at the end of the exchange, you must reboot it by pressing the <img src="./docs/images/left.png" /> LEFT + <img src="./docs/images/back.png" /> BACK key combination.
     If the Flipper Zero gets stuck at the end of the exchange, you must reboot it by pressing the <img src="./docs/images/left.png" /> LEFT + <img src="./docs/images/back.png" /> BACK key combination.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/reboot.png" width="400" /><br />
         <img src="./docs/images/reboot.png" width="400" /><br />
@@ -226,13 +302,18 @@ For each image, the color `#aaa` was transformed to `#fff` so that Flipper Zero
 - Game Boy Advance (GBA)
 - Game Boy Advance (GBA)
 
 
 ## Implemented by
 ## Implemented by
-<a href="https://github.com/EstebanFuentealba/Flipper-Zero-Game-Boy-Pokemon-Trading/issues?q=is%3Aissue+label%3AImplemented+is%3Aclosed+is%3Aopen+" target="_blank"><img src="./docs/images/implemented.svg" /></a>
+<a href="https://github.com/EstebanFuentealba/Flipper-Zero-Game-Boy-Pokemon-Trading/">EstebanFuentealba</a><br />
+<a href="https://github.com/R4g3D/Flipper-Zero-Game-Boy-Pokemon-Trading/">R4g3D</a>
 
 
 ## TODO
 ## TODO
-- [ ] Refactor the code
-- [x] The OK button stops working when exiting the app, so it needs to be restarted 🤔
-- [ ] Set each Pokemon's characteristics, attacks, and default levels
-- [ ] Improve animations
+- [x] Change the default traded Pokemon's naming to be no nickname
+- [x] Add view to allow the traded Pokemon's level to be chosen between 3 and 100
+- [x] Add view to allow the traded Pokemon's hidden stats to be chosen (IV and EV) from some options
+- [x] Add view to allow the traded Pokemon's moveset to be chosen (all 4 moves) allowing no move as an option
+- [ ] Debug traded Pokemon level issue where after a battle the Pokemon's level drops (doesn't affect all traded Pokemon)
+- [x] Add images for the level selection screen, stats selection screen, and move selection screens as per the original README
+- [ ] Optimise the level selection screen to be a number slider input instead of the current slideshow style selector
+- [ ] Add a view to allow for a custom Pokemon nickname (11 chars, 10 chars max used, fill and terminate with TERM_)
 
 
 ## Links
 ## Links
 
 
@@ -244,9 +325,3 @@ For each image, the color `#aaa` was transformed to `#fff` so that Flipper Zero
 - [Disassembly of Pokemon Yellow](https://github.com/pret/pokeyellow)
 - [Disassembly of Pokemon Yellow](https://github.com/pret/pokeyellow)
 - [Arduino-Spoofing-Gameboy-Pokemon-Trades](https://github.com/EstebanFuentealba/Arduino-Spoofing-Gameboy-Pokemon-Trades)
 - [Arduino-Spoofing-Gameboy-Pokemon-Trades](https://github.com/EstebanFuentealba/Arduino-Spoofing-Gameboy-Pokemon-Trades)
 - [🎮 Gameboy link cable breakout PCB](https://github.com/Palmr/gb-link-cable)
 - [🎮 Gameboy link cable breakout PCB](https://github.com/Palmr/gb-link-cable)
-
-<p align='center'>
-<br />
-<br />
-From Talcahuano 🇨🇱 with ❤ 
-</p>

+ 2 - 2
application.fam

@@ -5,10 +5,10 @@ App(
     entry_point="pokemon_app",
     entry_point="pokemon_app",
     requires=["gui"],
     requires=["gui"],
     stack_size=2 * 1024,
     stack_size=2 * 1024,
-    fap_version=[1, 2],
+    fap_version=[1,2],
     fap_category="GPIO",
     fap_category="GPIO",
     fap_icon="pokemon_10px.png",
     fap_icon="pokemon_10px.png",
     fap_icon_assets="assets",
     fap_icon_assets="assets",
     fap_author="Esteban Fuentealba",
     fap_author="Esteban Fuentealba",
-    fap_weburl="https://github.com/EstebanFuentealba",
+    fap_weburl="https://github.com/EstebanFuentealba"
 )
 )

BIN
docs/images/EXT-Link.png


BIN
docs/images/GPIO-GBPIN-v2.png


BIN
docs/images/GPIO-GBPIN_light-v2.png


BIN
docs/images/back.png


+ 0 - 9
docs/images/back.svg

@@ -1,9 +0,0 @@
-<svg style="display:inline;fill:currentColor;stroke:currentColor;stroke-width:0.55px;"
-    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
-    width="24" height="24" viewBox="0 0 24 24">
-    <path
-        d="M22,12C22,6.514 17.486,2 12,2C6.514,2 2,6.514 2,12C2,17.486 6.514,22 12,22C17.486,22 22,17.486 22,12M20,12C20,16.389 16.389,20 12,20C7.611,20 4,16.389 4,12C4,7.611 7.611,4 12,4C16.389,4 20,7.611 20,12"></path>
-    <path
-        d="M7.154,9.781L9.62,8L9.62,9.096L14.004,9.096C15.874,9.096 17.154,10.969 17.154,12.52C17.154,14.333 15.959,15.945 14.278,15.945L9.757,15.945L9.757,14.712L14.141,14.712C15.224,14.712 15.785,13.409 15.785,12.657C15.785,11.906 15.425,10.466 14.141,10.466L9.62,10.466L9.62,11.425L7.154,9.781Z"
-        style="stroke-width:0.55px;"></path>
-</svg>

BIN
docs/images/cut-cable-v3.png


BIN
docs/images/dmg_link_port_pinout.png


BIN
docs/images/flipper-zero-flat-1.png


BIN
docs/images/flipper-zero-flat-2.png


BIN
docs/images/flipper-zero-flat-3.png


BIN
docs/images/flipper-zero-flat-4.png


BIN
docs/images/flipper-zero-flat-5.png


BIN
docs/images/flipper-zero-flat-6.png


BIN
docs/images/flipper-zero-flat-7.png


BIN
docs/images/flipper-zero-flat.png


BIN
docs/images/flipper-zero-flat.psd


BIN
docs/images/flipper-zero-pcb.png


BIN
docs/images/game_boy_pokemon_center.png


BIN
docs/images/game_boy_save.png


BIN
docs/images/game_boy_save_trade.png


BIN
docs/images/game_boy_trade_list.png


BIN
docs/images/game_boy_trade_list_select_trade.png


BIN
docs/images/game_boy_trade_list_select_trade_confirm.png


BIN
docs/images/game_boy_trade_room.png


BIN
docs/images/game_boy_trade_room_2.png


BIN
docs/images/gb_spi.png


BIN
docs/images/gblpof.gif


File diff suppressed because it is too large
+ 0 - 7
docs/images/implemented.svg


BIN
docs/images/left.png


+ 0 - 6
docs/images/left.svg

@@ -1,6 +0,0 @@
-<svg style="display:inline;fill:currentColor;stroke:currentColor;stroke-width:0.55px;"
-    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
-    width="24" height="24" viewBox="0 0 24 24">
-    <path
-        d="M22,12A10,10 0 0,0 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12M14,7L9,12L14,17V7Z"></path>
-</svg>

BIN
docs/images/pcb.png


BIN
docs/images/qFlipper.png


BIN
docs/images/reboot.png


BIN
docs/images/wgbl-0.png


+ 0 - 744
docs/images/white_flat.svg

@@ -1,744 +0,0 @@
-<svg version="1.1" id="Flipper_1" xmlns="http://www.w3.org/2000/svg"
-    xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-    viewBox="0 0 202.5 85.4" style="enable-background:new 0 0 202.5 85.4;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#FFFFFF;}
-	.st1{fill:#231F20;}
-	.st2{fill:#fe8a2c;}
-	.st3{display:none;}
-	.st4{display:inline;fill:#FF8200;}
-	.st5{fill:#808080;}
-</style>
-<g id="white">
-	<g>
-		<g>
-			<path class="st0" d="M40.9,0.6h126.7c3.9,0.1,7.9,1,11.1,4.7C181.9,9,195.6,26,197,27.8s2.9,4.1,3.3,7.9
-				c0.4,3.8,1.5,29.3,1.5,32.8c0,3.7-1.1,5.2-1.9,6.9c-0.8,1.5-2,4-2.8,5.5s-3.5,3.8-7.8,3.9H32.2c-4.6,0-8.4-1.7-10.9-5.1
-				C18.8,76.4,5.1,57.5,4.5,56.5c-1-1.6-1.8-4.1-3.2-6.9c-0.9-1.8-1.3-4.6,1-7.8c2.4-3.2,25.8-33.6,27.9-36
-				C32.3,3.3,35.9,0.5,40.9,0.6z"/>
-			<path class="st1" d="M32.1,85.4c-4.7,0-8.6-1.8-11.2-5.3C18.6,77,4.6,57.9,4,56.8c-0.6-1-1.1-2.2-1.7-3.6c-0.4-1-0.9-2.2-1.5-3.4
-				s-1.7-4.4,1.1-8.3c2.5-3.4,26-33.8,27.9-36.1c1.7-2,5.5-5.4,11-5.4h0.1h126.7c3.2,0.1,7.9,0.7,11.6,4.9c1.9,2.3,8.1,9.9,17.9,22
-				l0.4,0.5c1.5,1.9,3,4.2,3.4,8.2c0.5,4,1.5,29.5,1.5,32.9c0,3.4-0.9,5.1-1.7,6.6c-0.1,0.2-0.2,0.4-0.3,0.6c-0.8,1.5-2,4-2.8,5.5
-				c-0.8,1.6-3.7,4.1-8.3,4.2H32.2C32.2,85.4,32.1,85.4,32.1,85.4z M40.8,1.1c-5.1,0-8.6,3.1-10.2,5c-1.9,2.3-25.4,32.6-27.8,36
-				c-2.5,3.4-1.6,6.1-1,7.2c0.6,1.2,1.1,2.4,1.6,3.5C4,54.2,4.5,55.3,5,56.2C5.5,57.1,19.3,76,21.8,79.4c2.4,3.2,6,4.9,10.4,4.9
-				h157.3c4.1-0.1,6.6-2.2,7.3-3.6c0.8-1.6,2-4,2.8-5.5c0.1-0.2,0.2-0.4,0.3-0.6c0.8-1.4,1.5-2.9,1.6-6.1c0-3.9-1.1-29.1-1.5-32.8
-				s-1.8-5.9-3.2-7.6l-0.4-0.5c-12.3-15.3-16.5-20.4-17.9-22c-2.6-3-6-4.4-10.7-4.5H41.1C40.9,1.1,40.8,1.1,40.8,1.1z"/>
-		</g>
-		<g>
-			<path class="st1" d="M27.3,78.5c-4.6,0-7-1.8-12.6-9.5c-5.4-7.3-12.9-17.8-13-17.9l0.5-0.3c0.1,0.1,7.5,10.6,12.9,17.9
-				c5.5,7.5,7.8,9.2,12.2,9.2h165.4c3.3-0.2,6.7-1.8,7.6-3.6l0.5,0.3c-1,2-4.6,3.8-8.1,3.9H27.3z"/>
-		</g>
-		<g>
-			<path class="st0" d="M164.8,2.9c4,0,6.6,0.5,9.2,3.6s18,22.2,19.3,23.8c1.3,1.6,2.4,4,2.4,6.6s0.6,14.8,0.4,18
-				c-0.2,3.3-2.9,5.7-6.4,5.8H42c-4.7-0.1-6.7-1.3-8.9-3.6c-2.2-2.4-7.9-8.5-9.6-10.7c-1.9-2.4-1-4.2,0.1-5.9
-				C24.9,38.9,43.4,11,45.2,8.1c1.7-2.8,4.9-5.2,8.8-5.2L164.8,2.9z"/>
-			<path class="st1" d="M42.1,61.1c-4.8-0.1-6.8-1.3-9.1-3.7s-7.9-8.6-9.6-10.8c-2-2.5-1.1-4.5,0.1-6.2C24.8,38.6,43.3,10.7,44.9,8
-				c2.1-3.3,5.4-5.3,9-5.3l0,0h110.8c4.2,0,6.8,0.6,9.4,3.7c2.6,3.1,18.2,22.4,19.3,23.8c1.5,2,2.4,4.5,2.4,6.8
-				c0,0.9,0.1,2.9,0.2,5.2c0.2,4.8,0.4,10.7,0.3,12.8c-0.2,3.4-3,6-6.6,6.1H42.1z M54,3.2c-3.4,0-6.6,1.9-8.5,5.1
-				C43.8,11,25.2,38.9,24,40.7c-1,1.5-2,3.2-0.1,5.5c1.7,2.2,7.3,8.3,9.6,10.7c2.2,2.3,4.1,3.5,8.7,3.5h147.7
-				c3.3-0.1,5.9-2.5,6.1-5.6c0.1-2.1-0.1-8.3-0.3-12.8c-0.1-2.3-0.2-4.3-0.2-5.2c0-3.2-1.6-5.6-2.3-6.4C192,29,176.5,9.7,173.8,6.7
-				c-2.5-2.9-5-3.4-9-3.5L54,3.2L54,3.2z"/>
-		</g>
-		<g>
-			<path class="st0" d="M191.3,39.6c2.5,3.2,0.8,11-4.7,11.9h-32.8c-11.3-0.1-22.8-9.4-22.7-22.7S142.7,7,154.1,7
-				c10.4,0.1,16.8,7.3,17.4,8.2C173.4,17.7,189.1,36.8,191.3,39.6z"/>
-			<path class="st1" d="M153.8,51.8c-5.7,0-11.5-2.4-15.8-6.5c-4.7-4.4-7.2-10.3-7.2-16.6C130.9,15,142.9,6.6,154,6.6h0.1
-				c11.1,0.1,17.6,8.2,17.6,8.3c0.9,1.2,5,6.1,9.2,11.4c4.6,5.7,9.4,11.6,10.6,13.1l0,0c1.4,1.7,1.6,4.9,0.5,7.6
-				c-1,2.6-3,4.3-5.4,4.7L153.8,51.8z M154,7.2c-10.8,0-22.5,8.2-22.6,21.5c0,6.1,2.5,11.9,7,16.1c4.3,4,9.9,6.3,15.4,6.3h32.8
-				c2.1-0.4,3.9-1.9,4.9-4.4s0.8-5.4-0.4-7l0,0c-1.2-1.5-5.9-7.4-10.6-13.1c-4.3-5.2-8.3-10.2-9.2-11.4
-				C171.2,15.1,164.9,7.2,154,7.2L154,7.2z"/>
-		</g>
-		<g>
-			<path class="st0" d="M147.8,80.3h23.9c0.9,0,1.8,1.1,0.1,1.2h-24.3C146.8,81.5,146.2,80.6,147.8,80.3z"/>
-			<path class="st1" d="M147.5,81.8c-0.5,0-0.9-0.4-0.9-0.8c0-0.3,0.1-0.8,1.2-1l0,0h23.9c0.7,0,1.3,0.5,1.3,1
-				c0,0.3-0.2,0.7-1.2,0.8H147.5z M147.8,80.6c-0.6,0.1-0.7,0.3-0.7,0.4s0.2,0.3,0.4,0.3h24.3c0.5,0,0.7-0.2,0.7-0.2
-				c0-0.1-0.3-0.4-0.8-0.4L147.8,80.6z"/>
-		</g>
-		<g>
-			<path class="st0" d="M195.4,80.4c0.3,0.1,0.3,1.7-2.4,2.3c-4.1,1-6,0.3-5.4-0.7s1.3-0.4,4.2-0.9S194.7,80,195.4,80.4z"/>
-			<path class="st1" d="M189.6,83.5c-1.1,0-1.9-0.2-2.2-0.6c-0.2-0.3-0.2-0.6,0-0.9c0.4-0.7,1-0.8,1.9-0.8c0.6,0,1.4-0.1,2.5-0.2
-				c1.4-0.2,2.1-0.5,2.5-0.7c0.5-0.2,0.8-0.3,1.2,0c0.2,0.1,0.3,0.3,0.3,0.6c0,0.3-0.2,1.7-2.7,2.2
-				C191.8,83.3,190.5,83.5,189.6,83.5z M195,80.6c-0.1,0-0.2,0-0.5,0.1c-0.5,0.2-1.2,0.5-2.6,0.7c-1.1,0.2-1.9,0.2-2.5,0.3
-				c-1,0-1.2,0.1-1.5,0.5c-0.1,0.2,0,0.3,0,0.3c0.3,0.4,1.9,0.7,5.2-0.1c1.5-0.3,2-0.9,2.2-1.3c0.1-0.2,0.1-0.4,0.1-0.5
-				C195.2,80.6,195.1,80.6,195,80.6z"/>
-		</g>
-		<g>
-			<path class="st2" d="M154,8.6c12.2,0.2,21.3,10.3,21.3,20.4c-0.1,10.6-8.5,20.6-20.7,20.6c-12.2-0.1-22-9.2-21.9-21.1
-				C132.8,17.1,142.7,8.4,154,8.6z"/>
-			<path class="st1" d="M154.8,49.9h-0.1c-12.6-0.1-22.4-9.5-22.3-21.5c0-5.3,2.2-10.3,6-14.1c4.1-4,9.8-6.2,15.7-6.2l0,0
-				c12.9,0.2,21.8,11.1,21.7,20.8C175.7,39.1,167.7,49.9,154.8,49.9z M153.6,9c-5.5,0-10.8,2.1-14.7,5.9c-3.7,3.6-5.8,8.4-5.8,13.5
-				c-0.1,11.5,9.4,20.6,21.5,20.7h0.1c12.4,0,20.1-10.4,20.1-20.1c0-9.2-8.5-19.7-20.9-19.9C153.9,9,153.8,9,153.6,9z"/>
-		</g>
-		<g>
-			<path class="st2" d="M183.4,36.5c4.3,0,6.9,3.5,6.9,6.7c0,3.1-2.2,6.4-6.6,6.4c-4.2-0.1-6.9-3.5-6.9-6.7
-				C176.9,39.7,179.6,36.6,183.4,36.5z"/>
-			<path class="st1" d="M183.8,50.1h-0.1c-2,0-3.9-0.8-5.3-2.2c-1.3-1.4-2-3.2-2-4.9c0.1-3.2,2.8-6.7,7.1-6.8l0,0
-				c2.1,0,4,0.8,5.4,2.3c1.2,1.3,1.9,3.1,1.9,4.9c0,1.8-0.7,3.6-2,4.9C187.5,49.4,185.8,50.1,183.8,50.1z M183.5,37L183.5,37
-				c-3.8,0-6.2,3.1-6.3,5.9c0,1.6,0.6,3.1,1.8,4.3c1.2,1.3,2.9,2,4.7,2s3.4-0.5,4.5-1.7c1.1-1.1,1.7-2.7,1.7-4.3s-0.6-3.1-1.7-4.3
-				C187.4,38.1,185.9,37,183.5,37z"/>
-		</g>
-		<g>
-			<path class="st1" d="M154.5,46c-0.3,0-0.5-0.1-0.7-0.4c-0.2-0.2-1.3-2-2.3-3.7L151,41c-0.2-0.4-0.3-0.8-0.1-1
-				c0.1-0.1,0.3-0.3,0.7-0.3s1.8,0,3.1,0c1.1,0,2.2,0,2.5,0c0.5,0,0.7,0.3,0.8,0.4c0.1,0.2,0.1,0.6-0.1,0.8
-				c-0.1,0.1-0.3,0.6-0.7,1.2c-0.9,1.6-1.8,3.2-2,3.5S154.7,46,154.5,46L154.5,46z M151.5,40.2c-0.1,0-0.1,0-0.1,0.1s0,0.3,0.1,0.5
-				l0.5,0.8c0.7,1.2,2.1,3.5,2.3,3.7c0.1,0.1,0.2,0.2,0.3,0.2l0,0c0.1,0,0.2-0.1,0.2-0.2c0.2-0.3,1.3-2.2,2-3.4
-				c0.3-0.6,0.6-1,0.7-1.2c0.1-0.1,0.1-0.2,0-0.3c0-0.1-0.2-0.1-0.3-0.1c-0.3,0-1.3,0-2.5,0C153.3,40.2,152,40.2,151.5,40.2
-				L151.5,40.2L151.5,40.2z"/>
-		</g>
-		<g>
-			<path class="st1" d="M142,32c-0.2,0-0.3,0-0.6-0.1s-2.5-1.3-4.5-2.5l-0.5-0.3c-0.4-0.2-0.5-0.5-0.5-0.7c0-0.3,0.2-0.6,0.6-0.8
-				c0.3-0.2,2.2-1.2,3.4-1.9l1.1-0.6c0.3-0.2,0.8-0.4,1.1-0.2c0.4,0.2,0.3,0.7,0.3,0.8c0,0.6,0,3.8,0.1,5v0.4c0,0.3-0.1,0.6-0.3,0.7
-				C142.3,32,142.1,32,142,32z M141.9,25.5c-0.1,0-0.2,0-0.5,0.2l-1.1,0.6c-1.3,0.7-3.1,1.7-3.4,1.9c-0.2,0.1-0.3,0.2-0.3,0.3
-				c0,0.1,0.1,0.1,0.2,0.2l0.5,0.3c1.1,0.6,4.1,2.3,4.4,2.5c0.3,0.1,0.4,0.1,0.4,0.1s0-0.1,0-0.2V31c0-1.2-0.1-4.4-0.1-5h0.3H142
-				C142,25.6,142,25.5,141.9,25.5L141.9,25.5z"/>
-		</g>
-		<g>
-			<path class="st1" d="M166.6,32c-0.1,0-0.3,0-0.4-0.1c-0.2-0.1-0.4-0.3-0.4-0.8c0-0.3,0-1,0-1.8c0-1.3-0.1-2.9,0-3.4l0,0
-				c0-0.4,0.1-0.7,0.4-0.9c0.3-0.2,0.7-0.1,1.3,0.2c0.5,0.3,3.4,2,4.2,2.5l0.2,0.1c0.3,0.2,0.5,0.4,0.5,0.7c0,0.2-0.1,0.5-0.6,0.8
-				c-0.6,0.4-4.1,2.4-4.5,2.6C167,32,166.8,32,166.6,32z M166.3,25.9c0,0.6,0,2.1,0,3.4c0,0.8,0,1.5,0,1.8c0,0.1,0,0.3,0.1,0.3
-				c0.1,0.1,0.2,0,0.4-0.1c0.4-0.2,3.9-2.2,4.5-2.6c0.2-0.1,0.3-0.3,0.3-0.3c0-0.1-0.1-0.1-0.2-0.2l-0.2-0.1
-				c-0.8-0.5-3.7-2.1-4.2-2.4c-0.4-0.2-0.7-0.3-0.7-0.2C166.3,25.5,166.3,25.7,166.3,25.9L166.3,25.9z"/>
-		</g>
-		<g>
-			<path class="st1" d="M156.8,17.5L156.8,17.5c-0.3,0-4,0-5.2,0h-0.5c-0.4,0-0.7-0.1-0.8-0.4c-0.1-0.1-0.2-0.4,0-0.9
-				c0.1-0.3,0.7-1.2,1.3-2.2c0.6-0.9,1.1-1.8,1.3-2.2c0.3-0.4,0.5-0.7,0.8-0.7s0.5,0.1,0.7,0.5c0.1,0.2,0.7,1.1,1.3,2.1
-				c0.7,1.1,1.4,2.3,1.6,2.5c0.2,0.3,0.2,0.6,0.1,0.9C157.4,17.3,157.1,17.5,156.8,17.5z M151.1,16.9h0.5c2.3,0,5,0,5.2,0
-				c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0-0.2-0.1-0.3c-0.2-0.3-0.9-1.4-1.6-2.6c-0.6-1-1.2-1.9-1.3-2.1c-0.1-0.2-0.2-0.2-0.2-0.2l0,0
-				c0,0-0.2,0.1-0.4,0.4c-0.2,0.4-0.8,1.3-1.3,2.2c-0.6,1-1.2,1.9-1.3,2.2c-0.1,0.1-0.1,0.2-0.1,0.3C150.9,16.9,151,16.9,151.1,16.9
-				L151.1,16.9z"/>
-		</g>
-		<g>
-			<path class="st1" d="M185.4,46.2L185.4,46.2h-3.8v-1.5h3.6l0,0c0.6,0,1-0.8,1-1.3c0-0.2-0.1-0.6-0.2-0.9
-				c-0.2-0.3-0.4-0.5-0.7-0.5h-3.2v1l-2.7-1.8l2.7-1.9v1.1h3.1c0.7,0,1.4,0.4,2,1c0.5,0.6,0.7,1.3,0.7,1.9c0,0.8-0.2,1.5-0.7,2
-				C186.7,45.9,186.1,46.2,185.4,46.2z M182.2,45.6h3.2l0,0c0.5,0,1-0.2,1.4-0.7c0.4-0.4,0.6-1,0.6-1.7c0-0.5-0.2-1.1-0.6-1.6
-				c-0.4-0.5-0.9-0.8-1.5-0.8h-3.6v-0.6l-1.1,0.8l1.1,0.7v-0.5h3.7c0.5,0,1,0.3,1.2,0.8c0.3,0.5,0.3,1,0.3,1.2
-				c0,0.8-0.6,1.8-1.5,1.8l0,0h-3.1L182.2,45.6z"/>
-		</g>
-		<g>
-			<path class="st0" d="M133.3,47.9c0.7,0,1.3,0.7,1.3,1.3c0,0.5-0.4,1.2-1.2,1.1s-1.4-0.5-1.4-1.2C132,48.5,132.5,47.9,133.3,47.9z
-				"/>
-			<path class="st1" d="M133.4,50.6L133.4,50.6c-0.9,0-1.7-0.6-1.6-1.4c0-0.8,0.7-1.5,1.5-1.5l0,0l0,0c0.9,0,1.5,0.8,1.5,1.6
-				C134.8,49.9,134.3,50.6,133.4,50.6z M133.3,48.2c-0.5,0-1,0.4-1,1c0,0.5,0.5,0.9,1.1,0.9l0,0c0.6,0,0.9-0.5,0.9-0.9
-				C134.2,48.8,133.8,48.2,133.3,48.2L133.3,48.2z"/>
-		</g>
-		<g>
-			<path class="st1" d="M154.4,35.9L154.4,35.9c-2.2,0-4.3-0.9-5.7-2.3c-1.3-1.3-2-3.1-1.9-5.1c0.1-4.8,4.4-7,7.4-7l0,0l0,0
-				c1.9,0,3.7,0.8,5.1,2.2c1.4,1.4,2.2,3.2,2.1,5.1c0,1.9-0.7,3.7-2,5C158.2,35.1,156.4,35.9,154.4,35.9z M154.2,22.3L154.2,22.3
-				c-2.7,0-6.5,1.9-6.5,6.2c0,1.7,0.6,3.3,1.7,4.4c1.3,1.3,3.2,2.1,5.1,2.1l0,0c1.7,0,3.3-0.6,4.4-1.8c1.1-1.2,1.8-2.7,1.8-4.4
-				c0-1.7-0.7-3.3-1.9-4.5C157.5,23,155.8,22.4,154.2,22.3z"/>
-		</g>
-		<g>
-			<path class="st0" d="M121.6,51.5H54.1c-2.7,0-5-2.2-5-5V11.7c0-2.7,2.2-5,5-5h67.5c2.7,0,5,2.2,5,5v34.8
-				C126.6,49.3,124.4,51.5,121.6,51.5z"/>
-			<path class="st1" d="M121.6,52H54.1c-3,0-5.5-2.4-5.5-5.5V11.7c0-3,2.4-5.5,5.5-5.5h67.5c3,0,5.5,2.5,5.5,5.5v34.8
-				C127.1,49.6,124.6,52,121.6,52z M54.1,7.3c-2.5,0-4.5,2-4.5,4.5v34.8c0,2.5,2,4.5,4.5,4.5h67.5c2.5,0,4.5-2,4.5-4.5V11.7
-				c0-2.5-2-4.5-4.5-4.5H54.1V7.3z"/>
-		</g>
-		<g>
-			<path class="st2" d="M121.4,49.1H54.5c-1.6,0-2.9-1.3-2.9-2.9V11.9c0-1.6,1.3-2.9,2.9-2.9h66.8c1.6,0,2.9,1.3,2.9,2.9v34.3
-				C124.3,47.8,123,49.1,121.4,49.1z"/>
-			<path class="st1" d="M121.4,49.4H54.5c-1.8,0-3.2-1.4-3.2-3.2V11.9c0-1.8,1.4-3.2,3.2-3.2h66.8c1.8,0,3.2,1.4,3.2,3.2v34.3
-				C124.5,48,123.1,49.4,121.4,49.4z M54.5,9.3c-1.4,0-2.6,1.2-2.6,2.6v34.3c0,1.4,1.2,2.6,2.6,2.6h66.8c1.4,0,2.6-1.2,2.6-2.6V11.9
-				c0-1.4-1.2-2.6-2.6-2.6C121.3,9.3,54.5,9.3,54.5,9.3z"/>
-		</g>
-	</g>
-	<g id="dolphin_1_">
-		<g>
-			<polygon points="86.7,35.8 86.1,35.8 85.6,35.8 85,35.8 85,36.4 85.6,36.4 86.1,36.4 86.7,36.4 87.2,36.4 87.8,36.4 87.8,35.8 
-				87.2,35.8 			"/>
-		</g>
-		<g>
-			<polygon points="70,35.8 69.5,35.8 69.5,36.3 70,36.3 70.6,36.3 70.6,35.8 			"/>
-		</g>
-		<g>
-			<rect x="58.97" y="35.47" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1959 94.8637)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.79" y="35.63" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8589 93.8361)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.7" y="35.69" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.7184 92.8058)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="88.9,35.3 88.3,35.3 88.3,34.7 87.8,34.7 87.2,34.7 87.2,35.3 87.8,35.3 87.8,35.8 88.3,35.8 88.9,35.9 
-				89.5,35.9 90,35.9 90,35.3 89.5,35.3 			"/>
-		</g>
-		<g>
-			<rect x="68.93" y="35.25" transform="matrix(5.134305e-03 -1 1 5.134305e-03 33.3228 104.5986)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="59.44" y="35.05" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.0809 94.909)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="58.35" y="35.01" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0409 93.7807)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.27" y="35.07" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9013 92.7517)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.18" y="34.93" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.9613 91.5241)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="90.6,34.8 90,34.7 90,35.3 90.6,35.3 91.1,35.3 91.7,35.3 91.7,34.8 91.1,34.8 			"/>
-		</g>
-		<g>
-			<rect x="60" y="34.43" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2657 94.8522)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="58.92" y="34.39" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2264 93.7232)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.93" y="34.45" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1847 92.7943)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.74" y="34.5" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9479 91.6674)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.66" y="34.46" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.9082 90.5384)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="91.7,34.2 91.7,34.8 92.2,34.8 92.8,34.8 92.8,34.2 92.2,34.2 			"/>
-		</g>
-		<g>
-			<polygon points="86.7,34.7 87.2,34.7 87.2,34.2 86.7,34.2 86.1,34.2 86.1,34.7 			"/>
-		</g>
-		<g>
-			<rect x="59.48" y="33.96" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2096 93.8691)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="58.49" y="33.92" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2686 92.8401)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.31" y="33.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0293 91.7103)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.12" y="33.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8907 90.4827)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.03" y="33.9" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.8514 89.3535)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="59.06" y="33.4" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.3532 92.8826)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.97" y="33.36" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.3134 91.753)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.88" y="33.42" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1746 90.7263)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.7" y="33.47" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9363 89.5974)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="93.9,33.1 93.3,33.1 92.8,33.1 92.2,33.1 91.7,33.1 91.1,33.1 90.6,33.1 90,33.1 89.5,33.1 88.9,33.1 88.4,33.1 
-				87.8,33.1 87.2,33.1 86.7,33.1 86.1,33.1 85.6,33.1 85,33.1 84.5,33.1 84.5,32.5 85,32.5 85,31.9 85.6,32 85.6,31.4 86.1,31.4 
-				86.2,30.8 86.7,30.8 86.7,30.3 87.3,30.3 87.3,29.7 87.8,29.7 87.8,29.2 88.4,29.2 88.4,28.6 88.9,28.6 88.9,28.1 89.5,28.1 
-				89.5,27.5 90.1,27.5 90.1,27 90.6,27 90.6,26.4 91.2,26.4 91.2,25.9 91.7,25.9 91.7,25.3 92.3,25.3 92.3,24.8 92.8,24.8 
-				92.8,24.2 93.4,24.2 93.4,23.7 93.4,23.1 93.4,22.6 93.4,22 92.9,22 92.9,21.5 92.3,21.5 91.7,21.4 91.2,21.4 91.2,20.9 
-				90.6,20.9 90.1,20.9 89.5,20.9 89,20.9 88.4,20.9 87.9,20.9 87.3,20.9 86.8,20.9 86.2,20.9 86.2,21.4 85.6,21.4 85.1,21.4 
-				85.1,22 84.5,22 84,22 84,22.5 83.4,22.5 82.9,22.5 82.9,22 82.3,22 82.3,21.4 82.3,20.8 81.8,20.8 81.8,20.3 81.8,19.7 
-				81.2,19.7 81.2,19.2 80.7,19.2 80.7,18.6 80.1,18.6 80.1,18.1 79.6,18.1 79.6,17.5 79,17.5 78.5,17.5 78.5,16.9 77.9,16.9 
-				77.4,16.9 77.4,16.4 76.8,16.4 76.2,16.4 75.7,16.4 75.7,15.8 75.1,15.8 74.6,15.8 74,15.8 73.5,15.8 72.9,15.8 72.9,15.3 
-				72.4,15.2 71.8,15.2 71.3,15.2 70.7,15.2 70.2,15.2 69.6,15.2 69,15.2 68.5,15.2 67.9,15.2 67.4,15.2 66.8,15.2 66.3,15.2 
-				65.7,15.2 65.2,15.2 64.6,15.2 64.6,15.8 64,15.8 63.5,15.8 62.9,15.8 62.4,15.8 62.4,16.3 61.8,16.3 61.3,16.3 60.7,16.3 
-				60.7,16.9 60.2,16.9 60.2,17.4 59.6,17.4 59.1,17.4 59,18 58.5,18 57.9,17.9 57.9,18.5 57.4,18.5 57.4,19.1 56.8,19.1 56.8,19.6 
-				56.3,19.6 56.3,20.2 55.7,20.2 55.7,20.7 55.2,20.7 55.1,21.3 55.1,21.8 54.6,21.8 54.6,22.4 54.6,22.9 54,22.9 54,23.5 54,24 
-				53.5,24 53.5,24.6 53.5,25.1 53.5,25.7 54,25.7 54,25.1 54,24.6 54.6,24.6 54.6,24 54.6,23.5 55.1,23.5 55.1,22.9 55.1,22.4 
-				55.7,22.4 55.7,21.8 55.7,21.3 56.3,21.3 56.3,20.7 56.8,20.7 56.8,20.2 57.4,20.2 57.4,19.6 57.9,19.6 57.9,19.1 58.5,19.1 
-				58.5,18.5 59,18.5 59.6,18.5 59.6,18 60.2,18 60.7,18 60.7,17.4 61.3,17.4 61.8,17.4 62.4,17.4 62.9,17.4 63.5,17.4 64,17.4 
-				64.6,17.4 65.1,17.4 65.7,17.4 66.3,17.4 66.8,17.4 67.4,17.4 67.4,16.9 66.8,16.9 66.3,16.9 65.7,16.9 65.2,16.9 64.6,16.9 
-				64,16.9 63.5,16.9 62.9,16.9 62.9,16.3 63.5,16.3 64,16.3 64.6,16.3 65.2,16.3 65.2,15.8 65.7,15.8 66.3,15.8 66.8,15.8 
-				67.4,15.8 67.9,15.8 68.5,15.8 69,15.8 69.6,15.8 70.1,15.8 70.7,15.8 71.3,15.8 71.8,15.8 72.4,15.8 72.4,16.4 72.9,16.4 
-				72.9,16.9 73.5,16.9 73.5,16.4 74,16.4 74,16.9 74.6,16.9 75.1,16.9 75.7,16.9 76.2,16.9 76.8,16.9 76.8,17.5 76.8,18 77.3,18 
-				77.9,18.1 78.5,18.1 79,18.1 79,18.6 79.6,18.6 79.6,19.2 80.1,19.2 80.1,19.7 80.7,19.7 80.7,20.3 81.2,20.3 81.2,20.8 
-				81.2,21.4 81.2,21.9 80.7,21.9 80.6,22.5 81.2,22.5 81.8,22.5 82.3,22.5 82.3,23.1 82.3,23.6 82.9,23.6 83.4,23.6 83.4,23.1 
-				84,23.1 84.5,23.1 84.5,22.5 85.1,22.5 85.6,22.5 85.6,22 86.2,22 86.8,22 86.8,21.4 87.3,21.4 87.9,21.4 88.4,21.4 89,21.4 
-				89.5,21.4 90.1,21.4 90.6,21.4 90.6,22 91.2,22 91.7,22 92.3,22 92.3,22.6 92.8,22.6 92.8,23.1 92.3,23.1 91.7,23.1 91.2,23.1 
-				90.6,23.1 90.6,23.7 90.1,23.7 89.5,23.7 89,23.7 89,24.2 88.4,24.2 87.8,24.2 87.8,24.8 87.3,24.8 86.7,24.7 86.7,25.3 
-				86.2,25.3 86.2,25.9 85.6,25.9 85.6,26.4 85.1,26.4 85.1,27 84.5,27 84.5,27.5 84,27.5 83.9,28.1 83.4,28.1 83.4,28.6 82.8,28.6 
-				82.8,29.2 82.3,29.2 82.3,29.7 81.7,29.7 81.7,30.3 81.2,30.3 81.2,30.8 80.6,30.8 80.6,31.4 80,31.4 80,31.9 79.5,31.9 
-				79.5,32.5 78.9,32.5 78.9,33 78.4,33 78.4,33.6 77.8,33.6 77.8,34.1 77.3,34.1 77.3,34.7 76.7,34.7 76.2,34.7 76.1,35.2 
-				75.6,35.2 75,35.2 75,35.8 74.5,35.8 73.9,35.8 73.4,35.8 73.4,36.3 72.8,36.3 72.3,36.3 71.7,36.3 71.2,36.3 70.6,36.3 
-				70.6,36.9 71.1,36.9 71.7,36.9 72.3,36.9 72.8,36.9 73.4,36.9 73.9,36.9 74.5,36.9 75,36.9 75.6,36.9 76.1,36.9 76.7,36.9 
-				77.2,36.9 77.8,36.9 78.4,36.9 78.9,36.9 79.5,36.9 80,36.9 80.6,36.9 81.1,36.9 81.7,36.9 82.2,36.9 82.8,36.9 83.3,36.9 
-				83.9,36.9 84.5,36.9 85,36.9 85,36.4 84.5,36.4 83.9,36.4 83.4,36.4 82.8,36.4 82.2,36.4 81.7,36.4 81.1,36.4 80.6,36.4 80,36.4 
-				79.5,36.4 78.9,36.4 78.4,36.4 78.4,35.8 78.4,35.2 78.9,35.2 78.9,34.7 79.5,34.7 79.5,34.1 80,34.1 80,33.6 80.6,33.6 
-				81.1,33.6 81.7,33.6 82.3,33.6 82.8,33.6 83.4,33.6 83.9,33.6 83.9,34.2 84.5,34.2 85,34.2 85.6,34.2 86.1,34.2 86.1,33.6 
-				86.7,33.6 87.2,33.6 87.8,33.6 88.4,33.6 88.9,33.6 89.5,33.6 90,33.6 90.6,33.6 91.1,33.6 91.7,33.6 92.2,33.6 92.8,33.7 
-				92.8,34.2 93.3,34.2 93.9,34.2 93.9,34.8 93.9,35.3 93.9,35.9 93.3,35.9 93.3,36.4 92.8,36.4 92.8,37 92.2,37 92.2,37.5 
-				91.7,37.5 91.7,38.1 91.1,38.1 90.6,38.1 90.5,38.6 90,38.6 89.4,38.6 88.9,38.6 88.9,39.2 88.3,39.2 87.8,39.2 87.2,39.2 
-				87.2,39.7 86.7,39.7 86.1,39.7 85.6,39.7 85.5,40.3 85,40.3 84.4,40.3 83.9,40.3 83.3,40.3 83.3,40.8 82.8,40.8 82.2,40.8 
-				81.7,40.8 81.1,40.8 81.1,41.4 80.6,41.4 80,41.4 79.4,41.3 79.4,41.9 78.9,41.9 78.9,42.5 79.4,42.5 80,42.5 80.5,42.5 
-				81.1,42.5 81.7,42.5 82.2,42.5 82.8,42.5 82.8,41.9 83.3,41.9 83.9,41.9 83.9,41.4 83.9,40.8 84.4,40.8 85,40.8 85.5,40.8 
-				86.1,40.8 86.1,40.3 86.7,40.3 87.2,40.3 87.8,40.3 87.8,39.7 88.3,39.7 88.9,39.7 89.4,39.7 89.4,39.2 90,39.2 90.5,39.2 
-				91.1,39.2 91.1,38.6 91.7,38.6 92.2,38.6 92.2,38.1 92.8,38.1 92.8,37.5 93.3,37.5 93.3,37 93.9,37 93.9,36.4 94.4,36.4 
-				94.4,35.9 94.4,35.3 94.4,34.8 94.5,34.2 94.5,33.7 93.9,33.7 			"/>
-		</g>
-		<g>
-			<rect x="58.43" y="32.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.1982 91.7988)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.35" y="32.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.1586 90.6696)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.16" y="32.85" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.02 89.442)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.07" y="32.91" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8786 88.4149)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.91" y="32.37" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2429 90.7118)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.92" y="32.23" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.4021 89.5849)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.74" y="32.39" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0652 88.5576)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="60.55" y="31.83" transform="matrix(5.134305e-03 -1 1 5.134305e-03 28.4088 92.8184)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="58.4,31.8 58.4,32.4 59,32.4 59,32.9 59.5,32.9 59.5,33.5 60.1,33.5 60.1,34 60.6,34 60.6,34.6 61.2,34.6 
-				61.2,35.2 61.7,35.2 61.7,34.6 61.7,34 61.7,33.5 62.3,33.5 62.3,32.9 62.3,32.4 61.7,32.4 61.2,32.4 61.2,32.9 61.2,33.5 
-				60.6,33.5 60.6,32.9 60.1,32.9 60.1,32.4 59.5,32.4 59.5,31.8 59.5,31.3 59,31.3 59,31.8 			"/>
-		</g>
-		<g>
-			<rect x="57.39" y="31.81" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2872 89.6305)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.3" y="31.76" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2473 88.5013)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.02" y="31.72" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0083 87.1761)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.95" y="31.28" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3722 89.6722)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.87" y="31.14" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.4326 88.4445)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.68" y="31.1" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2895 87.218)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="60.6,30.7 60.1,30.7 60.1,31.3 60.1,31.8 60.6,31.8 60.6,31.3 			"/>
-		</g>
-		<g>
-			<rect x="57.33" y="30.72" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3174 88.4904)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.24" y="30.58" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.3767 87.2628)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<path d="M68.4,30.2v-0.6V29v-0.6v-0.6v-0.6h-0.6v-0.6V26h-0.6v-0.6h-0.6H66v-0.6h-0.6h-0.6h-0.6h-0.6H63v0.6h-0.6h-0.6V26h-0.6
-				v0.6v0.6h-0.6v0.6v0.6V29v0.6v0.6h0.6v0.6v0.6h0.6V32v0.6h0.6V32H63h0.6v-0.6h0.6h0.6h0.6v-0.6H66h0.6h0.6h0.6h0.6H69v-0.6
-				L68.4,30.2z M63.4,28v-0.6H64h0.6V28v0.6H64h-0.6V28z"/>
-		</g>
-		<g>
-			<rect x="56.71" y="30.06" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3595 87.2071)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="71.2,29.7 71.2,29.1 71.2,28.6 71.2,28 71.2,27.4 71.2,26.9 71.2,26.3 70.6,26.3 70.6,26.9 70.6,27.4 70.6,28 
-				70.6,28.5 70.6,29.1 70.6,29.7 70.6,30.2 71.2,30.2 71.7,30.2 72.3,30.2 72.3,29.7 71.7,29.7 			"/>
-		</g>
-		<g>
-			<polygon points="60.1,29.6 60.1,29 60.1,28.5 60.1,27.9 60.1,27.4 60.1,26.8 59.6,26.8 59.6,27.4 59.6,27.9 59.5,28.5 59.5,29 
-				59.5,29.6 59.5,30.2 59.5,30.7 60.1,30.7 60.1,30.2 			"/>
-		</g>
-		<g>
-			<polygon points="72.3,29.1 72.3,29.7 72.8,29.7 73.4,29.7 73.4,29.1 72.9,29.1 			"/>
-		</g>
-		<g>
-			<polygon points="73.4,28.6 73.4,29.1 74,29.1 74.5,29.1 74.5,28.6 74,28.6 			"/>
-		</g>
-		<g>
-			<polygon points="74.5,28 74.5,28.6 75.1,28.6 75.6,28.6 75.6,28 75.1,28 			"/>
-		</g>
-		<g>
-			<polygon points="75.6,27.5 75.6,28 76.2,28 76.7,28 76.7,27.5 76.2,27.5 			"/>
-		</g>
-		<g>
-			<polygon points="69.5,28 69.5,28.5 69.5,29.1 69.5,29.7 69.5,30.2 69.5,30.8 69,30.8 69,31.3 69.5,31.3 70.1,31.3 70.1,30.8 
-				70.1,30.2 70.1,29.7 70.1,29.1 70.1,28.5 70.1,28 70.1,27.4 70.1,26.9 69.5,26.9 69.5,27.4 			"/>
-		</g>
-		<g>
-			<rect x="76.7" y="26.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.3644 104.0994)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="77.3,26.4 77.3,26.9 77.9,26.9 78.4,26.9 78.4,26.4 77.9,26.4 			"/>
-		</g>
-		<g>
-			<polygon points="69,26.9 69.5,26.9 69.5,26.3 69.5,25.8 69,25.8 69,26.3 			"/>
-		</g>
-		<g>
-			<polygon points="60.7,26.3 60.7,25.7 60.1,25.7 60.1,26.3 60.1,26.8 60.7,26.8 			"/>
-		</g>
-		<g>
-			<polygon points="58.4,26.8 58.4,27.4 58.4,27.9 58.4,28.5 58.4,29 58.4,29.6 58.4,30.1 57.9,30.1 57.9,30.7 58.4,30.7 58.4,31.3 
-				59,31.3 59,30.7 59,30.2 59,29.6 59,29 59,28.5 59,27.9 59,27.4 59,26.8 59,26.3 58.5,26.3 			"/>
-		</g>
-		<g>
-			<rect x="78.42" y="25.87" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.1503 104.7495)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="79,25.3 79,25.8 79.5,25.8 80.1,25.8 80.1,25.3 79.5,25.3 			"/>
-		</g>
-		<g>
-			<polygon points="75.1,25.2 74.5,25.2 74,25.2 74,25.8 74.5,25.8 75.1,25.8 75.6,25.8 76.2,25.8 76.2,25.3 75.6,25.2 			"/>
-		</g>
-		<g>
-			<polygon points="70.7,25.2 70.1,25.2 70.1,25.8 70.1,26.3 70.6,26.3 70.7,25.8 			"/>
-		</g>
-		<g>
-			<rect x="68.31" y="25.2" transform="matrix(5.134305e-03 -1 1 5.134305e-03 42.7596 93.9763)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="60.7" y="25.11" transform="matrix(5.134305e-03 -1 1 5.134305e-03 35.2776 86.2758)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="59,25.7 59,26.3 59.6,26.3 59.6,25.7 59.6,25.2 59,25.2 			"/>
-		</g>
-		<g>
-			<rect x="80.04" y="24.59" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.0393 105.1025)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="76.2,24.7 76.2,25.3 76.8,25.3 77.3,25.3 77.3,24.7 76.8,24.7 			"/>
-		</g>
-		<g>
-			<rect x="73.52" y="24.64" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.5014 98.6335)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="69.57" y="24.65" transform="matrix(5.134305e-03 -1 1 5.134305e-03 44.5623 94.6831)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="67.99" y="24.63" transform="matrix(5.134305e-03 -1 1 5.134305e-03 43.0018 93.0898)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="61.16" y="24.59" transform="matrix(5.134305e-03 -1 1 5.134305e-03 36.2632 86.2221)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="59.48" y="24.57" transform="matrix(5.134305e-03 -1 1 5.134305e-03 34.6008 84.5275)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="80.6,24.2 80.6,24.7 81.2,24.7 81.7,24.7 81.8,24.2 81.2,24.2 			"/>
-		</g>
-		<g>
-			<polygon points="77.3,24.1 77.3,24.7 77.9,24.7 78.4,24.7 78.4,24.2 77.9,24.1 			"/>
-		</g>
-		<g>
-			<rect x="72.9" y="23.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.5423 97.3489)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="69.04" y="24.08" transform="matrix(5.134305e-03 -1 1 5.134305e-03 44.6043 93.5989)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="67.3,24.7 67.9,24.7 67.9,24.1 67.3,24.1 66.8,24.1 66.8,24.6 			"/>
-		</g>
-		<g>
-			<polygon points="62.9,24.6 62.9,24.1 62.3,24.1 61.8,24.1 61.8,24.6 62.3,24.6 			"/>
-		</g>
-		<g>
-			<rect x="60.15" y="24.05" transform="matrix(5.134305e-03 -1 1 5.134305e-03 35.7867 84.6725)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="81.76" y="23.52" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.8264 105.7553)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="78.4" y="23.69" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.3101 102.5693)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="64,24.1 64.6,24.1 65.1,24.1 65.7,24.1 66.2,24.1 66.8,24.1 66.8,23.5 66.2,23.5 65.7,23.5 65.1,23.5 64.6,23.5 
-				64,23.5 63.5,23.5 62.9,23.5 62.9,24.1 63.5,24.1 			"/>
-		</g>
-		<g>
-			<rect x="60.61" y="23.43" transform="matrix(5.134305e-03 -1 1 5.134305e-03 36.8701 84.518)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="79,23 79,23.6 79.5,23.6 80.1,23.6 80.1,23.1 79.5,23 			"/>
-		</g>
-		<g>
-			<rect x="76.3" y="22.92" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.9897 99.6957)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="72.9,23 72.9,22.5 72.3,22.5 72.3,23 72.3,23.6 72.3,24.1 72.9,24.1 72.9,23.6 			"/>
-		</g>
-		<g>
-			<polygon points="69.6,23.6 69.6,23 69.6,22.4 69,22.4 69,23 68.4,23 68.5,22.4 67.9,22.4 67.9,21.9 67.3,21.9 67.3,22.4 
-				66.8,22.4 66.2,22.4 65.7,22.4 65.1,22.4 64.6,22.4 64,22.4 63.5,22.4 62.9,22.4 62.4,22.4 62.3,23 62.9,23 63.5,23 64,23 
-				64.6,23 65.1,23 65.7,23 66.2,23 66.8,23 67.3,23 67.3,23.5 67.9,23.5 68.4,23.5 68.4,24.1 69,24.1 69,23.5 			"/>
-		</g>
-		<g>
-			<polygon points="61.2,23 61.2,23.5 61.8,23.5 62.3,23.5 62.3,23 61.8,23 			"/>
-		</g>
-		<g>
-			<rect x="80.03" y="22.52" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.0965 103.0237)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="75.78" y="22.35" transform="matrix(5.134305e-03 -1 1 5.134305e-03 53.0348 98.6083)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="77.92" y="21.84" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.6797 100.2473)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="75.15" y="21.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.8798 97.5249)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="73.4,21.9 73.4,21.4 72.9,21.4 72.9,21.9 72.9,22.5 73.4,22.5 			"/>
-		</g>
-		<g>
-			<rect x="68.53" y="21.74" transform="matrix(5.134305e-03 -1 1 5.134305e-03 46.4396 90.7545)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="77.4" y="21.28" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.7244 99.1622)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="67.91" y="21.27" transform="matrix(5.134305e-03 -1 1 5.134305e-03 46.2849 89.6707)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="79.45" y="20.87" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.1702 100.8023)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="76.68" y="20.71" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.5681 97.8796)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="73.42" y="20.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.1523 94.7938)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="68.57" y="20.65" transform="matrix(5.134305e-03 -1 1 5.134305e-03 47.5681 89.7142)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="78.92" y="20.2" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.3146 99.6165)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="76.15" y="20.25" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.5148 96.894)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="73.98" y="20.17" transform="matrix(5.134305e-03 -1 1 5.134305e-03 53.4324 94.6384)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="70.1,20.8 69.6,20.8 69.6,21.3 69,21.3 69,21.9 69.6,21.9 69.6,22.4 70.1,22.4 70.1,21.9 70.1,21.3 70.7,21.3 
-				70.7,20.8 70.7,20.2 70.1,20.2 			"/>
-		</g>
-		<g>
-			<rect x="69.04" y="20.23" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.4527 89.7598)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="67.95" y="20.19" transform="matrix(5.134305e-03 -1 1 5.134305e-03 47.413 88.6307)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="78.4" y="19.74" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.2585 98.6329)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="74.54" y="19.54" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.6153 94.5821)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="70.69" y="19.55" transform="matrix(5.134305e-03 -1 1 5.134305e-03 50.7784 90.7335)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="69.6" y="19.61" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.6376 89.7032)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="68.51" y="19.66" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.4975 88.6725)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="77.88" y="19.17" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.3033 97.5454)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="75.01" y="19.02" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.6008 94.5286)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="70.07" y="19.08" transform="matrix(5.134305e-03 -1 1 5.134305e-03 50.6235 89.6503)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="68.98" y="19.14" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.4831 88.6196)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="75.67" y="18.5" transform="matrix(5.134305e-03 -1 1 5.134305e-03 56.7848 94.6709)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="70.1,18.6 70.7,18.6 70.7,18 70.1,18 69.6,18 69,18 69,18.6 69.6,18.6 69.6,19.1 70.1,19.1 			"/>
-		</g>
-		<g>
-			<rect x="76.14" y="17.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.77 94.6179)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="72.38" y="17.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.0291 90.8649)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="71.8,18 71.2,18 71.2,18.6 70.7,18.6 70.7,19.1 71.2,19.1 71.2,19.7 71.8,19.7 71.8,19.1 72.3,19.1 72.4,18.6 
-				71.8,18.6 			"/>
-		</g>
-		<g>
-			<rect x="72.95" y="17.45" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.1161 90.9096)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="71.86" y="17.41" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.0754 89.7809)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="68.5,17.4 67.9,17.4 67.4,17.4 67.4,18 67.9,18 68.5,18 69,18 69,17.5 			"/>
-		</g>
-		<g>
-			<rect x="73.41" y="16.93" transform="matrix(5.134305e-03 -1 1 5.134305e-03 56.0985 90.8536)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="72.32" y="16.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.0591 89.7247)" width="0.6" height="0.6"/>
-		</g>
-	</g>
-	<g id="furippa_1_">
-		<g>
-			<polygon points="107.3,30.9 107.3,31.5 107.8,31.5 108.4,31.5 108.4,30.9 107.8,30.9 			"/>
-		</g>
-		<g>
-			<rect x="108.43" y="30.34" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.5309 139.205)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="116.8,29.3 116.8,28.7 116.3,28.7 116.3,28.2 116.3,27.6 115.7,27.6 115.7,27 115.7,26.5 115.2,26.5 114.6,26.5 
-				114.6,27 114.6,27.6 114.6,28.2 115.1,28.2 115.1,28.7 115.1,29.3 115.7,29.3 115.7,29.9 115.7,30.4 116.3,30.4 116.3,31 
-				116.3,31.5 116.8,31.5 117.4,31.5 117.4,31 117.4,30.4 117.4,29.9 116.8,29.9 			"/>
-		</g>
-		<g>
-			<polygon points="108.4,29.3 108.4,28.7 107.8,28.7 107.8,29.3 107.8,29.8 108.4,29.8 			"/>
-		</g>
-		<g>
-			<polygon points="107.3,29.3 107.3,28.7 106.7,28.7 106.7,29.2 106.7,29.8 107.3,29.8 			"/>
-		</g>
-		<g>
-			<polygon points="109,29.3 109,29.8 109,30.4 109.5,30.4 109.5,29.8 109.5,29.3 109.5,28.7 109,28.7 			"/>
-		</g>
-		<g>
-			<polygon points="121.9,28.2 121.3,28.2 120.8,28.2 120.2,28.2 119.6,28.2 119.1,28.2 119.1,28.7 119.1,29.3 119.6,29.3 
-				120.2,29.3 120.8,29.3 121.3,29.3 121.9,29.3 122.4,29.3 122.4,28.8 122.4,28.2 			"/>
-		</g>
-		<g>
-			<polygon points="103.4,28.7 103.4,28.1 103.4,27.5 103.4,27 103.4,26.4 102.8,26.4 102.2,26.4 102.2,27 102.2,27.5 102.2,28.1 
-				102.2,28.7 102.8,28.7 			"/>
-		</g>
-		<g>
-			<polygon points="112.4,26.5 112.3,27 112.3,27.6 111.8,27.6 111.8,28.2 111.8,28.7 111.2,28.7 111.2,29.3 111.2,29.8 110.7,29.8 
-				110.6,30.4 110.6,31 110.6,31.5 111.2,31.5 111.8,31.5 111.8,31 111.8,30.4 112.3,30.4 112.3,29.8 112.3,29.3 112.9,29.3 
-				112.9,28.7 112.9,28.2 113.5,28.2 113.5,27.6 113.5,27 113.5,26.5 112.9,26.5 			"/>
-		</g>
-		<g>
-			<polygon points="104.5,26.4 104.5,27 104.5,27.6 104.5,28.1 104.5,28.7 104.5,29.2 103.9,29.2 103.9,29.8 103.4,29.8 103.3,30.4 
-				102.8,30.4 102.2,30.3 102.2,30.9 102.2,31.5 102.8,31.5 103.3,31.5 103.9,31.5 103.9,30.9 104.5,30.9 104.5,30.4 105,30.4 
-				105,29.8 105.6,29.8 105.6,29.2 105.6,28.7 105.6,28.1 105.6,27.6 105.6,27 105.6,26.4 105.1,26.4 			"/>
-		</g>
-		<g>
-			<polygon points="100,26.4 99.4,26.4 98.9,26.4 98.3,26.4 97.8,26.4 97.2,26.4 96.6,26.4 96.1,26.4 95.5,26.4 95.5,26.9 
-				95.5,27.5 96.1,27.5 96.6,27.5 97.2,27.5 97.8,27.5 98.3,27.5 98.9,27.5 99.4,27.5 100,27.5 100,28.1 100,28.7 99.4,28.6 
-				99.4,29.2 98.9,29.2 98.9,29.8 98.3,29.8 97.7,29.8 97.7,30.3 97.2,30.3 96.6,30.3 96.1,30.3 95.5,30.3 95.5,30.9 95.5,31.4 
-				96,31.4 96.6,31.4 97.2,31.4 97.7,31.4 98.3,31.5 98.3,30.9 98.9,30.9 99.4,30.9 99.4,30.3 100,30.3 100,29.8 100.5,29.8 
-				100.5,29.2 101.1,29.2 101.1,28.7 101.1,28.1 101.1,27.5 101.1,27 101.1,26.4 100.6,26.4 			"/>
-		</g>
-		<g>
-			<path d="M117.4,25.9h-0.6v0.6v0.6v0.6h0.6h0.6h0.6v-0.6v-0.6v-0.6H118H117.4z M118,27.1h-0.6v-0.6h0.6V27.1z"/>
-		</g>
-	</g>
-	<g id="waves_1_">
-		<g>
-			<polygon points="96.2,19.7 96.2,20.3 96.8,20.3 96.8,19.7 96.8,19.1 96.2,19.1 			"/>
-		</g>
-		<g>
-			<polygon points="94,19.7 94,20.3 94.5,20.3 94.5,19.7 94.5,19.1 94,19.1 			"/>
-		</g>
-		<g>
-			<polygon points="98.5,18 98.5,18.6 98.5,19.2 98.5,19.7 98.5,20.3 99,20.3 99,19.7 99,19.2 99,18.6 99,18 			"/>
-		</g>
-		<g>
-			<polygon points="96.2,18 95.7,18 95.7,18.6 95.7,19.1 96.2,19.1 96.2,18.6 			"/>
-		</g>
-		<g>
-			<rect x="93.43" y="18.64" transform="matrix(5.134305e-03 -1 1 5.134305e-03 74.3037 112.5742)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="92.9,18 92.3,18 92.3,18.6 92.9,18.6 93.4,18.6 93.4,18 			"/>
-		</g>
-		<g>
-			<polygon points="98.5,16.9 97.9,16.9 97.9,17.5 97.9,18 98.5,18 98.5,17.5 			"/>
-		</g>
-		<g>
-			<rect x="95.21" y="17.44" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.2823 113.1613)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="94.49" y="16.83" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.1711 111.8337)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="97.9,15.8 97.4,15.8 97.4,16.3 97.4,16.9 97.9,16.9 97.9,16.3 			"/>
-		</g>
-		<g>
-			<polygon points="94,16.3 93.4,16.3 93.4,16.9 94,16.9 94.5,16.9 94.5,16.3 			"/>
-		</g>
-		<g>
-			<polygon points="92.9,15.8 92.3,15.8 92.3,16.3 92.9,16.3 93.4,16.3 93.4,15.8 			"/>
-		</g>
-		<g>
-			<rect x="96.88" y="15.11" transform="matrix(5.134305e-03 -1 1 5.134305e-03 81.2768 112.5089)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="96.2,14.7 95.7,14.6 95.7,15.2 96.2,15.2 96.8,15.2 96.8,14.7 			"/>
-		</g>
-		<g>
-			<polygon points="95.1,14.1 94.6,14.1 94.6,14.6 95.1,14.6 95.7,14.6 95.7,14.1 			"/>
-		</g>
-		<g>
-			<polygon points="94,13.5 93.4,13.5 92.9,13.5 92.3,13.5 92.3,14.1 92.9,14.1 93.4,14.1 94,14.1 94.6,14.1 94.6,13.5 			"/>
-		</g>
-	</g>
-	<g class="st3">
-		<path class="st4" d="M93.5,71.9c-2.2,0-4.5,0-6.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.7,0-1.8,0-2.5
-			c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7c3.3,0,6.7,0,10.1,0v-0.8h0.8v-0.8C94.7,71.9,93.9,71.9,93.5,71.9z"/>
-		<path class="st4" d="M101,68.6v-0.8h0.8c0-0.7,0-1.8,0-2.5c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8
-			c0-0.4,0-1.3,0-1.7h0.8V68.6z"/>
-		<path class="st4" d="M127.8,67.7h0.8v-0.8h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
-			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8C127.8,68.8,127.8,67.7,127.8,67.7z M126.1,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
-			c2.2,0,4.5,0,6.7,0V67.7z"/>
-		<path class="st4" d="M114.4,67.7h0.8v-0.8h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
-			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H101c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8L114.4,67.7L114.4,67.7z M112.7,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
-			c2.2,0,4.5,0,6.7,0V67.7z"/>
-		<path class="st4" d="M142.1,66.9v-0.8h0.8v-0.8c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H128c0,0.4,0,1.3,0,1.7c3.6,0,7.3,0,10.9,0V73h0.8v-0.8c-3.1,0-6.2,0-9.2,0v-0.8h0.8
-			v-0.8c2.5,0,5.1,0,7.5,0v-0.8h0.8V69c-2.5,0-5.1,0-7.5,0v-0.8h0.8v-0.8C135.9,66.9,139,66.9,142.1,66.9z"/>
-		<path class="st4" d="M85.1,66.9v-0.8h0.8v-0.8c-4.2,0-8.4,0-12.6,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H70c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8
-			c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c2.5,0,5.1,0,7.5,0v-0.8h0.8v-0.8c-2.5,0-5.1,0-7.5,0v-0.8H75v-0.8
-			C78.3,66.9,81.7,66.9,85.1,66.9z"/>
-		<path class="st4" d="M156.3,65.2c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H143c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c1.9,0,3.9,0,5.9,0v0.8h0.8V72
-			h0.8v0.8h0.8v0.8h0.8v0.8h0.8v0.8c0.4,0,1.3,0,1.7,0c0-0.4,0-1.3,0-1.7h-0.8v-0.8h-0.8v-0.8h-0.8v-0.8H153c0-0.4,0-1.3,0-1.7h0.8
-			v-0.8h0.8v-0.8h0.8V67h0.8v-0.8h0.8v-0.8h-0.7L156.3,65.2L156.3,65.2z M153,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
-			c2.2,0,4.5,0,6.7,0V67.7z"/>
-	</g>
-	<g>
-		<path class="st5" d="M93.2,72c-2.2,0-4.5,0-6.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.7,0-1.8,0-2.5
-			c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H84
-			c0,0.4,0,1.3,0,1.7c3.3,0,6.7,0,10,0V73h0.8v-1C94.5,72,93.7,72,93.2,72z"/>
-		<path class="st5" d="M100.8,68.7v-0.8h0.8c0-0.7,0-1.8,0-2.5c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8
-			c0-0.4,0-1.3,0-1.7h0.8V68.7z"/>
-		<path class="st5" d="M127.6,67.8h0.8V67h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
-			h-0.8c0,0.4,0,1.3,0,1.7H115c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8v-1.1H127.6z M125.9,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67c2.2,0,4.5,0,6.7,0V67.8z"
-			/>
-		<path class="st5" d="M114.2,67.8h0.8V67h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
-			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8C114.2,68.9,114.2,67.8,114.2,67.8z M112.5,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67
-			c2.2,0,4.5,0,6.7,0V67.8z"/>
-		<path class="st5" d="M141.8,67v-0.8h0.8v-0.8c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c3.6,0,7.3,0,10.9,0v-0.8h0.8V72c-3,0-6.2,0-9.2,0v-0.8h0.8
-			v-0.8c2.5,0,5,0,7.5,0v-0.8h0.8v-0.8c-2.5,0-5,0-7.5,0V68h0.8v-1C135.7,67,138.8,67,141.8,67z"/>
-		<path class="st5" d="M84.9,67v-0.8h0.8v-0.8c-4.2,0-8.4,0-12.6,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H69c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8
-			c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c2.5,0,5,0,7.5,0v-0.8h0.8V69c-2.5,0-5,0-7.5,0v-0.8h0.8V67
-			C78.2,67,81.6,67,84.9,67z"/>
-		<path class="st5" d="M156.1,65.3c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H142
-			c0,0.4,0,1.3,0,1.7h-1c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c1.9,0,3.9,0,5.9,0v0.8h0.8V72h0.8
-			v0.8h0.8v0.8h0.8v0.8h0.8v0.8c0.4,0,1.3,0,1.7,0c0-0.4,0-1.3,0-1.7h-0.8v-0.8h-0.8V72h-0.8v-0.8h-0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			h0.8v-0.8h0.8V67h0.8v-0.8h0.8v-0.8h-0.6V65.3z M152.7,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67c2.2,0,4.5,0,6.7,0V67.8z"/>
-	</g>
-</g>
-</svg>

BIN
docs/images/youtube.png


+ 250 - 151
pokemon_app.cpp

@@ -1,160 +1,205 @@
 #include "pokemon_app.h"
 #include "pokemon_app.h"
 
 
 struct pokemon_lut pokemon_table[] = {
 struct pokemon_lut pokemon_table[] = {
-    {"Bulbasaur", &I_bulbasaur, 0x99},
-    {"Ivysaur", &I_ivysaur, 0x09},
-    {"Venusaur", &I_venusaur, 0x9A},
-    {"Charmander", &I_charmander, 0xB0},
-    {"Charmeleon", &I_charmeleon, 0xB2},
-    {"Charizard", &I_charizard, 0xB4},
-    {"Squirtle", &I_squirtle, 0xB1},
-    {"Wartortle", &I_wartortle, 0xB3},
-    {"Blastoise", &I_blastoise, 0x1C},
-    {"Caterpie", &I_caterpie, 0x7B},
-    {"Metapod", &I_metapod, 0x7C},
-    {"Butterfree", &I_butterfree, 0x7D},
-    {"Weedle", &I_weedle, 0x70},
-    {"Kakuna", &I_kakuna, 0x71},
-    {"Beedrill", &I_beedrill, 0x72},
-    {"Pidgey", &I_pidgey, 0x24},
-    {"Pidgeotto", &I_pidgeotto, 0x96},
-    {"Pidgeot", &I_pidgeot, 0x97},
-    {"Rattata", &I_rattata, 0xA5},
-    {"Raticate", &I_raticate, 0xA6},
-    {"Spearow", &I_spearow, 0x05},
-    {"Fearow", &I_fearow, 0x23},
-    {"Ekans", &I_ekans, 0x6C},
-    {"Arbok", &I_arbok, 0x2D},
-    {"Pikachu", &I_pikachu, 0x54},
-    {"Raichu", &I_raichu, 0x55},
-    {"Sandshrew", &I_sandshrew, 0x60},
-    {"Sandslash", &I_sandslash, 0x61},
-    {"Nidoran ♀", &I_nidoranf, 0x0F},
-    {"Nidorina", &I_nidorina, 0xA8},
-    {"Nidoqueen", &I_nidoqueen, 0x10},
-    {"Nidoran ♂", &I_nidoranm, 0x03},
-    {"Nidorino", &I_nidorino, 0xA7},
-    {"Nidoking", &I_nidoking, 0x07},
-    {"Clefairy", &I_clefairy, 0x04},
-    {"Clefable", &I_clefable, 0x8E},
-    {"Vulpix", &I_vulpix, 0x52},
-    {"Ninetales", &I_ninetales, 0x53},
-    {"Jigglypuff", &I_jigglypuff, 0x64},
-    {"Wigglytuff", &I_wigglytuff, 0x65},
-    {"Zubat", &I_zubat, 0x6B},
-    {"Golbat", &I_golbat, 0x82},
-    {"Oddish", &I_oddish, 0xB9},
-    {"Gloom", &I_gloom, 0xBA},
-    {"Vileplume", &I_vileplume, 0xBB},
-    {"Paras", &I_paras, 0x6D},
-    {"Parasect", &I_parasect, 0x2E},
-    {"Venonat", &I_venonat, 0x41},
-    {"Venomoth", &I_venomoth, 0x77},
-    {"Diglett", &I_diglett, 0x3B},
-    {"Dugtrio", &I_dugtrio, 0x76},
-    {"Meowth", &I_meowth, 0x4D},
-    {"Persian", &I_persian, 0x90},
-    {"Psyduck", &I_psyduck, 0x2F},
-    {"Golduck", &I_golduck, 0x80},
-    {"Mankey", &I_mankey, 0x39},
-    {"Primeape", &I_primeape, 0x75},
-    {"Growlithe", &I_growlithe, 0x21},
-    {"Arcanine", &I_arcanine, 0x14},
-    {"Poliwag", &I_poliwag, 0x47},
-    {"Poliwhirl", &I_poliwhirl, 0x6E},
-    {"Poliwrath", &I_poliwrath, 0x6F},
-    {"Abra", &I_abra, 0x94},
-    {"Kadabra", &I_kadabra, 0x26},
-    {"Alakazam", &I_alakazam, 0x95},
-    {"Machop", &I_machop, 0x6A},
-    {"Machoke", &I_machoke, 0x29},
-    {"Machamp", &I_machamp, 0x7E},
-    {"Bellsprout", &I_bellsprout, 0xBC},
-    {"Weepinbell", &I_weepinbell, 0xBD},
-    {"Victreebel", &I_victreebel, 0xBE},
-    {"Tentacool", &I_tentacool, 0x18},
-    {"Tentacruel", &I_tentacruel, 0x9B},
-    {"Geodude", &I_geodude, 0xA9},
-    {"Graveler", &I_graveler, 0x27},
-    {"Golem", &I_golem, 0x31},
-    {"Ponyta", &I_ponyta, 0xA3},
-    {"Rapidash", &I_rapidash, 0xA4},
-    {"Slowpoke", &I_slowpoke, 0x25},
-    {"Slowbro", &I_slowbro, 0x08},
-    {"Magnemite", &I_magnemite, 0xAD},
-    {"Magneton", &I_magneton, 0x36},
-    {"Farfetch'd", &I_farfetchd, 0x40},
-    {"Doduo", &I_doduo, 0x46},
-    {"Dodrio", &I_dodrio, 0x74},
-    {"Seel", &I_seel, 0x3A},
-    {"Dewgong", &I_dewgong, 0x78},
-    {"Grimer", &I_grimer, 0x0D},
-    {"Muk", &I_muk, 0x88},
-    {"Shellder", &I_shellder, 0x17},
-    {"Cloyster", &I_cloyster, 0x8B},
-    {"Gastly", &I_gastly, 0x19},
-    {"Haunter", &I_haunter, 0x93},
-    {"Gengar", &I_gengar, 0x0E},
-    {"Onix", &I_onix, 0x22},
-    {"Drowzee", &I_drowzee, 0x30},
-    {"Hypno", &I_hypno, 0x81},
-    {"Krabby", &I_krabby, 0x4E},
-    {"Kingler", &I_kingler, 0x8A},
-    {"Voltorb", &I_voltorb, 0x06},
-    {"Electrode", &I_electrode, 0x8D},
-    {"Exeggcute", &I_exeggcute, 0x0C},
-    {"Exeggutor", &I_exeggutor, 0x0A},
-    {"Cubone", &I_cubone, 0x11},
-    {"Marowak", &I_marowak, 0x91},
-    {"Hitmonlee", &I_hitmonlee, 0x2B},
-    {"Hitmonchan", &I_hitmonchan, 0x2C},
-    {"Lickitung", &I_lickitung, 0x0B},
-    {"Koffing", &I_koffing, 0x37},
-    {"Weezing", &I_weezing, 0x8F},
-    {"Rhyhorn", &I_rhyhorn, 0x12},
-    {"Rhydon", &I_rhydon, 0x01},
-    {"Chansey", &I_chansey, 0x28},
-    {"Tangela", &I_tangela, 0x1E},
-    {"Kangaskhan", &I_kangaskhan, 0x02},
-    {"Horsea", &I_horsea, 0x5C},
-    {"Seadra", &I_seadra, 0x5D},
-    {"Goldeen", &I_goldeen, 0x9D},
-    {"Seaking", &I_seaking, 0x9E},
-    {"Staryu", &I_staryu, 0x1B},
-    {"Starmie", &I_starmie, 0x98},
-    {"Mr. Mime", &I_mr_mime, 0x2A},
-    {"Scyther", &I_scyther, 0x1A},
-    {"Jynx", &I_jynx, 0x48},
-    {"Electabuzz", &I_electabuzz, 0x35},
-    {"Magmar", &I_magmar, 0x33},
-    {"Pinsir", &I_pinsir, 0x1D},
-    {"Tauros", &I_tauros, 0x3C},
-    {"Magikarp", &I_magikarp, 0x85},
-    {"Gyarados", &I_gyarados, 0x16},
-    {"Lapras", &I_lapras, 0x13},
-    {"Ditto", &I_ditto, 0x4C},
-    {"Eevee", &I_eevee, 0x66},
-    {"Vaporeon", &I_vaporeon, 0x69},
-    {"Jolteon", &I_jolteon, 0x68},
-    {"Flareon", &I_flareon, 0x67},
-    {"Porygon", &I_porygon, 0xAA},
-    {"Omanyte", &I_omanyte, 0x62},
-    {"Omastar", &I_omastar, 0x63},
-    {"Kabuto", &I_kabuto, 0x5A},
-    {"Kabutops", &I_kabutops, 0x5B},
-    {"Aerodactyl", &I_aerodactyl, 0xAB},
-    {"Snorlax", &I_snorlax, 0x84},
-    {"Articuno", &I_articuno, 0x4A},
-    {"Zapdos", &I_zapdos, 0x4B},
-    {"Moltres", &I_moltres, 0x49},
-    {"Dratini", &I_dratini, 0x58},
-    {"Dragonair", &I_dragonair, 0x59},
-    {"Dragonite", &I_dragonite, 0x42},
-    {"Mewtwo", &I_mewtwo, 0x83},
-    {"Mew", &I_mew, 0x15},
+    {"Bulbasaur", &I_bulbasaur, 0x99, 0x16, 0x03, 1, 45, 49, 49, 45, 65},
+    {"Ivysaur", &I_ivysaur, 0x09, 0x16, 0x03, 1, 60, 62, 63, 60, 80},
+    {"Venusaur", &I_venusaur, 0x9A, 0x16, 0x03, 1, 80, 82, 83, 80, 100},
+    {"Charmander", &I_charmander, 0xB0, 0x14, 0xFF, 1, 39, 52, 43, 65, 50},
+    {"Charmeleon", &I_charmeleon, 0xB2, 0x14, 0xFF, 1, 58, 64, 58, 80, 65},
+    {"Charizard", &I_charizard, 0xB4, 0x14, 0x02, 1, 78, 84, 78, 100, 85},
+    {"Squirtle", &I_squirtle, 0xB1, 0x15, 0xFF, 1, 44, 48, 65, 43, 50},
+    {"Wartortle", &I_wartortle, 0xB3, 0x15, 0xFF, 1, 59, 63, 80, 58, 65},
+    {"Blastoise", &I_blastoise, 0x1C, 0x15, 0xFF, 1, 79, 83, 100, 78, 85},
+    {"Caterpie", &I_caterpie, 0x7B, 0x07, 0xFF, 2, 45, 30, 35, 45, 20},
+    {"Metapod", &I_metapod, 0x7C, 0x07, 0xFF, 2, 50, 20, 55, 30, 25},
+    {"Butterfree", &I_butterfree, 0x7D, 0x07, 0x02, 2, 60, 45, 50, 70, 80},
+    {"Weedle", &I_weedle, 0x70, 0x07, 0x03, 2, 40, 35, 30, 50, 20},
+    {"Kakuna", &I_kakuna, 0x71, 0x07, 0x03, 2, 45, 25, 50, 35, 25},
+    {"Beedrill", &I_beedrill, 0x72, 0x07, 0x03, 2, 65, 80, 40, 75, 45},
+    {"Pidgey", &I_pidgey, 0x24, 0x00, 0x02, 1, 40, 45, 40, 56, 35},
+    {"Pidgeotto", &I_pidgeotto, 0x96, 0x00, 0x02, 1, 63, 60, 55, 71, 50},
+    {"Pidgeot", &I_pidgeot, 0x97, 0x00, 0x02, 1, 83, 80, 75, 91, 70},
+    {"Rattata", &I_rattata, 0xA5, 0x00, 0xFF, 2, 30, 56, 35, 72, 25},
+    {"Raticate", &I_raticate, 0xA6, 0x00, 0xFF, 2, 55, 81, 60, 97, 50},
+    {"Spearow", &I_spearow, 0x05, 0x00, 0x02, 2, 40, 60, 30, 70, 31},
+    {"Fearow", &I_fearow, 0x23, 0x00, 0x02, 2, 65, 90, 65, 100, 61},
+    {"Ekans", &I_ekans, 0x6C, 0x03, 0xFF, 2, 35, 60, 44, 55, 40},
+    {"Arbok", &I_arbok, 0x2D, 0x03, 0xFF, 2, 60, 85, 69, 80, 65},
+    {"Pikachu", &I_pikachu, 0x54, 0x17, 0xFF, 2, 35, 55, 30, 90, 50},
+    {"Raichu", &I_raichu, 0x55, 0x17, 0xFF, 2, 60, 90, 55, 100, 90},
+    {"Sandshrew", &I_sandshrew, 0x60, 0x04, 0xFF, 2, 50, 75, 85, 40, 30},
+    {"Sandslash", &I_sandslash, 0x61, 0x04, 0xFF, 2, 75, 100, 110, 65, 55},
+    {"Nidoran@", &I_nidoranf, 0x0F, 0x03, 0xFF, 1, 55, 47, 52, 41, 40},
+    {"Nidorina", &I_nidorina, 0xA8, 0x03, 0xFF, 1, 70, 62, 67, 56, 55},
+    {"Nidoqueen", &I_nidoqueen, 0x10, 0x03, 0x04, 1, 90, 82, 87, 76, 75},
+    {"Nidoran!", &I_nidoranm, 0x03, 0x03, 0xFF, 1, 46, 57, 40, 50, 40},
+    {"Nidorino", &I_nidorino, 0xA7, 0x03, 0xFF, 1, 61, 72, 57, 65, 55},
+    {"Nidoking", &I_nidoking, 0x07, 0x03, 0x04, 1, 81, 92, 77, 85, 75},
+    {"Clefairy", &I_clefairy, 0x04, 0x00, 0xFF, 3, 70, 45, 48, 35, 60},
+    {"Clefable", &I_clefable, 0x8E, 0x00, 0xFF, 3, 95, 70, 73, 60, 85},
+    {"Vulpix", &I_vulpix, 0x52, 0x14, 0xFF, 2, 38, 41, 40, 65, 65},
+    {"Ninetales", &I_ninetales, 0x53, 0x14, 0xFF, 2, 73, 76, 75, 100, 100},
+    {"Jigglypuff", &I_jigglypuff, 0x64, 0x00, 0xFF, 3, 115, 45, 20, 20, 25},
+    {"Wigglytuff", &I_wigglytuff, 0x65, 0x00, 0xFF, 3, 140, 70, 45, 45, 50},
+    {"Zubat", &I_zubat, 0x6B, 0x03, 0x02, 2, 40, 45, 35, 55, 40},
+    {"Golbat", &I_golbat, 0x82, 0x03, 0x02, 2, 75, 80, 70, 90, 75},
+    {"Oddish", &I_oddish, 0xB9, 0x16, 0x03, 1, 45, 50, 55, 30, 75},
+    {"Gloom", &I_gloom, 0xBA, 0x16, 0x03, 1, 60, 65, 70, 40, 85},
+    {"Vileplume", &I_vileplume, 0xBB, 0x16, 0x03, 1, 75, 80, 85, 50, 100},
+    {"Paras", &I_paras, 0x6D, 0x07, 0x16, 2, 35, 70, 55, 25, 55},
+    {"Parasect", &I_parasect, 0x2E, 0x07, 0x16, 2, 60, 95, 80, 30, 80},
+    {"Venonat", &I_venonat, 0x41, 0x07, 0x03, 2, 60, 55, 50, 45, 40},
+    {"Venomoth", &I_venomoth, 0x77, 0x07, 0x03, 2, 70, 65, 60, 90, 90},
+    {"Diglett", &I_diglett, 0x3B, 0x04, 0xFF, 2, 10, 55, 25, 95, 45},
+    {"Dugtrio", &I_dugtrio, 0x76, 0x04, 0xFF, 2, 35, 80, 50, 120, 70},
+    {"Meowth", &I_meowth, 0x4D, 0x00, 0xFF, 2, 40, 45, 35, 90, 40},
+    {"Persian", &I_persian, 0x90, 0x00, 0xFF, 2, 65, 70, 60, 115, 65},
+    {"Psyduck", &I_psyduck, 0x2F, 0x15, 0xFF, 2, 50, 52, 48, 55, 50},
+    {"Golduck", &I_golduck, 0x80, 0x15, 0xFF, 2, 80, 82, 78, 85, 80},
+    {"Mankey", &I_mankey, 0x39, 0x01, 0xFF, 2, 40, 80, 35, 70, 35},
+    {"Primeape", &I_primeape, 0x75, 0x01, 0xFF, 2, 65, 105, 60, 95, 60},
+    {"Growlithe", &I_growlithe, 0x21, 0x14, 0xFF, 0, 55, 70, 45, 60, 50},
+    {"Arcanine", &I_arcanine, 0x14, 0x14, 0xFF, 0, 90, 110, 80, 95, 80},
+    {"Poliwag", &I_poliwag, 0x47, 0x15, 0xFF, 1, 40, 50, 40, 90, 40},
+    {"Poliwhirl", &I_poliwhirl, 0x6E, 0x15, 0xFF, 1, 65, 65, 65, 90, 50},
+    {"Poliwrath", &I_poliwrath, 0x6F, 0x15, 0x01, 1, 90, 85, 95, 70, 70},
+    {"Abra", &I_abra, 0x94, 0x18, 0xFF, 1, 25, 20, 15, 90, 105},
+    {"Kadabra", &I_kadabra, 0x26, 0x18, 0xFF, 1, 40, 35, 30, 105, 120},
+    {"Alakazam", &I_alakazam, 0x95, 0x18, 0xFF, 1, 55, 50, 45, 120, 135},
+    {"Machop", &I_machop, 0x6A, 0x01, 0xFF, 1, 70, 80, 50, 35, 35},
+    {"Machoke", &I_machoke, 0x29, 0x01, 0xFF, 1, 80, 100, 70, 45, 50},
+    {"Machamp", &I_machamp, 0x7E, 0x01, 0xFF, 1, 90, 130, 80, 55, 65},
+    {"Bellsprout", &I_bellsprout, 0xBC, 0x16, 0x03, 1, 50, 75, 35, 40, 70},
+    {"Weepinbell", &I_weepinbell, 0xBD, 0x16, 0x03, 1, 65, 90, 50, 55, 85},
+    {"Victreebel", &I_victreebel, 0xBE, 0x16, 0x03, 1, 80, 105, 65, 70, 100},
+    {"Tentacool", &I_tentacool, 0x18, 0x15, 0x03, 0, 40, 40, 35, 70, 100},
+    {"Tentacruel", &I_tentacruel, 0x9B, 0x15, 0x03, 0, 80, 70, 65, 100, 120},
+    {"Geodude", &I_geodude, 0xA9, 0x05, 0x04, 1, 40, 80, 100, 20, 30},
+    {"Graveler", &I_graveler, 0x27, 0x05, 0x04, 1, 55, 95, 115, 35, 45},
+    {"Golem", &I_golem, 0x31, 0x05, 0x04, 1, 80, 110, 130, 45, 55},
+    {"Ponyta", &I_ponyta, 0xA3, 0x14, 0xFF, 2, 50, 85, 55, 90, 65},
+    {"Rapidash", &I_rapidash, 0xA4, 0x14, 0xFF, 2, 65, 100, 70, 105, 80},
+    {"Slowpoke", &I_slowpoke, 0x25, 0x15, 0x18, 2, 90, 65, 65, 15, 40},
+    {"Slowbro", &I_slowbro, 0x08, 0x15, 0x18, 2, 95, 75, 110, 30, 80},
+    {"Magnemite", &I_magnemite, 0xAD, 0x17, 0xFF, 2, 25, 35, 70, 45, 95},
+    {"Magneton", &I_magneton, 0x36, 0x17, 0xFF, 2, 50, 60, 95, 70, 120},
+    {"Farfetch'd", &I_farfetchd, 0x40, 0x00, 0x02, 2, 52, 65, 55, 60, 58},
+    {"Doduo", &I_doduo, 0x46, 0x00, 0x02, 2, 35, 85, 45, 75, 35},
+    {"Dodrio", &I_dodrio, 0x74, 0x00, 0x02, 2, 60, 110, 70, 100, 60},
+    {"Seel", &I_seel, 0x3A, 0x15, 0xFF, 2, 65, 45, 55, 45, 70},
+    {"Dewgong", &I_dewgong, 0x78, 0x15, 0x19, 2, 90, 70, 80, 70, 95},
+    {"Grimer", &I_grimer, 0x0D, 0x03, 0xFF, 2, 80, 80, 50, 25, 40},
+    {"Muk", &I_muk, 0x88, 0x03, 0xFF, 2, 105, 105, 75, 50, 65},
+    {"Shellder", &I_shellder, 0x17, 0x15, 0xFF, 0, 30, 65, 100, 40, 45},
+    {"Cloyster", &I_cloyster, 0x8B, 0x15, 0x19, 0, 50, 95, 180, 70, 85},
+    {"Gastly", &I_gastly, 0x19, 0x08, 0x03, 1, 30, 35, 30, 80, 100},
+    {"Haunter", &I_haunter, 0x93, 0x08, 0x03, 1, 45, 50, 45, 95, 115},
+    {"Gengar", &I_gengar, 0x0E, 0x08, 0x03, 1, 60, 65, 60, 110, 130},
+    {"Onix", &I_onix, 0x22, 0x05, 0x04, 2, 35, 45, 160, 70, 30},
+    {"Drowzee", &I_drowzee, 0x30, 0x18, 0xFF, 2, 60, 48, 45, 42, 90},
+    {"Hypno", &I_hypno, 0x81, 0x18, 0xFF, 2, 85, 73, 70, 67, 115},
+    {"Krabby", &I_krabby, 0x4E, 0x15, 0xFF, 2, 30, 105, 90, 50, 25},
+    {"Kingler", &I_kingler, 0x8A, 0x15, 0xFF, 2, 55, 130, 115, 75, 50},
+    {"Voltorb", &I_voltorb, 0x06, 0x17, 0xFF, 2, 40, 30, 50, 100, 55},
+    {"Electrode", &I_electrode, 0x8D, 0x17, 0xFF, 2, 60, 50, 70, 140, 80},
+    {"Exeggcute", &I_exeggcute, 0x0C, 0x16, 0x18, 0, 60, 40, 80, 40, 60},
+    {"Exeggutor", &I_exeggutor, 0x0A, 0x16, 0x18, 0, 95, 95, 85, 55, 125},
+    {"Cubone", &I_cubone, 0x11, 0x04, 0xFF, 2, 50, 50, 95, 35, 40},
+    {"Marowak", &I_marowak, 0x91, 0x04, 0xFF, 2, 60, 80, 110, 45, 50},
+    {"Hitmonlee", &I_hitmonlee, 0x2B, 0x01, 0xFF, 2, 50, 120, 53, 87, 35},
+    {"Hitmonchan", &I_hitmonchan, 0x2C, 0x01, 0xFF, 2, 50, 105, 79, 76, 35},
+    {"Lickitung", &I_lickitung, 0x0B, 0x00, 0xFF, 2, 90, 55, 75, 30, 60},
+    {"Koffing", &I_koffing, 0x37, 0x03, 0xFF, 2, 40, 65, 95, 35, 60},
+    {"Weezing", &I_weezing, 0x8F, 0x03, 0xFF, 2, 65, 90, 120, 60, 85},
+    {"Rhyhorn", &I_rhyhorn, 0x12, 0x04, 0x05, 0, 80, 85, 95, 25, 30},
+    {"Rhydon", &I_rhydon, 0x01, 0x04, 0x05, 0, 105, 130, 120, 40, 45},
+    {"Chansey", &I_chansey, 0x28, 0x00, 0xFF, 3, 250, 5, 5, 50, 105},
+    {"Tangela", &I_tangela, 0x1E, 0x16, 0xFF, 2, 65, 55, 115, 60, 100},
+    {"Kangaskhan", &I_kangaskhan, 0x02, 0x00, 0xFF, 2, 105, 95, 80, 90, 40},
+    {"Horsea", &I_horsea, 0x5C, 0x15, 0xFF, 2, 30, 40, 70, 60, 70},
+    {"Seadra", &I_seadra, 0x5D, 0x15, 0xFF, 2, 55, 65, 95, 85, 95},
+    {"Goldeen", &I_goldeen, 0x9D, 0x15, 0xFF, 2, 45, 67, 60, 63, 50},
+    {"Seaking", &I_seaking, 0x9E, 0x15, 0xFF, 2, 80, 92, 65, 68, 80},
+    {"Staryu", &I_staryu, 0x1B, 0x15, 0xFF, 0, 30, 45, 55, 85, 70},
+    {"Starmie", &I_starmie, 0x98, 0x15, 0x18, 0, 60, 75, 85, 115, 100},
+    {"Mr. Mime", &I_mr_mime, 0x2A, 0x18, 0xFF, 2, 40, 45, 65, 90, 100},
+    {"Scyther", &I_scyther, 0x1A, 0x07, 0x02, 2, 70, 110, 80, 105, 55},
+    {"Jynx", &I_jynx, 0x48, 0x19, 0x18, 2, 65, 50, 35, 95, 95},
+    {"Electabuzz", &I_electabuzz, 0x35, 0x17, 0xFF, 2, 65, 83, 57, 105, 85},
+    {"Magmar", &I_magmar, 0x33, 0x14, 0xFF, 2, 65, 95, 57, 93, 85},
+    {"Pinsir", &I_pinsir, 0x1D, 0x07, 0xFF, 0, 65, 125, 100, 85, 55},
+    {"Tauros", &I_tauros, 0x3C, 0x00, 0xFF, 0, 75, 100, 95, 110, 70},
+    {"Magikarp", &I_magikarp, 0x85, 0x15, 0xFF, 0, 20, 10, 55, 80, 20},
+    {"Gyarados", &I_gyarados, 0x16, 0x15, 0x02, 0, 95, 125, 79, 81, 100},
+    {"Lapras", &I_lapras, 0x13, 0x15, 0x19, 0, 130, 85, 80, 60, 95},
+    {"Ditto", &I_ditto, 0x4C, 0x00, 0xFF, 2, 48, 48, 48, 48, 48},
+    {"Eevee", &I_eevee, 0x66, 0x00, 0xFF, 2, 55, 55, 50, 55, 65},
+    {"Vaporeon", &I_vaporeon, 0x69, 0x15, 0xFF, 2, 130, 65, 60, 65, 110},
+    {"Jolteon", &I_jolteon, 0x68, 0x17, 0xFF, 2, 65, 65, 60, 130, 110},
+    {"Flareon", &I_flareon, 0x67, 0x14, 0xFF, 2, 65, 130, 60, 65, 110},
+    {"Porygon", &I_porygon, 0xAA, 0x00, 0xFF, 2, 65, 60, 70, 40, 75},
+    {"Omanyte", &I_omanyte, 0x62, 0x05, 0x15, 2, 35, 40, 100, 35, 90},
+    {"Omastar", &I_omastar, 0x63, 0x05, 0x15, 2, 70, 60, 125, 55, 115},
+    {"Kabuto", &I_kabuto, 0x5A, 0x05, 0x15, 2, 30, 80, 90, 55, 45},
+    {"Kabutops", &I_kabutops, 0x5B, 0x05, 0x15, 2, 60, 115, 105, 80, 70},
+    {"Aerodactyl", &I_aerodactyl, 0xAB, 0x05, 0x02, 0, 80, 105, 65, 130, 60},
+    {"Snorlax", &I_snorlax, 0x84, 0x00, 0xFF, 0, 160, 110, 65, 30, 65},
+    {"Articuno", &I_articuno, 0x4A, 0x19, 0x02, 0, 90, 85, 100, 85, 125},
+    {"Zapdos", &I_zapdos, 0x4B, 0x17, 0x02, 0, 90, 90, 85, 100, 125},
+    {"Moltres", &I_moltres, 0x49, 0x14, 0x02, 0, 90, 100, 90, 90, 125},
+    {"Dratini", &I_dratini, 0x58, 0x1A, 0xFF, 0, 41, 64, 45, 50, 50},
+    {"Dragonair", &I_dragonair, 0x59, 0x1A, 0xFF, 0, 61, 84, 65, 70, 70},
+    {"Dragonite", &I_dragonite, 0x42, 0x1A, 0x02, 0, 91, 134, 95, 80, 100},
+    {"Mewtwo", &I_mewtwo, 0x83, 0x18, 0xFF, 0, 106, 110, 90, 130, 154},
+    {"Mew", &I_mew, 0x15, 0x18, 0xFF, 1, 100, 100, 100, 100, 100},
     {},
     {},
 };
 };
 
 
+struct pokemon_mv move_table[] = {
+    {"No Move", 0x00},      {"Absorb", 0x47},       {"Acid Armor", 0x97},   {"Acid", 0x33},
+    {"Agility", 0x61},      {"Amnesia", 0x85},      {"Aurora Beam", 0x3E},  {"Barrage", 0x8C},
+    {"Barrier", 0x70},      {"Bide", 0x75},         {"Bind", 0x14},         {"Bite", 0x2C},
+    {"Blizzard", 0x3B},     {"Body Slam", 0x22},    {"Bone Club", 0x7D},    {"Boomerang", 0x9B},
+    {"Bubblebeam", 0x3D},   {"Bubble", 0x91},       {"Clamp", 0x80},        {"Comet Punch", 0x04},
+    {"Confuse Ray", 0x6D},  {"Confusion", 0x5D},    {"Constrict", 0x84},    {"Conversion", 0xA0},
+    {"Counter", 0x44},      {"Crabhammer", 0x98},   {"Cut", 0x0F},          {"Defense Curl", 0x6F},
+    {"Dig", 0x5B},          {"Disable", 0x32},      {"Dizzy Punch", 0x92},  {"Doubleslap", 0x03},
+    {"Double Kick", 0x18},  {"Double Team", 0x68},  {"Double-Edge", 0x26},  {"Dragon Rage", 0x52},
+    {"Dream Eater", 0x8A},  {"Drill Peck", 0x41},   {"Earthquake", 0x59},   {"Egg Bomb", 0x79},
+    {"Ember", 0x34},        {"Explosion", 0x99},    {"Fire Blast", 0x7E},   {"Fire Punch", 0x07},
+    {"Fire Spin", 0x53},    {"Fissure", 0x5A},      {"Flamethrower", 0x35}, {"Flash", 0x94},
+    {"Fly", 0x13},          {"Focus Energy", 0x74}, {"Fury Attack", 0x1F},  {"Fury Swipes", 0x9A},
+    {"Glare", 0x89},        {"Growl", 0x2D},        {"Growth", 0x4A},       {"Guillotine", 0x0C},
+    {"Gust", 0x10},         {"Harden", 0x6A},       {"Haze", 0x72},         {"Headbutt", 0x1D},
+    {"Hi Jump Kick", 0x88}, {"Horn Attack", 0x1E},  {"Horn Drill", 0x20},   {"Hydro Pump", 0x38},
+    {"Hyper Beam", 0x3F},   {"Hyper Fang", 0x9E},   {"Hypnosis", 0x5F},     {"Ice Beam", 0x3A},
+    {"Ice Punch", 0x08},    {"Jump Kick", 0x1A},    {"Karate Chop", 0x02},  {"Kinesis", 0x86},
+    {"Leech Life", 0x8D},   {"Leech Seed", 0x49},   {"Leer", 0x2B},         {"Lick", 0x7A},
+    {"Light Screen", 0x71}, {"Lovely Kiss", 0x8E},  {"Low Kick", 0x43},     {"Meditate", 0x60},
+    {"Mega Drain", 0x48},   {"Mega Kick", 0x19},    {"Mega Punch", 0x05},   {"Metronome", 0x76},
+    {"Mimic", 0x66},        {"Minimize", 0x6B},     {"Mirror Move", 0x77},  {"Mist", 0x36},
+    {"Night Shade", 0x65},  {"Pay Day", 0x06},      {"Peck", 0x40},         {"Petal Dance", 0x50},
+    {"Pin Missile", 0x2A},  {"Poisonpowder", 0x4D}, {"Poison Gas", 0x8B},   {"Poison Sting", 0x28},
+    {"Pound", 0x01},        {"Psybeam", 0x3C},      {"Psychic", 0x5E},      {"Psywave", 0x95},
+    {"Quick Attack", 0x62}, {"Rage", 0x63},         {"Razor Leaf", 0x4B},   {"Razor Wind", 0x0D},
+    {"Recover", 0x69},      {"Reflect", 0x73},      {"Rest", 0x9C},         {"Roar", 0x2E},
+    {"Rock Slide", 0x9D},   {"Rock Throw", 0x58},   {"Rolling Kick", 0x1B}, {"Sand Attack", 0x1C},
+    {"Scratch", 0x0A},      {"Screech", 0x67},      {"Seismic Toss", 0x45}, {"Selfdestruct", 0x78},
+    {"Sharpen", 0x9F},      {"Sing", 0x2F},         {"Skull Bash", 0x82},   {"Sky Attack", 0x8F},
+    {"Slam", 0x15},         {"Slash", 0xA3},        {"Sleep Powder", 0x4F}, {"Sludge", 0x7C},
+    {"Smog", 0x7B},         {"Smokescreen", 0x6C},  {"Softboiled", 0x87},   {"Solar Beam", 0x4C},
+    {"Sonicboom", 0x31},    {"Spike Cannon", 0x83}, {"Splash", 0x96},       {"Spore", 0x93},
+    {"Stomp", 0x17},        {"Strength", 0x46},     {"String Shot", 0x51},  {"Struggle", 0xA5},
+    {"Stun Spore", 0x4E},   {"Submission", 0x42},   {"Substitute", 0xA4},   {"Supersonic", 0x30},
+    {"Super Fang", 0xA2},   {"Surf", 0x39},         {"Swift", 0x81},        {"Swords Dance", 0x0E},
+    {"Tackle", 0x21},       {"Tail Whip", 0x27},    {"Take Down", 0x24},    {"Teleport", 0x64},
+    {"Thrash", 0x25},       {"Thunderbolt", 0x55},  {"Thunderpunch", 0x09}, {"Thundershock", 0x54},
+    {"Thunder Wave", 0x56}, {"Thunder", 0x57},      {"Toxic", 0x5C},        {"Transform", 0x90},
+    {"Tri Attack", 0xA1},   {"Twineedle", 0x29},    {"Vicegrip", 0x0B},     {"Vine Whip", 0x16},
+    {"Waterfall", 0x7F},    {"Water Gun", 0x37},    {"Whirlwind", 0x12},    {"Wing Attack", 0x11},
+    {"Withdraw", 0x6E},     {"Wrap", 0x23},
+};
+
 uint32_t pokemon_exit_confirm_view(void* context) {
 uint32_t pokemon_exit_confirm_view(void* context) {
     UNUSED(context);
     UNUSED(context);
     return AppViewExitConfirm;
     return AppViewExitConfirm;
@@ -179,6 +224,48 @@ App* pokemon_alloc() {
     view_dispatcher_add_view(
     view_dispatcher_add_view(
         app->view_dispatcher, AppViewSelectPokemon, select_pokemon_get_view(app));
         app->view_dispatcher, AppViewSelectPokemon, select_pokemon_get_view(app));
 
 
+    //  Start Index first level
+    app->current_level = 3;
+    // Select Level View
+    app->select_level = select_level_alloc(app);
+    view_set_previous_callback(select_level_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectLevel, select_level_get_view(app));
+
+    //  Start Index first stat
+    app->current_stats = 0;
+    // Select Level View
+    app->select_stats = select_stats_alloc(app);
+    view_set_previous_callback(select_stats_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectStats, select_stats_get_view(app));
+
+    //  Start Index first move
+    app->current_move = 0;
+    // Select Move View
+    app->select_move1 = select_move1_alloc(app);
+    view_set_previous_callback(select_move1_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectMove1, select_move1_get_view(app));
+
+    //  Start Index first move
+    app->current_move = 0;
+    // Select Move View
+    app->select_move2 = select_move2_alloc(app);
+    view_set_previous_callback(select_move1_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectMove2, select_move2_get_view(app));
+
+    //  Start Index first move
+    app->current_move = 0;
+    // Select Move View
+    app->select_move3 = select_move3_alloc(app);
+    view_set_previous_callback(select_move3_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectMove3, select_move3_get_view(app));
+
+    //  Start Index first move
+    app->current_move = 0;
+    // Select Move View
+    app->select_move4 = select_move4_alloc(app);
+    view_set_previous_callback(select_move4_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectMove4, select_move4_get_view(app));
+
     // Trade View
     // Trade View
     app->trade = trade_alloc(app);
     app->trade = trade_alloc(app);
     view_set_previous_callback(trade_get_view(app), pokemon_exit_confirm_view);
     view_set_previous_callback(trade_get_view(app), pokemon_exit_confirm_view);
@@ -195,6 +282,18 @@ void free_app(App* app) {
     // Free views
     // Free views
     view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectPokemon);
     view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectPokemon);
     select_pokemon_free(app);
     select_pokemon_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectLevel);
+    select_level_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectStats);
+    select_stats_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectMove1);
+    select_move1_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectMove2);
+    select_move2_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectMove3);
+    select_move3_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectMove4);
+    select_move4_free(app);
     view_dispatcher_remove_view(app->view_dispatcher, AppViewTrade);
     view_dispatcher_remove_view(app->view_dispatcher, AppViewTrade);
     trade_free(app);
     trade_free(app);
     // Close records
     // Close records

+ 46 - 0
pokemon_app.h

@@ -11,6 +11,12 @@
 #include <pokemon_icons.h>
 #include <pokemon_icons.h>
 
 
 #include "views/select_pokemon.hpp"
 #include "views/select_pokemon.hpp"
+#include "views/select_level.hpp"
+#include "views/select_stats.hpp"
+#include "views/select_move1.hpp"
+#include "views/select_move2.hpp"
+#include "views/select_move3.hpp"
+#include "views/select_move4.hpp"
 #include "views/trade.hpp"
 #include "views/trade.hpp"
 
 
 #define TAG "Pokemon"
 #define TAG "Pokemon"
@@ -19,6 +25,19 @@ struct pokemon_lut {
     const char* name;
     const char* name;
     const Icon* icon;
     const Icon* icon;
     const uint8_t hex;
     const uint8_t hex;
+    const uint8_t type1;
+    const uint8_t type2;
+    const int xp_group;
+    const int base_hp;
+    const int base_atk;
+    const int base_def;
+    const int base_spd;
+    const int base_special;
+};
+
+struct pokemon_mv {
+    const char* name;
+    const uint8_t hex;
 };
 };
 
 
 typedef struct App App;
 typedef struct App App;
@@ -36,15 +55,34 @@ struct App {
     Gui* gui;
     Gui* gui;
     ViewDispatcher* view_dispatcher;
     ViewDispatcher* view_dispatcher;
     SelectPokemon* select_pokemon;
     SelectPokemon* select_pokemon;
+    SelectLevel* select_level;
+    SelectStats* select_stats;
+    SelectMove1* select_move1;
+    SelectMove2* select_move2;
+    SelectMove3* select_move3;
+    SelectMove4* select_move4;
     Trade* trade;
     Trade* trade;
     uint32_t view_id;
     uint32_t view_id;
 
 
     int current_pokemon = 0;
     int current_pokemon = 0;
+    int current_level = 3;
+    int current_stats = 0;
+    int current_move = 0;
     char pokemon_hex_code = ' ';
     char pokemon_hex_code = ' ';
+    char move1_hex_code = ' ';
+    char move2_hex_code = ' ';
+    char move3_hex_code = ' ';
+    char move4_hex_code = ' ';
 };
 };
 
 
 typedef enum {
 typedef enum {
     AppViewSelectPokemon,
     AppViewSelectPokemon,
+    AppViewSelectLevel,
+    AppViewSelectStats,
+    AppViewSelectMove1,
+    AppViewSelectMove2,
+    AppViewSelectMove3,
+    AppViewSelectMove4,
     AppViewTrade,
     AppViewTrade,
     AppViewExitConfirm,
     AppViewExitConfirm,
 } AppView;
 } AppView;
@@ -52,7 +90,14 @@ typedef enum {
 typedef void (*SelectPokemonCallback)(void* context, uint32_t index);
 typedef void (*SelectPokemonCallback)(void* context, uint32_t index);
 typedef struct SelectPokemonModel {
 typedef struct SelectPokemonModel {
     int current_pokemon = 0;
     int current_pokemon = 0;
+    int current_level = 3;
+    int current_stats = 0;
+    int current_move = 0;
     char pokemon_hex_code = ' ';
     char pokemon_hex_code = ' ';
+    char move1_hex_code = ' ';
+    char move2_hex_code = ' ';
+    char move3_hex_code = ' ';
+    char move4_hex_code = ' ';
     bool trading = false;
     bool trading = false;
     bool connected = false;
     bool connected = false;
     render_gameboy_state_t gameboy_status = GAMEBOY_INITIAL;
     render_gameboy_state_t gameboy_status = GAMEBOY_INITIAL;
@@ -61,5 +106,6 @@ typedef struct SelectPokemonModel {
 } SelectPokemonModel;
 } SelectPokemonModel;
 
 
 extern struct pokemon_lut pokemon_table[];
 extern struct pokemon_lut pokemon_table[];
+extern struct pokemon_mv move_table[];
 
 
 #endif /* POKEMON_APP_H */
 #endif /* POKEMON_APP_H */

+ 13 - 14
pokemon_data.h

@@ -143,7 +143,7 @@ struct __attribute__((__packed__)) trade_data_block {
 };
 };
 
 
 struct trade_data_block DATA_BLOCK2 =
 struct trade_data_block DATA_BLOCK2 =
-    {.trainer_name = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00, 0x00},
+    {.trainer_name = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_},
      .party_cnt = 1,
      .party_cnt = 1,
      .party_members = {0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
      .party_members = {0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
      .party =
      .party =
@@ -281,23 +281,22 @@ struct trade_data_block DATA_BLOCK2 =
               .spd = 0x9800,
               .spd = 0x9800,
               .special = 0x9900},
               .special = 0x9900},
          },
          },
-     /* NOTE: I think this shouldn't exceed 7 chars */
      .ot_name =
      .ot_name =
          {
          {
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
          },
          },
      .nickname = {
      .nickname = {
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
      }};
      }};
 
 
 unsigned char INPUT_BLOCK[405];
 unsigned char INPUT_BLOCK[405];

+ 170 - 0
views/select_level.cpp

@@ -0,0 +1,170 @@
+#include "../pokemon_app.h"
+#include "select_level.hpp"
+
+static void select_level_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_level;
+
+    char level_num[5];
+
+    snprintf(level_num, sizeof(level_num), "#%03d", current_index);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, "Level:");
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, level_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Level");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_level_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectLevel* select_level = (SelectLevel*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_level->app->current_level = model->current_level;
+            },
+            false);
+        
+        view_dispatcher_switch_to_view(select_level->app->view_dispatcher, AppViewSelectStats);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_level->app->view_dispatcher, AppViewSelectPokemon);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_level == 3) {
+                    model->current_level = 100;
+                } else {
+                    model->current_level--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_level >= 10) {
+                    model->current_level -= 10;
+                } else {
+                    model->current_level = 100;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_level == 100) {
+                    model->current_level = 3;
+                } else {
+                    model->current_level++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_level <= 90) {
+                    model->current_level += 10;
+                } else {
+                    model->current_level = 3;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_level_enter_callback(void* context) {
+    furi_assert(context);
+    SelectLevel* select_level = (SelectLevel*)context;
+    with_view_model_cpp(
+        select_level->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_level->app->current_pokemon;
+            model->pokemon_hex_code = select_level->app->pokemon_hex_code;
+            model->current_level = select_level->app->current_level;
+        },
+        true);
+}
+
+bool select_level_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectLevel* select_level = (SelectLevel*)context;
+    view_dispatcher_send_custom_event(select_level->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_level_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectLevel* select_level_alloc(App* app) {
+    SelectLevel* select_level = (SelectLevel*)malloc(sizeof(SelectLevel));
+    select_level->app = app;
+    select_level->view = view_alloc();
+    view_set_context(select_level->view, select_level);
+    view_allocate_model(select_level->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_level->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_level = app->current_level;
+        },
+        true);
+
+    view_set_draw_callback(select_level->view, select_level_render_callback);
+    view_set_input_callback(select_level->view, select_level_input_callback);
+    view_set_enter_callback(select_level->view, select_level_enter_callback);
+    view_set_custom_callback(select_level->view, select_level_custom_callback);
+
+    view_set_exit_callback(select_level->view, select_level_exit_callback);
+    return select_level;
+}
+
+void select_level_free(App* app) {
+    furi_assert(app->select_level);
+    view_free(app->select_level->view);
+    free(app->select_level);
+}
+
+View* select_level_get_view(App* app) {
+    furi_assert(app->select_level);
+    return app->select_level->view;
+}

+ 25 - 0
views/select_level.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_LEVEL_HPP
+#define SELECCT_LEVEL_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectLevel;
+
+SelectLevel* select_level_alloc(App* app);
+
+void select_level_free(App* app);
+
+View* select_level_get_view(App* app);
+
+#endif /* SELECCT_LEVEL_HPP */

+ 172 - 0
views/select_move1.cpp

@@ -0,0 +1,172 @@
+#include "../pokemon_app.h"
+#include "select_move1.hpp"
+
+static void select_move1_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_move;
+    char move_num[5];
+
+    snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #1");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_move1_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectMove1* select_move1 = (SelectMove1*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_move1->app->current_move = model->current_move;
+                select_move1->app->move1_hex_code = move_table[model->current_move].hex;
+            },
+            false);
+        view_dispatcher_switch_to_view(select_move1->app->view_dispatcher, AppViewSelectMove2);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_move1->app->view_dispatcher, AppViewSelectStats);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 0) {
+                    model->current_move = 165;
+                } else {
+                    model->current_move--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move >= 10) {
+                    model->current_move -= 10;
+                } else {
+                    model->current_move = 165;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 165) {
+                    model->current_move = 0;
+                } else {
+                    model->current_move++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move <= 155) {
+                    model->current_move += 10;
+                } else {
+                    model->current_move = 0;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_move1_enter_callback(void* context) {
+    furi_assert(context);
+    SelectMove1* select_move1 = (SelectMove1*)context;
+    with_view_model_cpp(
+        select_move1->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_move1->app->current_pokemon;
+            model->pokemon_hex_code = select_move1->app->pokemon_hex_code;
+            model->current_level = select_move1->app->current_level;
+            model->current_stats = select_move1->app->current_stats;
+            model->move1_hex_code = select_move1->app->move1_hex_code;
+        },
+        true);
+}
+
+bool select_move1_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectMove1* select_move1 = (SelectMove1*)context;
+    view_dispatcher_send_custom_event(select_move1->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_move1_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectMove1* select_move1_alloc(App* app) {
+    SelectMove1* select_move1 = (SelectMove1*)malloc(sizeof(SelectMove1));
+    select_move1->app = app;
+    select_move1->view = view_alloc();
+    view_set_context(select_move1->view, select_move1);
+    view_allocate_model(select_move1->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_move1->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_move = app->current_move;
+            model->move1_hex_code = app->move1_hex_code;
+        },
+        true);
+
+    view_set_draw_callback(select_move1->view, select_move1_render_callback);
+    view_set_input_callback(select_move1->view, select_move1_input_callback);
+    view_set_enter_callback(select_move1->view, select_move1_enter_callback);
+    view_set_custom_callback(select_move1->view, select_move1_custom_callback);
+
+    view_set_exit_callback(select_move1->view, select_move1_exit_callback);
+    return select_move1;
+}
+
+void select_move1_free(App* app) {
+    furi_assert(app->select_move1);
+    view_free(app->select_move1->view);
+    free(app->select_move1);
+}
+
+View* select_move1_get_view(App* app) {
+    furi_assert(app->select_move1);
+    return app->select_move1->view;
+}

+ 25 - 0
views/select_move1.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_MOVE1_HPP
+#define SELECCT_MOVE1_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectMove1;
+
+SelectMove1* select_move1_alloc(App* app);
+
+void select_move1_free(App* app);
+
+View* select_move1_get_view(App* app);
+
+#endif /* SELECCT_MOVE1_HPP */

+ 173 - 0
views/select_move2.cpp

@@ -0,0 +1,173 @@
+#include "../pokemon_app.h"
+#include "select_move2.hpp"
+
+static void select_move2_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_move;
+    char move_num[5];
+
+    snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #2");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_move2_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectMove2* select_move2 = (SelectMove2*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_move2->app->current_move = model->current_move;
+                select_move2->app->move2_hex_code = move_table[model->current_move].hex;
+            },
+            false);
+        view_dispatcher_switch_to_view(select_move2->app->view_dispatcher, AppViewSelectMove3);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_move2->app->view_dispatcher, AppViewSelectMove1);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 0) {
+                    model->current_move = 165;
+                } else {
+                    model->current_move--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move >= 10) {
+                    model->current_move -= 10;
+                } else {
+                    model->current_move = 165;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 165) {
+                    model->current_move = 0;
+                } else {
+                    model->current_move++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move <= 155) {
+                    model->current_move += 10;
+                } else {
+                    model->current_move = 0;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_move2_enter_callback(void* context) {
+    furi_assert(context);
+    SelectMove2* select_move2 = (SelectMove2*)context;
+    with_view_model_cpp(
+        select_move2->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_move2->app->current_pokemon;
+            model->pokemon_hex_code = select_move2->app->pokemon_hex_code;
+            model->current_level = select_move2->app->current_level;
+            model->current_stats = select_move2->app->current_stats;
+            model->move1_hex_code = select_move2->app->move1_hex_code;
+            model->move2_hex_code = select_move2->app->move2_hex_code;
+        },
+        true);
+}
+
+bool select_move2_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectMove2* select_move2 = (SelectMove2*)context;
+    view_dispatcher_send_custom_event(select_move2->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_move2_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectMove2* select_move2_alloc(App* app) {
+    SelectMove2* select_move2 = (SelectMove2*)malloc(sizeof(SelectMove2));
+    select_move2->app = app;
+    select_move2->view = view_alloc();
+    view_set_context(select_move2->view, select_move2);
+    view_allocate_model(select_move2->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_move2->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_move = app->current_move;
+            model->move2_hex_code = app->move2_hex_code;
+        },
+        true);
+
+    view_set_draw_callback(select_move2->view, select_move2_render_callback);
+    view_set_input_callback(select_move2->view, select_move2_input_callback);
+    view_set_enter_callback(select_move2->view, select_move2_enter_callback);
+    view_set_custom_callback(select_move2->view, select_move2_custom_callback);
+
+    view_set_exit_callback(select_move2->view, select_move2_exit_callback);
+    return select_move2;
+}
+
+void select_move2_free(App* app) {
+    furi_assert(app->select_move2);
+    view_free(app->select_move2->view);
+    free(app->select_move2);
+}
+
+View* select_move2_get_view(App* app) {
+    furi_assert(app->select_move2);
+    return app->select_move2->view;
+}

+ 25 - 0
views/select_move2.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_MOVE2_HPP
+#define SELECCT_MOVE2_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectMove2;
+
+SelectMove2* select_move2_alloc(App* app);
+
+void select_move2_free(App* app);
+
+View* select_move2_get_view(App* app);
+
+#endif /* SELECCT_MOVE2_HPP */

+ 174 - 0
views/select_move3.cpp

@@ -0,0 +1,174 @@
+#include "../pokemon_app.h"
+#include "select_move3.hpp"
+
+static void select_move3_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_move;
+    char move_num[5];
+
+    snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #3");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_move3_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectMove3* select_move3 = (SelectMove3*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_move3->app->current_move = model->current_move;
+                select_move3->app->move3_hex_code = move_table[model->current_move].hex;
+            },
+            false);
+        view_dispatcher_switch_to_view(select_move3->app->view_dispatcher, AppViewSelectMove4);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_move3->app->view_dispatcher, AppViewSelectMove2);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 0) {
+                    model->current_move = 165;
+                } else {
+                    model->current_move--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move >= 10) {
+                    model->current_move -= 10;
+                } else {
+                    model->current_move = 165;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 165) {
+                    model->current_move = 0;
+                } else {
+                    model->current_move++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move <= 155) {
+                    model->current_move += 10;
+                } else {
+                    model->current_move = 0;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_move3_enter_callback(void* context) {
+    furi_assert(context);
+    SelectMove3* select_move3 = (SelectMove3*)context;
+    with_view_model_cpp(
+        select_move3->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_move3->app->current_pokemon;
+            model->pokemon_hex_code = select_move3->app->pokemon_hex_code;
+            model->current_level = select_move3->app->current_level;
+            model->current_stats = select_move3->app->current_stats;
+            model->move1_hex_code = select_move3->app->move1_hex_code;
+            model->move2_hex_code = select_move3->app->move2_hex_code;
+            model->move3_hex_code = select_move3->app->move3_hex_code;
+        },
+        true);
+}
+
+bool select_move3_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectMove3* select_move3 = (SelectMove3*)context;
+    view_dispatcher_send_custom_event(select_move3->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_move3_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectMove3* select_move3_alloc(App* app) {
+    SelectMove3* select_move3 = (SelectMove3*)malloc(sizeof(SelectMove3));
+    select_move3->app = app;
+    select_move3->view = view_alloc();
+    view_set_context(select_move3->view, select_move3);
+    view_allocate_model(select_move3->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_move3->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_move = app->current_move;
+            model->move3_hex_code = app->move3_hex_code;
+        },
+        true);
+
+    view_set_draw_callback(select_move3->view, select_move3_render_callback);
+    view_set_input_callback(select_move3->view, select_move3_input_callback);
+    view_set_enter_callback(select_move3->view, select_move3_enter_callback);
+    view_set_custom_callback(select_move3->view, select_move3_custom_callback);
+
+    view_set_exit_callback(select_move3->view, select_move3_exit_callback);
+    return select_move3;
+}
+
+void select_move3_free(App* app) {
+    furi_assert(app->select_move3);
+    view_free(app->select_move3->view);
+    free(app->select_move3);
+}
+
+View* select_move3_get_view(App* app) {
+    furi_assert(app->select_move3);
+    return app->select_move3->view;
+}

+ 25 - 0
views/select_move3.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_MOVE3_HPP
+#define SELECCT_MOVE3_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectMove3;
+
+SelectMove3* select_move3_alloc(App* app);
+
+void select_move3_free(App* app);
+
+View* select_move3_get_view(App* app);
+
+#endif /* SELECCT_MOVE3_HPP */

+ 174 - 0
views/select_move4.cpp

@@ -0,0 +1,174 @@
+#include "../pokemon_app.h"
+#include "select_move4.hpp"
+
+static void select_move4_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_move;
+    char move_num[5];
+
+    snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #4");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_move4_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectMove4* select_move4 = (SelectMove4*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_move4->app->current_move = model->current_move;
+                select_move4->app->move4_hex_code = move_table[model->current_move].hex;
+            },
+            false);
+        view_dispatcher_switch_to_view(select_move4->app->view_dispatcher, AppViewTrade);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_move4->app->view_dispatcher, AppViewSelectMove3);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 0) {
+                    model->current_move = 165;
+                } else {
+                    model->current_move--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move >= 10) {
+                    model->current_move -= 10;
+                } else {
+                    model->current_move = 165;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 165) {
+                    model->current_move = 0;
+                } else {
+                    model->current_move++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move <= 155) {
+                    model->current_move += 10;
+                } else {
+                    model->current_move = 0;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_move4_enter_callback(void* context) {
+    furi_assert(context);
+    SelectMove4* select_move4 = (SelectMove4*)context;
+    with_view_model_cpp(
+        select_move4->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_move4->app->current_pokemon;
+            model->pokemon_hex_code = select_move4->app->pokemon_hex_code;
+            model->current_level = select_move4->app->current_level;
+            model->current_stats = select_move4->app->current_stats;
+            model->move1_hex_code = select_move4->app->move1_hex_code;
+            model->move2_hex_code = select_move4->app->move2_hex_code;
+            model->move3_hex_code = select_move4->app->move3_hex_code;
+        },
+        true);
+}
+
+bool select_move4_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectMove4* select_move4 = (SelectMove4*)context;
+    view_dispatcher_send_custom_event(select_move4->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_move4_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectMove4* select_move4_alloc(App* app) {
+    SelectMove4* select_move4 = (SelectMove4*)malloc(sizeof(SelectMove4));
+    select_move4->app = app;
+    select_move4->view = view_alloc();
+    view_set_context(select_move4->view, select_move4);
+    view_allocate_model(select_move4->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_move4->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_move = app->current_move;
+            model->move4_hex_code = app->move4_hex_code;
+        },
+        true);
+
+    view_set_draw_callback(select_move4->view, select_move4_render_callback);
+    view_set_input_callback(select_move4->view, select_move4_input_callback);
+    view_set_enter_callback(select_move4->view, select_move4_enter_callback);
+    view_set_custom_callback(select_move4->view, select_move4_custom_callback);
+
+    view_set_exit_callback(select_move4->view, select_move4_exit_callback);
+    return select_move4;
+}
+
+void select_move4_free(App* app) {
+    furi_assert(app->select_move4);
+    view_free(app->select_move4->view);
+    free(app->select_move4);
+}
+
+View* select_move4_get_view(App* app) {
+    furi_assert(app->select_move4);
+    return app->select_move4->view;
+}

+ 25 - 0
views/select_move4.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_MOVE4_HPP
+#define SELECCT_MOVE4_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectMove4;
+
+SelectMove4* select_move4_alloc(App* app);
+
+void select_move4_free(App* app);
+
+View* select_move4_get_view(App* app);
+
+#endif /* SELECCT_MOVE4_HPP */

+ 2 - 1
views/select_pokemon.cpp

@@ -38,7 +38,8 @@ static bool select_pokemon_input_callback(InputEvent* event, void* context) {
                 select_pokemon->app->pokemon_hex_code = pokemon_table[model->current_pokemon].hex;
                 select_pokemon->app->pokemon_hex_code = pokemon_table[model->current_pokemon].hex;
             },
             },
             false);
             false);
-        view_dispatcher_switch_to_view(select_pokemon->app->view_dispatcher, AppViewTrade);
+
+        view_dispatcher_switch_to_view(select_pokemon->app->view_dispatcher, AppViewSelectLevel);
         consumed = true;
         consumed = true;
     } else if(event->type == InputTypePress && event->key == InputKeyBack) {
     } else if(event->type == InputTypePress && event->key == InputKeyBack) {
         view_dispatcher_switch_to_view(select_pokemon->app->view_dispatcher, VIEW_NONE);
         view_dispatcher_switch_to_view(select_pokemon->app->view_dispatcher, VIEW_NONE);

+ 195 - 0
views/select_stats.cpp

@@ -0,0 +1,195 @@
+#include "../pokemon_app.h"
+#include "select_stats.hpp"
+
+static void select_stats_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_stats;
+
+    canvas_set_font(canvas, FontPrimary);
+    if(current_index == 0) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Zero EV");
+    } else if(current_index == 1) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Max EV / Lvl");
+    } else if(current_index == 2) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Max EV");
+    } else if(current_index == 3) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Zero EV");
+    } else if(current_index == 4) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Max EV / Lvl");
+    } else if(current_index == 5) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Max EV");
+    }
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Stats");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_stats_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectStats* select_stats = (SelectStats*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_stats->app->current_stats = model->current_stats;
+            },
+            false);
+        
+        view_dispatcher_switch_to_view(select_stats->app->view_dispatcher, AppViewSelectMove1);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_stats->app->view_dispatcher, AppViewSelectLevel);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_stats == 0) {
+                    model->current_stats = 5;
+                } else {
+                    model->current_stats--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_stats == 0) {
+                    model->current_stats = 5;
+                } else {
+                    model->current_stats--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_stats == 5) {
+                    model->current_stats = 0;
+                } else {
+                    model->current_stats++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_stats == 5) {
+                    model->current_stats = 0;
+                } else {
+                    model->current_stats++;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_stats_enter_callback(void* context) {
+    furi_assert(context);
+    SelectStats* select_stats = (SelectStats*)context;
+    with_view_model_cpp(
+        select_stats->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_stats->app->current_pokemon;
+            model->pokemon_hex_code = select_stats->app->pokemon_hex_code;
+            model->current_level = select_stats->app->current_level;
+            model->current_stats = select_stats->app->current_stats;
+        },
+        true);
+}
+
+bool select_stats_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectStats* select_stats = (SelectStats*)context;
+    view_dispatcher_send_custom_event(select_stats->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_stats_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectStats* select_stats_alloc(App* app) {
+    SelectStats* select_stats = (SelectStats*)malloc(sizeof(SelectStats));
+    select_stats->app = app;
+    select_stats->view = view_alloc();
+    view_set_context(select_stats->view, select_stats);
+    view_allocate_model(select_stats->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_stats->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_stats = app->current_stats;
+        },
+        true);
+
+    view_set_draw_callback(select_stats->view, select_stats_render_callback);
+    view_set_input_callback(select_stats->view, select_stats_input_callback);
+    view_set_enter_callback(select_stats->view, select_stats_enter_callback);
+    view_set_custom_callback(select_stats->view, select_stats_custom_callback);
+
+    view_set_exit_callback(select_stats->view, select_stats_exit_callback);
+    return select_stats;
+}
+
+void select_stats_free(App* app) {
+    furi_assert(app->select_stats);
+    view_free(app->select_stats->view);
+    free(app->select_stats);
+}
+
+View* select_stats_get_view(App* app) {
+    furi_assert(app->select_stats);
+    return app->select_stats->view;
+}

+ 25 - 0
views/select_stats.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_STATS_HPP
+#define SELECCT_LEVEL_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectStats;
+
+SelectStats* select_stats_alloc(App* app);
+
+void select_stats_free(App* app);
+
+View* select_stats_get_view(App* app);
+
+#endif /* SELECCT_STATS_HPP */

+ 294 - 0
views/trade.cpp

@@ -34,6 +34,7 @@ int time_in_seconds = 0;
 static void trade_draw_callback(Canvas* canvas, void* context) {
 static void trade_draw_callback(Canvas* canvas, void* context) {
     canvas_clear(canvas);
     canvas_clear(canvas);
     SelectPokemonModel* model = (SelectPokemonModel*)context;
     SelectPokemonModel* model = (SelectPokemonModel*)context;
+
     if(!model->trading) {
     if(!model->trading) {
         if(!model->connected) {
         if(!model->connected) {
             furi_hal_light_set(LightGreen, 0x00);
             furi_hal_light_set(LightGreen, 0x00);
@@ -298,6 +299,126 @@ void input_clk_gameboy(void* context) {
     transferBit(context);
     transferBit(context);
     time = micros();
     time = micros();
 }
 }
+unsigned char convertCharToTagHex(char c) {
+    switch(c) {
+    case 'A':
+        return A_;
+    case 'B':
+        return B_;
+    case 'C':
+        return C_;
+    case 'D':
+        return D_;
+    case 'E':
+        return E_;
+    case 'F':
+        return F_;
+    case 'G':
+        return G_;
+    case 'H':
+        return H_;
+    case 'I':
+        return I_;
+    case 'J':
+        return J_;
+    case 'K':
+        return K_;
+    case 'L':
+        return L_;
+    case 'M':
+        return M_;
+    case 'N':
+        return N_;
+    case 'O':
+        return O_;
+    case 'P':
+        return P_;
+    case 'Q':
+        return Q_;
+    case 'R':
+        return R_;
+    case 'S':
+        return S_;
+    case 'T':
+        return T_;
+    case 'U':
+        return U_;
+    case 'V':
+        return V_;
+    case 'W':
+        return W_;
+    case 'X':
+        return X_;
+    case 'Y':
+        return Y_;
+    case 'Z':
+        return Z_;
+    case 'a':
+        return A_;
+    case 'b':
+        return B_;
+    case 'c':
+        return C_;
+    case 'd':
+        return D_;
+    case 'e':
+        return E_;
+    case 'f':
+        return F_;
+    case 'g':
+        return G_;
+    case 'h':
+        return H_;
+    case 'i':
+        return I_;
+    case 'j':
+        return J_;
+    case 'k':
+        return K_;
+    case 'l':
+        return L_;
+    case 'm':
+        return M_;
+    case 'n':
+        return N_;
+    case 'o':
+        return O_;
+    case 'p':
+        return P_;
+    case 'q':
+        return Q_;
+    case 'r':
+        return R_;
+    case 's':
+        return S_;
+    case 't':
+        return T_;
+    case 'u':
+        return U_;
+    case 'v':
+        return V_;
+    case 'w':
+        return W_;
+    case 'x':
+        return X_;
+    case 'y':
+        return Y_;
+    case 'z':
+        return Z_;
+    case ' ':
+        return SPACE_;
+    case '.':
+        return PERIOD_;
+    case '\'':
+        return S_QUOTE_;
+    case '!':
+        return MALE_;
+    case '@':
+        return FEMALE_;
+    default:
+        return 0x00;
+    }
+}
 void trade_enter_callback(void* context) {
 void trade_enter_callback(void* context) {
     furi_assert(context);
     furi_assert(context);
     Trade* trade = (Trade*)context;
     Trade* trade = (Trade*)context;
@@ -308,13 +429,186 @@ void trade_enter_callback(void* context) {
         {
         {
             model->current_pokemon = trade->app->current_pokemon;
             model->current_pokemon = trade->app->current_pokemon;
             model->pokemon_hex_code = trade->app->pokemon_hex_code;
             model->pokemon_hex_code = trade->app->pokemon_hex_code;
+            model->current_level = trade->app->current_level;
+            model->current_stats = trade->app->current_stats;
+            model->current_move = trade->app->current_move;
+            model->move1_hex_code = trade->app->move1_hex_code;
+            model->move2_hex_code = trade->app->move2_hex_code;
+            model->move3_hex_code = trade->app->move3_hex_code;
+            model->move4_hex_code = trade->app->move4_hex_code;
             model->trading = false;
             model->trading = false;
             model->connected = false;
             model->connected = false;
             model->gameboy_status = GAMEBOY_INITIAL;
             model->gameboy_status = GAMEBOY_INITIAL;
         },
         },
         true);
         true);
 
 
+    FURI_LOG_D(TAG, "[Trade] Current Pokemon: %d", trade->app->current_pokemon);
+
+    // Set the Pokemon name
+
+    unsigned char nickname[11];
+    for(size_t i = 0; i < 11; ++i) {
+        nickname[i] = 0x50;
+    }
+    for(size_t i = 0; i < strlen(pokemon_table[trade->app->current_pokemon].name); ++i) {
+        nickname[i] = convertCharToTagHex(pokemon_table[trade->app->current_pokemon].name[i]);
+    }
+
+    memcpy(DATA_BLOCK2.nickname[0].str, nickname, sizeof(nickname));
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon Name: %s", pokemon_table[trade->app->current_pokemon].name);
+
+    // Set the Pokemon hex code
+
     DATA_BLOCK[12] = trade->app->pokemon_hex_code;
     DATA_BLOCK[12] = trade->app->pokemon_hex_code;
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon Hex Code: %x", trade->app->pokemon_hex_code);
+
+    // Set the Pokemon level
+
+    FURI_LOG_D(TAG, "[Trade] Current Level: %d", trade->app->current_level);
+
+    uint8_t level = trade->app->current_level;
+    DATA_BLOCK2.party[0].level = level & 0xFF;
+    DATA_BLOCK2.party[0].level_again = level & 0xFF;
+
+    FURI_LOG_D(TAG, "[Trade] Level Hex Code: %x", DATA_BLOCK2.party[0].level);
+
+    // Set the Pokemon experience
+
+    int32_t exp = 0;
+    if(pokemon_table[trade->app->current_pokemon].xp_group == 0) {
+        exp = 1.25 * level * level * level;
+    } else if(pokemon_table[trade->app->current_pokemon].xp_group == 1) {
+        exp = (1.2 * level * level * level) - (15 * level * level) + (100 * level) - 140;
+    } else if(pokemon_table[trade->app->current_pokemon].xp_group == 2) {
+        exp = level * level * level;
+    } else if(pokemon_table[trade->app->current_pokemon].xp_group == 3) {
+        exp = 0.8 * level * level * level;
+    }
+
+    DATA_BLOCK2.party[0].exp[0] = (exp >> 16) & 0xFF;
+    DATA_BLOCK2.party[0].exp[1] = (exp >> 8) & 0xFF;
+    DATA_BLOCK2.party[0].exp[2] = exp & 0xFF;
+
+    FURI_LOG_D(TAG, "[Trade] XP 1: %x", DATA_BLOCK2.party[0].exp[0]);
+    FURI_LOG_D(TAG, "[Trade] XP 2: %x", DATA_BLOCK2.party[0].exp[1]);
+    FURI_LOG_D(TAG, "[Trade] XP 3: %x", DATA_BLOCK2.party[0].exp[2]);
+
+    // Set the Pokemon stat experience
+
+    uint16_t statexp = 0x0000;
+    if(trade->app->current_stats == 1 || trade->app->current_stats == 4) {
+        statexp = (65535 / 100) * level;
+    } else if(trade->app->current_stats == 2 || trade->app->current_stats == 5) {
+        statexp = 65535;
+    }
+
+    DATA_BLOCK2.party[0].hp_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].atk_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].def_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].spd_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].special_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon Stat EXP: %d", statexp);
+    FURI_LOG_D(TAG, "[Trade] Pokemon HP EV: %x", DATA_BLOCK2.party[0].hp_ev);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Attack EV: %x", DATA_BLOCK2.party[0].atk_ev);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Defence EV: %x", DATA_BLOCK2.party[0].def_ev);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Speed EV: %x", DATA_BLOCK2.party[0].spd_ev);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Special EV: %x", DATA_BLOCK2.party[0].special_ev);
+
+    // Set the Pokemon stats
+
+    uint8_t atk_iv = 15;
+    uint8_t def_iv = 15;
+    uint8_t spd_iv = 15;
+    uint8_t special_iv = 15;
+    uint8_t hp_iv = 15;
+    if(trade->app->current_stats <= 2) {
+        atk_iv = rand() % 15;
+        def_iv = rand() % 15;
+        spd_iv = rand() % 15;
+        special_iv = rand() % 15;
+        DATA_BLOCK2.party[0].iv = ((atk_iv & 0b00001111) << 12) | ((def_iv & 0b00001111) << 8) |
+                                  ((spd_iv & 0b00001111) << 4) | ((special_iv & 0b00001111));
+        hp_iv = (DATA_BLOCK2.party[0].iv & 0xAA) >> 4;
+    }
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon IV: %x", DATA_BLOCK2.party[0].iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon HP IV: %x", hp_iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Attack IV: %x", atk_iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Defence IV: %x", def_iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Speed IV: %x", spd_iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Special IV: %x", special_iv);
+
+    uint16_t max_hp = floor(
+                          (((2 * (pokemon_table[trade->app->current_pokemon].base_hp + hp_iv)) +
+                            floor(sqrt(statexp) / 4)) *
+                           level) /
+                          100) +
+                      (level + 10);
+    DATA_BLOCK2.party[0].max_hp = ((max_hp >> 8) & 0x00FF) | ((max_hp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].hp = ((max_hp >> 8) & 0x00FF) | ((max_hp << 8) & 0xFF00);
+    uint16_t attack = floor(
+                          (((2 * (pokemon_table[trade->app->current_pokemon].base_atk + atk_iv)) +
+                            floor(sqrt(statexp) / 4)) *
+                           level) /
+                          100) +
+                      5;
+    DATA_BLOCK2.party[0].atk = ((attack >> 8) & 0x00FF) | ((attack << 8) & 0xFF00);
+    uint16_t defence = floor(
+                           (((2 * (pokemon_table[trade->app->current_pokemon].base_def + def_iv)) +
+                             floor(sqrt(statexp) / 4)) *
+                            level) /
+                           100) +
+                       5;
+    DATA_BLOCK2.party[0].def = ((defence >> 8) & 0x00FF) | ((defence << 8) & 0xFF00);
+    uint16_t speed = floor(
+                         (((2 * (pokemon_table[trade->app->current_pokemon].base_spd + spd_iv)) +
+                           floor(sqrt(statexp) / 4)) *
+                          level) /
+                         100) +
+                     5;
+    DATA_BLOCK2.party[0].spd = ((speed >> 8) & 0x00FF) | ((speed << 8) & 0xFF00);
+    uint16_t special =
+        floor(
+            (((2 * (pokemon_table[trade->app->current_pokemon].base_special + special_iv)) +
+              floor(sqrt(statexp) / 4)) *
+             level) /
+            100) +
+        5;
+    DATA_BLOCK2.party[0].special = ((special >> 8) & 0x00FF) | ((special << 8) & 0xFF00);
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon Max HP: %x", DATA_BLOCK2.party[0].max_hp);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Attack: %x", DATA_BLOCK2.party[0].atk);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Defence: %x", DATA_BLOCK2.party[0].def);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Speed: %x", DATA_BLOCK2.party[0].spd);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Special: %x", DATA_BLOCK2.party[0].special);
+
+    // Set the Pokemon types
+
+    DATA_BLOCK2.party[0].type[0] = pokemon_table[trade->app->current_pokemon].type1;
+    if(pokemon_table[trade->app->current_pokemon].type2 == 0xFF) {
+        DATA_BLOCK2.party[0].type[1] = pokemon_table[trade->app->current_pokemon].type1;
+    } else {
+        DATA_BLOCK2.party[0].type[1] = pokemon_table[trade->app->current_pokemon].type2;
+    }
+
+    FURI_LOG_D(TAG, "[Trade] Type 1: %x", DATA_BLOCK2.party[0].type[0]);
+    FURI_LOG_D(TAG, "[Trade] Type 2: %x", DATA_BLOCK2.party[0].type[1]);
+
+    // Set the Pokemon moves
+
+    DATA_BLOCK2.party[0].move[0] = trade->app->move1_hex_code;
+    DATA_BLOCK2.party[0].move[1] = trade->app->move2_hex_code;
+    DATA_BLOCK2.party[0].move[2] = trade->app->move3_hex_code;
+    DATA_BLOCK2.party[0].move[3] = trade->app->move4_hex_code;
+
+    FURI_LOG_D(TAG, "[Trade] Move 1 Hex Code: %x", trade->app->move1_hex_code);
+    FURI_LOG_D(TAG, "[Trade] Move 2 Hex Code: %x", trade->app->move2_hex_code);
+    FURI_LOG_D(TAG, "[Trade] Move 3 Hex Code: %x", trade->app->move3_hex_code);
+    FURI_LOG_D(TAG, "[Trade] Move 4 Hex Code: %x", trade->app->move4_hex_code);
+
     // B3 (Pin6) / SO (2)
     // B3 (Pin6) / SO (2)
     furi_hal_gpio_write(&GAME_BOY_SO, false);
     furi_hal_gpio_write(&GAME_BOY_SO, false);
     furi_hal_gpio_init(&GAME_BOY_SO, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
     furi_hal_gpio_init(&GAME_BOY_SO, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);

Some files were not shown because too many files changed in this diff