diff --git a/py/README.md b/py/README.md new file mode 100644 index 0000000..2ff91f4 --- /dev/null +++ b/py/README.md @@ -0,0 +1,60 @@ +# Game Jam Kit +A simple framework for making small games with [raylib](https://www.raylib.com/), [box2d](https://box2d.org/), and [LDtk](https://ldtk.io/). + +Python version of the [C++ Game Jam Kit](https://github.com/davabase/game_jam_kit). + +## Introduction +The framework in setup as a series of classes that manage the lifecycle of each other. + +`Game` manages `Manager`s and `Scene`s. + +A `Manager` holds resources that are used across scenes. The resources are loaded at `Game::init()`. + +`Scene` manages `Service`s and `GameObject`s. + +`Scene`s also perform game logic for each level. + +A `Service` holds resources that are used in a single scene. The resources are loaded during init and disposed when the scene is disposed. + +`GameObject` manages `Component`s + +`GameObject`s also perform game logic for individual game entities. + +A `Component` is a reusable tool for creating `GameObject` behavior. + +Each of these pieces has lifecycle functions for `init()`, `update()`, and `draw()` that can be overridden when creating your own subclasses. These functions are called by the containing manager. If you do not wish for your class to be managed you shouldn't inherit from these base classes. + +The managers also have larger overridable functions, `init_*()`, `update_*()`, and `draw_*()` that give you increased control over how the manager is used. + +See `engine/prefabs` for prebuilt managers, services, game objects, and components. + +See `samples` for examples on how to build a `Scene`. + +See `main.py` for how to build a `Game`. + +## Running +Create a python 3 venv: +``` +python -m venv venv +``` + +Initialize it: + +on Windows: +``` +venv\Scripts\activate +``` +on the other ones: +``` +source venv/bin/activate +``` + +Install requirements: +``` +pip install -r requirements.txt +``` + +Run the main file: +``` +python main.py +``` diff --git a/py/assets/fonts/Roboto.ttf b/py/assets/fonts/Roboto.ttf new file mode 100644 index 0000000..7e3bb2f Binary files /dev/null and b/py/assets/fonts/Roboto.ttf differ diff --git a/py/assets/fonts/RobotoMono.ttf b/py/assets/fonts/RobotoMono.ttf new file mode 100644 index 0000000..3806bfb Binary files /dev/null and b/py/assets/fonts/RobotoMono.ttf differ diff --git a/py/assets/fonts/Tiny5.ttf b/py/assets/fonts/Tiny5.ttf new file mode 100644 index 0000000..635fe07 Binary files /dev/null and b/py/assets/fonts/Tiny5.ttf differ diff --git a/py/assets/gamecontrollerdb.txt b/py/assets/gamecontrollerdb.txt new file mode 100644 index 0000000..394156d --- /dev/null +++ b/py/assets/gamecontrollerdb.txt @@ -0,0 +1,2212 @@ +# Game Controller DB for SDL in 2.0.16 format +# Source: https://github.com/mdqinc/SDL_GameControllerDB + +# Windows +03000000300f00000a01000000000000,3 In 1 Conversion Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, +03000000fa190000918d000000000000,3 In 1 Conversion Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, +03000000fa2d00000100000000000000,3dRudder Foot Motion Controller,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, +03000000d0160000040d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000050d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000060d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000070d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000600a000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000c82d00001930000000000000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,platform:Windows, +03000000c82d00000031000000000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000531000000000000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000951000000000000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, +03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006a28000000000000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Windows, +03000000c82d00001251000000000000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000150000000000000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00002090000000000000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, +03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows, +03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000290000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, +03000000c82d00003038000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, +03000000c82d00006928000000000000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,platform:Windows, +03000000c82d00002590000000000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000003512000012ab000000000000,8BitDo NES30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Windows, +03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000851000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000361000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000660000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000960000000000000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000131000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000231000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000331000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000431000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00002867000000000000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b10,x:b3,y:b4,platform:Windows, +03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000102800000900000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003028000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +030000003512000020ab000000000000,8BitDo SN30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a2,rightshoulder:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001230000000000000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001260000000000000,8BitDo Ultimate 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001b30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001c30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001d30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001530000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001630000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001730000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000121000000000000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +030000008f0e00001200000000000000,Acme GA02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows, +030000006f0e00008801000000000000,Afterglow Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001301000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001302000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001304000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001413000000000000,Afterglow Xbox Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00003901000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ab1200000103000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000000f9000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000100000008200000000000000,Akishop Customs PS360,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000007c1800000006000000000000,Alienware Dual Compatible PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000491900001904000000000000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000710100001904000000000000,Amazon Luna Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b8,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b4,rightstick:b7,rightx:a3,righty:a4,start:b6,x:b3,y:b2,platform:Windows, +0300000008100000e501000000000000,Anbernic Game Pad,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000020500000913000000000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000373500000710000000000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000373500004610000000000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000190e00000110000000000000,Aquaplus Piece,a:b1,b:b0,back:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b2,platform:Windows, +03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows, +03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000490b00004406000000000000,ASCII Seamic Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000050b00000679000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,start:b3,platform:Windows, +03000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +03000000380800001889000000000000,AtGames Legends Gamer Pro,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b14,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000008a3500000102000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows, +030000008a3500000201000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows, +030000008a3500000302000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows, +030000008a3500000402000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows, +03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d6200000e557000000000000,Batarang PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, +030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000001f9000000000000,BB 070,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows, +030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000000055000000000000,Betop BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000790000000700000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000808300000300000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006321000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00006401000000000000,BF One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000300f00000202000000000000,Bigben,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a5,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +030000006b1400000209000000000000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, +030000005a1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +030000005b1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +030000005b1c00002500000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +030000006d04000042c2000000000000,ChillStream,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000b0400003365000000000000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +030000004c050000c505000000000000,CronusMax Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d814000007cd000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d8140000cefa000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows, +030000003807000002cb000000000000,Cyborg,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000a306000022f6000000000000,Cyborg V.3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000f806000000a3000000000000,DA Leader,a:b7,b:b6,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b8,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:b3,rightx:a2,righty:a3,start:b12,x:b4,y:b5,platform:Windows, +030000001a1c00000001000000000000,Datel Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000791d00000103000000000000,Dual Box Wii,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f040000070f000000000000,Dual Power,a:b8,b:b9,back:b4,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,leftshoulder:b13,leftstick:b6,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b12,rightstick:b7,righttrigger:b15,start:b5,x:b10,y:b11,platform:Windows, +030000004f04000012b3000000000000,Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000020b3000000000000,Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000bd12000002e0000000000000,Dual Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000ff1100003133000000000000,DualForce,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b1,platform:Windows, +030000006f0e00003001000000000000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fc0400000250000000000000,Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000bc2000000091000000000000,EasySMX Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006e0500000a20000000000000,Elecom DUX60 MMO,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows, +03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000095090000010000000000000000,Elecom JC-U609,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows, +0300004112000000e500000000000000,Elecom JC-U909Z,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows, +03000041120000001050000000000000,Elecom JC-U911,a:b1,b:b2,back:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b0,x:b4,y:b5,platform:Windows, +030000006e0500000520000000000000,Elecom P301U PlayStation Controller Adapter,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +03000000250900000218000000000000,Elecom PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000411200004450000000000000,Elecom U1012,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000320000000000000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000e20000000000000,Elecom U3912T,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000f20000000000000,Elecom U4013S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500001320000000000000,Elecom U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006e0500001020000000000000,Elecom U4113S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000720000000000000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +030000007d0400000640000000000000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000430b00000300000000000000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000062000001801000000000000,EMS TrioLinker Plus II,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Windows, +03000000242f000000b7000000000000,ESM 9110,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, +03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000341a00000108000000000000,EXEQ RF Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006f0e00008401000000000000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008101000000000000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008001000000000000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03005036852100000000000000000000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows, +03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows, +03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows, +03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000151900004000000000000000,Flydigi Vader 2,a:b27,b:b26,back:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b23,leftstick:b17,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b22,rightstick:b16,righttrigger:b20,rightx:a3,righty:a4,start:b18,x:b25,y:b24,platform:Windows, +03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b14,paddle1:b4,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows, +03000000b40400001224000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows, +0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000260900002625000000000000,GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows, +03000000341a000005f7000000000000,GameCube Controller,a:b2,b:b3,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b1,y:b0,platform:Windows, +03000000430b00000500000000000000,GameCube Controller,a:b0,b:b2,dpdown:b10,dpleft:b8,dpright:b9,dpup:b11,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a3,rightx:a5,righty:a2,start:b7,x:b1,y:b3,platform:Windows, +03000000790000004718000000000000,GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000790000004618000000000000,GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +030000008f0e00000d31000000000000,Gamepad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ac0500003d03000000000000,GameSir G3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500005b05000000000000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000ac0500002d02000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500004d04000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500001a06000000000000,GameSir T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000373500009410000000000000,GameSir Tegenaria Lite,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows, +030000008f0e00001411000000000000,Gamo2 Divaller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c21100000791000000000000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c9110000f055000000000000,Be1 GC100XF Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000b01000000000000,GGE909 Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c283000000000000,Gioteck PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f025000031c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c383000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c483000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d11800000094000000000000,Google Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +030000004f04000026b3000000000000,GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000079000000d418000000000000,GPD Win,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000025b000000000000,GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000007d0400000840000000000000,Gravis Destroyer Tilt,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows, +030000007d0400000540000000000000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000280400000140000000000000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a3,dpup:-a4,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00000610000000000000,GreenAsia,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a5,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000ac0500006b05000000000000,GT2a,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000008a2e0000dd10000000000000,Hand Held Legend GC Ultimate,a:b0,b:b2,back:b17,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b18,leftshoulder:b10,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b19,misc2:b24,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b1,y:b3,platform:Windows, +030000008a2e0000df10000000000000,Hand Held Legend ProGCC,a:b1,b:b0,back:b17,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b18,leftshoulder:b10,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b19,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b3,y:b2,platform:Windows, +030000000d0f00004900000000000000,Hatsune Miku Sho PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000001008000001e1000000000000,Havit HV G60,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, +030000000d0f00000c00000000000000,HEXT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d81400000862000000000000,HitBox Edition Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +03000000632500002605000000000000,HJD X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00000a00000000000000,Hori DOA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008500000000000000,Hori Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002500000000000000,Hori Fighting Commander 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000000d0f00008400000000000000,Hori Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006201000000000000,Hori Fighting Commander Octa,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006401000000000000,Hori Fighting Commander Octa,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00005100000000000000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008800000000000000,Hori Fighting Stick mini 4 PS3,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +030000000d0f00008700000000000000,Hori Fighting Stick mini 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000000d0f00001000000000000000,Hori Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003200000000000000,Hori Fightstick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00000d00000000000000,Hori Fightstick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00003701000000000000,Hori Fightstick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows, +030000000d0f00004000000000000000,Hori Fightstick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002100000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows, +030000000d0f0000a500000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000000d0f0000a600000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003801000000000000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Windows, +030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002301000000000000,Hori PS4 Controller Light,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00001100000000000000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002600000000000000,Hori Real Arcade Pro 3P,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004b00000000000000,Hori Real Arcade Pro 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006f00000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00007000000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003d00000000000000,Hori Real Arcade Pro N3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b4,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b6,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000ae00000000000000,Hori Real Arcade Pro N4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008c00000000000000,Hori Real Arcade Pro P4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000aa00000000000000,Hori Real Arcade Pro S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000d800000000000000,Hori Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00002200000000000000,Hori Real Arcade Pro V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005b00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005c00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000af00000000000000,Hori Real Arcade Pro VHS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001b00000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006e00000000000000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c100000000000000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000f600000000000000,Horipad Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000000d0f00000202000000000000,Horipad O Nintendo Switch 2 Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,misc2:b14,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00009601000000000000,Horipad Steam,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc2:b2,paddle1:b5,paddle2:b15,paddle3:b18,paddle4:b19,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000242e00000b20000000000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Windows, +03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows, +03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows, +03000000242e00006a48000000000000,Hyperkin RetroN Sq,a:b3,b:b7,back:b5,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b0,rightshoulder:b1,start:b4,x:b2,y:b6,platform:Windows, +03000000242f00000a20000000000000,Hyperkin Scout,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000242e00000a20000000000000,Hyperkin Scout Premium SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000242e00006a38000000000000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Windows, +03000000f00300008d04000000000000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:-a2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:+a5,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows, +03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00001000000000000000,iBuffalo BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows, +03000000696400006964000000000000,iDroidCon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000511d00000230000000000000,iGUGU Gamecore,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b1,leftstick:b4,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b2,platform:Windows, +03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +030000006f0e00002401000000000000,Injustice Fightstick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000ef0500000300000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500000230000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500000030000000000000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000fd0500003902000000000000,InterAct Hammerhead,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,rightshoulder:b7,rightstick:b5,righttrigger:b9,start:b10,x:b0,y:b1,platform:Windows, +03000000fd0500002a26000000000000,InterAct Hammerhead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500002f26000000000000,InterAct Hammerhead FX,a:b4,b:b5,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b1,y:b2,platform:Windows, +03000000fd0500005302000000000000,InterAct ProPad,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000ac0500002c02000000000000,Ipega Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000204000000000000,Ipega PG9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000304000000000000,Ipega PG9087,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, +030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows, +030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000250900000017000000000000,Joypad Adapter,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, +03000000bd12000003c0000000000000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ff1100004033000000000000,JPD FFB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a2,start:b15,x:b3,y:b0,platform:Windows, +03000000242f00002d00000000000000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00008a00000000000000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +03000000c4100000c082000000000000,KADE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000828200000180000000000000,Keio,a:b4,b:b5,back:b8,leftshoulder:b2,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b1,platform:Windows, +03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000bd12000001e0000000000000,Leadership,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00000103000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00000104000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008f0e00001300000000000000,Logic3,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows, +030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001dc2000000000000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001ec2000000000000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d04000019c2000000000000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d0400001ac2000000000000,Logitech Precision,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000009c2000000000000,Logitech WingMan,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000006d0400000bc2000000000000,Logitech WingMan Action Pad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:a5~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:a2~,start:b8,x:b3,y:b4,platform:Windows, +030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, +03000000380700005645000000000000,Lynx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000222200006000000000000000,Macally,a:b1,b:b2,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700003888000000000000,Mad Catz Arcade Fightstick TE S Plus PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008532000000000000,Mad Catz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006352000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006652000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005032000000000000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005082000000000000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000380700008031000000000000,Mad Catz FightStick Alpha PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000003807000038b7000000000000,Mad Catz Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700008433000000000000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008483000000000000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000380700008134000000000000,Mad Catz Fightstick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000380700006252000000000000,Mad Catz Micro CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008232000000000000,Mad Catz PlayStation Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008731000000000000,Mad Catz PlayStation Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000003807000056a8000000000000,Mad Catz PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700001888000000000000,Mad Catz SFIV Fightstick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000380700001847000000000000,Mad Catz Street Fighter 4 Xbox 360 FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, +030000008f0e00001330000000000000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000242f0000f500000000000000,Mayflash N64 Adapter,a:b2,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows, +03000000242f0000f400000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows, +03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows, +030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000002418000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, +0300000079000000ae18000000000000,Mega Drive Controller,a:b0,b:b1,back:b7,dpdown:b14,dpleft:b15,dpright:b13,dpup:b2,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000c0160000990a000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,righttrigger:b2,start:b3,platform:Windows, +030000005e0400002800000000000000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Windows, +030000005e0400000300000000000000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000005e0400000700000000000000,Microsoft SideWinder,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +030000005e0400000e00000000000000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows, +030000005e0400002700000000000000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Windows, +03000000280d00000202000000000000,Miller Lite Cantroller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b5,x:b2,y:b3,platform:Windows, +03000000ad1b000023f0000000000000,MLG,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a6,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000ad1b00003ef0000000000000,MLG Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700006382000000000000,MLG PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004523000015e0000000000000,Mobapad Chitu HD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000491900000904000000000000,Mobapad Chitu HD,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ffff00000000000000000000,Mocute M053,a:b3,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b11,leftstick:b7,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b6,righttrigger:b4,rightx:a3,righty:a4,start:b8,x:b1,y:b0,platform:Windows, +03000000d6200000e589000000000000,Moga 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000007162000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000d6200000ad0d000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400002a89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000091200004488000000000000,MUSIA PlayStation 2 Input Display,a:b0,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:b11,rightx:a2,righty:a3,start:b5,x:b1,y:b3,platform:Windows, +03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows, +030000006b140000010c000000000000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +0300000085320000170d000000000000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +0300000085320000190d000000000000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000006b140000080d000000000000,Nacon Revolution Unlimited Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000bd12000001c0000000000000,Nebular,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000eb0300000000000000000000,NeGcon Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows, +0300000038070000efbe000000000000,NEO SE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000092120000474e000000000000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Windows, +03000000921200004b46000000000000,NES 2 port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, +03000000000f00000100000000000000,NES Controller,a:b1,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, +03000000921200004346000000000000,NES Controller,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, +03000000790000004518000000000000,NEXILUX GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows, +03000000050b00000045000000000000,Nexus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Windows, +03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000ec110000e1a7000000000000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000007e0500006920000000000000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Windows, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows, +030000007e0500007320000000000000,NSO GameCube Controller,a:b1,b:b3,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b13,lefttrigger:b12,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b4,rightx:a2,righty:a3~,start:b6,x:b0,y:b2,platform:Windows, +030000007e0500001920000000000000,NSO N64 Controller,+rightx:b8,+righty:b2,-rightx:b3,-righty:b7,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Windows, +030000007e0500001720000000000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Windows, +03000000550900001472000000000000,NVIDIA Controller,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows, +03000000550900001072000000000000,NVIDIA Shield,a:b9,b:b8,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b3,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b2,righttrigger:a4,rightx:a2,righty:a5,start:b0,x:b7,y:b6,platform:Windows, +030000005509000000b4000000000000,NVIDIA Virtual,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c00000288000000000000,Nyko Air Flo Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000004b120000014d000000000000,NYKO Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000d62000001d57000000000000,Nyko Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000791d00000900000000000000,Nyko Playpad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000782300000a10000000000000,Onlive Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows, +030000000d0f00000401000000000000,Onyx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008916000001fd000000000000,Onza CE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a3,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008916000000fd000000000000,Onza TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +0300000009120000072f000000000000,OrangeFox86 DreamPicoPort,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:-a2,leftx:a0,lefty:a1,righttrigger:-a5,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000362800000100000000000000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows, +03000000120c0000f60e000000000000,P4 Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00008501000000000000,PDP Fightpad Pro GameCube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006f0e00000901000000000000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008901000000000000,PDP Realmz Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows, +03000000d620000011a7000000000000,PowerA Core Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000dd62000015a7000000000000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d620000012a7000000000000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000dd62000016a7000000000000,PowerA Fusion Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d620000013a7000000000000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000003340000000000000,PowerA OPS Pro Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000d62000002640000000000000,PowerA OPS Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d620000014a7000000000000,PowerA Spectra Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000110e000000000000,Pro5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000151a00006222000000000000,PS2 Dual Plus Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f90e000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000250900000118000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, +030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows, +030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, +03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, +030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows, +03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c0500005f0e000000000000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000f20d000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows, +03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000011000000000000,Qanba Arcade Stick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows, +03000000300f00001611000000000000,Qanba Arcade Stick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +03000000222c00000025000000000000,Qanba Dragon Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000222c00000020000000000000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001211000000000000,Qanba Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, +03000000222c00000223000000000000,Qanba Obsidian Arcade Stick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows, +03000000086700006626000000000000,RadioShack,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000ff1100004733000000000000,Ramox FPS Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, +030000009b2800002300000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, +030000009b2800006900000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, +030000009b2800000800000000000000,Raphnet Dreamcast Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows, +030000009b280000d000000000000000,Raphnet Dreamcast Adapter,a:b1,b:b0,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,lefttrigger:+a5,leftx:a0,lefty:a1,righttrigger:+a2,start:b3,x:b5,y:b4,platform:Windows, +030000009b2800006200000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800003200000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800006000000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800001800000000000000,Raphnet Jaguar Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows, +030000009b2800003c00000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows, +030000009b2800006100000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows, +030000009b2800006300000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows, +030000009b2800006400000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows, +030000009b2800000200000000000000,Raphnet NES Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows, +030000009b2800004400000000000000,Raphnet PS1 and PS2 Adapter,a:b1,b:b2,back:b5,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b9,rightx:a3,righty:a4,start:b4,x:b0,y:b3,platform:Windows, +030000009b2800004300000000000000,Raphnet Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000009b2800000500000000000000,Raphnet Saturn Adapter 2.0,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +030000009b2800000300000000000000,Raphnet SNES Adapter,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000009b2800002600000000000000,Raphnet SNES Adapter,a:b1,b:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800002e00000000000000,Raphnet SNES Adapter,a:b1,b:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800002f00000000000000,Raphnet SNES Adapter,a:b1,b:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800005600000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800005700000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800001e00000000000000,Raphnet Vectrex Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows, +030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800008000000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +03000000790000008f18000000000000,Rapoo Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +0300000032150000a602000000000000,Razer Huntsman V3 Pro,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b12,dpright:b13,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000f8270000bf0b000000000000,Razer Kishi,a:b6,b:b7,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b12,leftstick:b19,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b13,rightstick:b20,righttrigger:b15,rightx:a3,righty:a4,start:b17,x:b9,y:b10,platform:Windows, +03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000710000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000a10000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows, +03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000632500007805000000000000,Retro Fighters Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +0300000003040000c197000000000000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000bd12000013d0000000000000,Retrolink Sega Saturn Classic Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows, +03000000bd12000015d0000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Windows, +0300000000f000000300000000000000,RetroUSB RetroPad,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +0300000000f00000f100000000000000,RetroUSB Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +03000000830500000960000000000000,Revenger,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b5,platform:Windows, +030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000020d000000000000,Revolution Pro Controller 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00008701000000000000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000830500007030000000000000,Rockfire Space Ranger,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b9,righttrigger:b8,start:b2,x:b3,y:b4,platform:Windows, +03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b0000181a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b00001a1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b00001c1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +030000004f04000001d0000000000000,Rumble Force,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000000d0f0000ad00000000000000,RX Gamepad,a:b0,b:b4,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b6,start:b9,x:b2,y:b1,platform:Windows, +030000008916000000fe000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000045d000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001311000000000000,Saffun Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows, +03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000023f6000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001201000000000000,Saitek Dual Analog,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000a30600000cff000000000000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b0,y:b1,platform:Windows, +03000000a30600000d5f000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600000dff000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000018f5000000000000,Saitek P3200,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001001000000000000,Saitek P480 Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000901000000000000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b5,rightx:a3,righty:a2,x:b0,y:b1,platform:Windows, +03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a30600002106000000000000,Saitek PS1000 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000020f6000000000000,Saitek PS2700 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001101000000000000,Saitek Rumble,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000e804000000a0000000000000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c01100000252000000000000,Sanwa Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000c01100004350000000000000,Sanwa Micro Grip P3,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,x:b3,y:b2,platform:Windows, +03000000411200004550000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a1,righty:a2,start:b9,x:b1,y:b3,platform:Windows, +03000000c01100004150000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000c01100004450000000000000,Sanwa Online Grip,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b14,x:b3,y:b4,platform:Windows, +03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, +030000009d0d00001130000000000000,Sanwa PlayStation Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows, +03000000c01100000051000000000000,Satechi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000004f04000028b3000000000000,Score A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows, +03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000d804000086e6000000000000,Sega Multi Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a2,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +0300000000050000289b000000000000,Sega Saturn Adapter,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows, +03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows, +03000000632500002705000000000000,ShanWan Q36,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,platform:Windows, +03000000f82100001900000000000000,Shogun Bros Chameleon X1,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000120c00001c1e000000000000,SnakeByte 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000140300000918000000000000,SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows, +03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000008b2800000300000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000921200004653000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000008f0e00000910000000000000,Sony DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000317300000100000000000000,Sony DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000666600006706000000000000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, +03000000e30500009605000000000000,Sony PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000fe1400002a23000000000000,Sony PlayStation Adapter,a:b0,b:b1,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,x:b2,y:b3,platform:Windows, +030000004c050000da0c000000000000,Sony PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000632500002306000000000000,Sony PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000f0250000c183000000000000,Sony PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d9040000160f000000000000,Sony PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000ff000000cb01000000000000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +030000004c0500003713000000000000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000341a00000208000000000000,Speedlink 6555,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000908000000000000,Speedlink 6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000380700001722000000000000,Speedlink Competition Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,x:b2,y:b3,platform:Windows, +030000008f0e00000800000000000000,Speedlink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows, +03000000380700003847000000000000,Street Fighter Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, +030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000341200001300000000000000,Super Racer,a:b2,b:b3,back:b8,leftshoulder:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b7,x:b0,y:b1,platform:Windows, +03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows, +030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000e40a00000307000000000000,Taito Egret II Mini Control Panel,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Windows, +03000000e40a00000207000000000000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Windows, +03000000d814000001a0000000000000,TE Kitty,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows, +03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, +03000000790000001c18000000000000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000790000002601000000000000,TGZ Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000591c00002400000000000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000591c00002600000000000000,THEGamepad,a:b2,b:b1,back:b6,leftx:a0,lefty:a1,start:b7,x:b3,y:b0,platform:Windows, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000023b3000000000000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ed0000000000000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000008d0000000000000,Thrustmaster Ferrari 150 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows, +030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000003d0000000000000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000009d0000000000000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000666600000288000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000666600000488000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000004f04000007d0000000000000,TMini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000571d00002100000000000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Windows, +03000000571d00002000000000000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c01100000055000000000000,Tronsmart,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows, +03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, +03000000d90400000200000000000000,TwinShock PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000000b0400003065000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00006e00000000000000,USB Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows, +03000000300f00000701000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000341a00002308000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000666600000188000000000000,USB Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000006b1400000203000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000790000000a00000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000b404000081c6000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001503000000000000,USB Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000bd12000012d0000000000000,USB Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000ff1100004133000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000632500002305000000000000,USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000882800000305000000000000,V5 Game Pad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,x:b2,y:b3,platform:Windows, +03000000790000001a18000000000000,Venom PS4 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000001b18000000000000,Venom PS4 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows, +03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000007e0500003003000000000000,Wii U Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +0300000032150000030a000000000000,Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000032150000140a000000000000,Wolverine,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000002e160000efbe000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, +03000000380700001647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700002045000000000000,Xbox 360 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700002644000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a5,start:b8,x:b2,y:b3,platform:Windows, +03000000380700002647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000003807000026b7000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a7,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400001907000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400009102000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000000fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000001fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000016f0000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b00008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400000053000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000fdfa000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700002847000000000000,Xbox 360 Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000a102000000000000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c00000a88000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000120c00001088000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2~,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5~,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000002a0600002000000000000000,Xbox Controller,a:b0,b:b1,back:b13,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b5,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b15,righttrigger:b7,rightx:a2,righty:a5,start:b12,x:b2,y:b3,platform:Windows, +03000000380700001645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700002645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700008645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000202000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400008502000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400008702000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400008902000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b8,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b9,righttrigger:b4,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400000c0b000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000fd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ff02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e0000a802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e0000c802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400003a54000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000130b000000000000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000450c00002043000000000000,Xeox SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000e0ff00000201000000000000,Xiaomi Black Shark (L),back:b0,dpdown:b11,dpleft:b9,dpright:b10,dpup:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,platform:Windows, +03000000172700004431000000000000,Xiaomi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000172700003350000000000000,Xiaomi XMGP01YM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000005060000000000000,Xiaomi XMGP01YM,+lefty:+a2,+righty:+a5,-lefty:-a1,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000c0160000e105000000000000,XinMo Dual Arcade,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000007d0400000340000000000000,Xterminator Digital Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:-a4,lefttrigger:+a4,leftx:a0,lefty:a1,paddle1:b7,paddle2:b6,rightshoulder:b5,rightstick:b9,righttrigger:b2,rightx:a3,righty:a5,start:b8,x:b3,y:b4,platform:Windows, +030000002c3600000100000000000000,Yawman Arrow,+rightx:h0.2,+righty:h0.4,-rightx:h0.8,-righty:h0.1,a:b4,b:b5,back:b6,dpdown:b15,dpleft:b14,dpright:b16,dpup:b13,leftshoulder:b10,leftstick:b0,lefttrigger:-a4,leftx:a0,lefty:a1,paddle1:b11,paddle2:b12,rightshoulder:b8,rightstick:b9,righttrigger:+a4,start:b3,x:b1,y:b2,platform:Windows, +03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000073500000400000000000000,Zenaim Arcade Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00000500000000000000,Zeroplus Adapter,a:b2,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, +03000000120c0000101e000000000000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, + +# Mac OS X +030000008f0e00000300000009010000,2 In 1 Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000c82d00001930000000000000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +03000000c82d00001930000000020000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +03000000c82d00001930000001000000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +03000000c82d00000031000001000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000531000000020000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00006a28000000010000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Mac OS X, +03000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001251000000020000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001151000000020000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000a30c00002400000006020000,8BitDo M30,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,guide:b9,leftshoulder:b6,lefttrigger:b5,rightshoulder:b4,righttrigger:b7,start:b8,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +03000000c82d00002590000000010000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00002690000000010000,8BitDo NEOGEO,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b10,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000190000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000660000000020000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000131000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000231000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000331000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000431000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Mac OS X, +03000000c82d00003028000000010000,8Bitdo SFC30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000102800000900000000000000,8BitDo SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001290000001000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001b30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001d30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001c30000001000000,8BitDo Ultimate 2C Wireless Controller,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X, +03000000c82d00001530000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001630000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001730000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001330000000020000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000a00500003232000009010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +0300000008100000e501000019040000,Anbernic Handheld,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000373500004610000001000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000503200000110000045010000,Atari VCS Classic,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X, +03000000503200000110000047010000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X, +03000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Mac OS X, +030000008a3500000102000000010000,Backbone One,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X, +030000008a3500000201000000010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000008a3500000202000000010000,Backbone One,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X, +030000008a3500000402000000010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000008a3500000302000000010000,Backbone One PlayStation Edition,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X, +03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d8140000cecf000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X, +030000006f0e00008401000003010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000151900004000000001000000,Flydigi Vader 2,a:b14,b:b15,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Mac OS X, +03000000b40400001124000001040000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000b40400001224000003030000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, +03000000ac0500001a06000002020000,GameSir T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000373500000411000023000000,GameSir X4A Xbox Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000102000000000000,GameStop Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000ff1100003133000007010000,GameWare PC Control Pad,a:b2,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Mac OS X, +03000000d11800000094000000010000,Google Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000007d0400000540000001010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000280400000140000000020000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00000300000007010000,GreenAsia Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X, +030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000341a00000302000014010000,Hori Fighting Stick Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008800000000010000,Hori Fighting Stick mini 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008700000000010000,Hori Fighting Stick mini 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X, +030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000aa00000072050000,Hori Real Arcade Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000000d0f00000002000017010000,Hori Split Pad Fit,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00000002000015010000,Hori Switch Split Pad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000c100000072050000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000242e0000ff0b000000010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Mac OS X, +03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X, +03000000830500006020000000000000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, +03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X, +03000000fd0500000030000010010000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Mac OS X, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000242f00002d00000007010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006d04000019c2000000000000,Logitech Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000000020000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000000000,Logitech F310,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000005030000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +0300000049190000020400001b010000,Manba One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000008f0e00001330000011010000,Mayflash Controller Adapter,a:b2,b:b4,back:b16,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b12,lefttrigger:b16,leftx:a0,lefty:a2,rightshoulder:b14,rightx:a6~,righty:a4,start:b18,x:b0,y:b6,platform:Mac OS X, +03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, +03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, +0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00001030000011010000,Mayflash Saturn Adapter,a:b0,b:b2,dpdown:b28,dpleft:b30,dpright:b26,dpup:b24,leftshoulder:b10,lefttrigger:b14,rightshoulder:b12,righttrigger:b4,start:b18,x:b6,y:b8,platform:Mac OS X, +0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, +03000000790000000318000000010000,Mayflash Wii DolphinBar,a:b8,b:b12,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b44,leftshoulder:b16,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b4,platform:Mac OS X, +03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +03000000790000000018000000010000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Mac OS X, +030000005e0400000300000006010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Mac OS X, +030000005e0400000700000006010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Mac OS X, +030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X, +030000004523000015e0000072050000,Mobapad Chitu HD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c62400002b89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000853200008906000000010000,Nacon Revolution X Unlimited,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000632500007505000000020000,NeoGeo mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X, +030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000ec110000e1a7000001010000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000007e0500006920000001010000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Mac OS X, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000007e0500000920000010020000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:Mac OS X, +050000007e05000009200000ff070000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:Mac OS X, +030000007e0500007320000001010000,NSO GameCube Controller,a:b1,b:b3,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b13,lefttrigger:b12,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b4,rightx:a2,righty:a3~,start:b6,x:b0,y:b2,platform:Mac OS X, +030000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Mac OS X, +030000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X, +030000004b120000014d000000010000,Nyko Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Mac OS X, +0300000009120000072f000000010000,OrangeFox86 DreamPicoPort,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a2,leftx:a0,lefty:a1,righttrigger:a5,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Mac OS X, +030000006f0e00000901000002010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000011a7000000020000,PowerA Core Plus Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000d620000011a7000010050000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c0500006802000072050000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +0300004b4c0500005f0e000000010000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000005e040000e002000001000000,PXN P30 Pro Mobile,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000222c00000225000000010000,Qanba Dragon Arcade Joystick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000009b2800005600000020020000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Mac OS X, +030000009b2800008000000022020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Mac OS X, +030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000321500000204000000010000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +03000000321500000010000000010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000632500008005000000010000,Redgear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000632500002305000000010000,Redragon Saturn,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000921200004547000000020000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b2,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,lefttrigger:b14,rightshoulder:b10,righttrigger:b4,start:b12,x:b6,y:b8,platform:Mac OS X, +03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000001100000005010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000830500006020000000010000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Mac OS X, +0300000003040000c197000000000000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Mac OS X, +03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Mac OS X, +030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c0500006802000002100000,Rii RK707,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b3,righttrigger:b9,rightx:a2,righty:a3,start:b1,x:b15,y:b12,platform:Mac OS X, +030000006f0e00008701000005010000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000e804000000a000001b010000,Samsung EIGP20,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b11,leftx:a1,lefty:a3,rightshoulder:b12,rightx:a4,righty:a5,start:b16,x:b7,y:b9,platform:Mac OS X, +03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X, +03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X, +03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, +03000000b40400000a01000000000000,Sega Saturn,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, +030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X, +030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +03000000666600006706000088020000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X, +030000004c050000da0c000000010000,Sony PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c0500003713000000010000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000e40a00000307000001000000,Taito Egret II Mini Control Panel,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Mac OS X, +03000000e40a00000207000001000000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Mac OS X, +03000000790000001c18000000010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000790000001c18000003100000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000591c00002400000021000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000591c00002600000021000000,THEGamepad,a:b2,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Mac OS X, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, +030000004f0400000ed0000000020000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, +03000000571d00002100000021000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Mac OS X, +03000000bd12000015d0000000010000,Tomee Retro Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000bd12000015d0000000000000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000571d00002000000021000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c0160000e105000000040000,Ultimate Atari Fight Stick,a:b2,b:b4,back:b18,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,rightshoulder:b8,righttrigger:b10,start:b16,x:b0,y:b6,platform:Mac OS X, +03000000151900005678000010010000,Uniplay U6,a:b3,b:b6,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,leftstick:b31,lefttrigger:b21,leftx:a1,lefty:a3,rightshoulder:b19,rightstick:b33,righttrigger:b23,rightx:a4,righty:a5,start:b27,x:b11,y:b13,platform:Mac OS X, +030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, +050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, +030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4~,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006f0e00000104000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000c6240000045d000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000050b000003090000,Xbox Elite Controller Series 2,a:b0,b:b1,back:b31,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b53,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000013050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000015050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000c62400003a54000000000000,Xbox One PowerA Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000007050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000022050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000220b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000220b000021050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000120c0000100e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000101e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, + +# Linux +03000000c82d00001930000011010000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux, +05000000c82d00001930000001000000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux, +03000000c82d00000031000011010000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000631000000010000,8BitDo Adapter 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, +03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006a28000000010000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Linux, +03000000c82d00001251000011010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001151000011010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000a20000000020000,8BitDo M30 Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00002090000011010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, +03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00006928000011010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux, +05000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux, +05000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +03000000022000000090000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001030000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000020000000000000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +06000000c82d00000020000006010000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00000960000011010000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Linux, +03000000c82d00000060000011010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, +030000003512000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000102800000900000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003028000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000a31000014010000,8BitDo Ultimate 2C,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00001d30000011010000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00001b30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001530000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001630000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001730000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000631000010010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00000631000014010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000121000011010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00000121000000010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00008801000011010000,Afterglow Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000013020000,Afterglow Prismatic Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001302000000010000,Afterglow Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000020060000,Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000100000008200000011010000,Akishop Customs PS360,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000007c1800000006000010010000,Alienware Dual Compatible Game PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +05000000491900000204000021000000,Amazon Fire Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000491900001904000011010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux, +05000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +0300000008100000e501000001010000,Anbernic Handheld,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a4,start:b11,x:b3,y:b4,platform:Linux, +03000000020500000913000010010000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000373500000710000010010000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000373500004610000001000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000190e00000110000010010000,Aquaplus Piece,a:b1,b:b0,back:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b2,platform:Linux, +03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000a30c00002800000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +03000000050b00000579000011010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b36,paddle1:b52,paddle2:b53,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b21,paddle1:b22,paddle2:b23,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +03000000503200000110000011010000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000044010000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000046010000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +03000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, +03000000503200000210000011010000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +05000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +05000000503200000210000045010000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +05000000503200000210000046010000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +05000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:-a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, +030000008a3500000201000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000008a3500000202000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000008a3500000302000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000008a3500000402000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000bc2000004d50000011010000,Beitong A1T2 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000bc2000000055000001000000,Betop AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000300e000011010000,Brook Audio Fighting Board PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000310e000011010000,Brook Audio Fighting Board PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000d81d00000b00000010010000,Buffalo BSGP1601,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Linux, +03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000af1e00002400000010010000,Clockwork Pi DevTerm,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b9,x:b3,y:b0,platform:Linux, +030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux, +03000000632500007a05000001020000,Cosmic Byte Ares Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000022f6000011010000,Cyborg V3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +030000005e0400008e02000002010000,Data Frog S80,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +03000000791d00000103000010010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c11100000191000011010000,EasySMX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000242f00009100000000010000,EasySMX ESM-9101,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006e0500000320000010010000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, +030000006e0500000720000010010000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, +030000007d0400000640000010010000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Linux, +03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00008401000011010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00008101000011010000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00008001000011010000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000852100000201000010010000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +05000000b40400001224000001010000,Flydigi APEX 4,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b20,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000b40400001224000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000007e0500003703000000000000,GameCube Adapter,a:b0,b:b1,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000373500000b10000019010000,GameSir Cyclone 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000ac0500007a05000011010000,GameSir G5,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000373500009710000001020000,GameSir Kaleid Flux,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000ac0500001a06000011010000,GameSir T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000373500009410000010010000,GameSir Tegenaria Lite,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f025000021c1000010010000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000f0250000c283000010010000,Gioteck VX2 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +190000004b4800000010000000010000,GO-Advance Controller,a:b1,b:b0,back:b10,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,leftshoulder:b4,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b13,start:b15,x:b2,y:b3,platform:Linux, +190000004b4800000010000001010000,GO-Advance Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b13,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b16,righttrigger:b15,start:b17,x:b2,y:b3,platform:Linux, +190000004b4800000011000000010000,GO-Super Gamepad,a:b0,b:b1,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b3,y:b2,platform:Linux, +03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d11800000094000011010000,Google Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000d11800000094000000010000,Google Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000001010000,GPD Win Max 2 6800U Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000280400000140000000010000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux, +030000008f0e00001200000010010000,GreenAsia Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000008a2e0000dd10000011010000,Hand Held Legend GC Ultimate,a:b0,b:b2,back:b17,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b18,leftshoulder:b10,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b19,misc2:b24,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b1,y:b3,platform:Linux, +030000008a2e0000df10000011010000,Hand Held Legend ProGCC,a:b1,b:b0,back:b17,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b18,leftshoulder:b10,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b19,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b3,y:b2,platform:Linux, +06000000adde0000efbe000002010000,Hidromancer Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d81400000862000011010000,HitBox PS3 PC Analog Mode,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, +03000000c9110000f055000011010000,HJC Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00006d00000020010000,Hori EDGE 301,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:+a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00008400000011010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000000d0f00005001000009040000,Hori Fighting Commander Octa Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00003701000013010000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b3,y:b2,platform:Linux, +030000000d0f00008800000011010000,Hori Fighting Stick mini 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00008700000011010000,Hori Fighting Stick mini 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00004d00000011010000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux, +030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00001100000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f0000aa00000011010000,Hori Real Arcade Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000d0f00008501000017010000,Hori Split Pad Fit,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00008501000015010000,Hori Switch Split Pad Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000c100000011010000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f0000ab01000011010000,Horipad Steam,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc2:b2,paddle1:b19,paddle2:b18,paddle3:b15,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000000d0f00009601000091000000,Horipad Steam,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc2:b2,paddle1:b19,paddle2:b18,paddle3:b15,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux, +03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux, +03000000242e00006a38000010010000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Linux, +03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000830500006020000010010000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, +03000000d80400004bea000011010000,icedragon.io STAC Dance Pad,a:b0,b:b1,x:b2,y:b3,back:b4,platform:Linux, +03000000d80400004aea000011010000,icedragon.io STAC Dance Pad,a:b0,b:b1,x:b2,y:b3,back:b4,platform:Linux, +030000008a2e0000d910000011010000,icedragon.io STAC2 Dance Pad,a:b0,b:b1,x:b2,y:b3,back:b4,platform:Linux, +030000008a2e0000e910000011010000,icedragon.io STAC2 Dance Pad,a:b8,b:b9,x:b10,y:b11,back:b12,platform:Linux, +030000008f0e00001330000001010000,iCode Retro Adapter,b:b3,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b1,start:b7,x:b2,y:b0,platform:Linux, +050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000d80400008200000003000000,IMS PCU0,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux, +03000000120c00000500000010010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000ef0500000300000000010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000fd0500000030000000010000,InterAct GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Linux, +03000000fd0500002a26000000010000,InterAct HammerHead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, +0500000049190000020400001b010000,Ipega PG 9069,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000632500007505000011010000,Ipega PG 9099,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +0500000049190000030400001b010000,Ipega PG9099,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000491900000204000000000000,Ipega PG9118,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000300f00001101000010010000,Jess Tech Colour Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000300f00001001000010010000,Jess Tech Dual Analog Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000ba2200002010000001010000,Jess Technology Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +03000000bd12000003c0000010010000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000242f00002d00000011010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000242f00008a00000011010000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d040000d1ca000011010000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001dc2000014400000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000019200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000020200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000019c2000011010000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001fc2000005030000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux, +030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux, +05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008532000010010000,Mad Catz Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005032000011010000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005082000011010000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000380700008031000011010000,Mad Catz FightStick Alpha PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008081000011010000,Mad Catz FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008034000011010000,Mad Catz Fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000380700008433000011010000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008483000011010000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000380700001888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700003888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700001647000010040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000380700003847000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000120c00000500000000010000,Manta DualShock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +030000008f0e00001330000010010000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +03000000790000004318000010010000,Mayflash GameCube Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00001030000010010000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux, +0300000025090000e803000001010000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, +03000000790000000018000011010000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000b50700004f00000000010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, +03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux, +030000005e0400000300000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux, +030000005e0400000700000000010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux, +030000005e0400000e00000000010000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, +030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux, +030000005e0400008502000000010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400008902000021010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400008e02000001000000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.1,dpleft:h0.2,dpright:h0.8,dpup:h0.4,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000004010000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000056210000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000062230000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000001010000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000dd02000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000008040000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea0200000f050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b000009050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000e302000003020000,Microsoft Xbox One Elite,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000000b000007040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000000b000008040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e0400008e02000030110000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b00000b050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000016050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000017050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b000001050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, +03000000790000001c18000010010000,Mobapad Chitu HD,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +05000000e80400006e0400001b010000,Mocute 053X M59,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000004d4f435554452d3035305800,Mocute 054X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000d6200000e589000001000000,Moga 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +03000000c82d00000960000000000000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c62400002b89000011010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c62400001a89000000010000,MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000250900006688000000010000,MP8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000005e0400008e02000010020000,MSI GC20 V2,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000f70600000100000000010000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Linux, +030000006b1400000906000014010000,Nacon Asymmetric Wireless PS4 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006b140000010c000010010000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000853200000706000012010000,Nacon GC-100,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000853200000503000000010000,Nacon MG-X Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +0300000085320000170d000011010000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +0300000085320000190d000011010000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f1f00000800000011010000,NeoGeo PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +0300000092120000474e000000010000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Linux, +03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux, +060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux, +03000000ec110000e1a7000010010000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000007e0500006920000011010000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Linux, +060000004e696e74656e646f20537700,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux, +030000007e0500000920000000026803,Nintendo Switch Pro Controller,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Linux, +030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux, +05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500003003000001000000,Nintendo Wii U Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +050000005a1d00000218000003000000,Nokia GC 5000,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000000d0500000308000010010000,Nostromo n45 Dual Analog,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux, +030000007e0500007320000011010000,NSO GameCube Controller,a:b1,b:b3,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b13,lefttrigger:b12,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b4,rightx:a2,righty:a3~,start:b6,x:b0,y:b2,platform:Linux, +030000007e0500001920000011810000,NSO N64 Controller,+rightx:b2,+righty:b3,-rightx:b4,-righty:b10,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b5,rightshoulder:b7,righttrigger:b9,start:b11,platform:Linux, +050000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Linux, +050000007e0500001920000001800000,NSO N64 Controller,+rightx:b2,+righty:b3,-rightx:b4,-righty:b10,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b5,rightshoulder:b7,righttrigger:b9,start:b11,platform:Linux, +030000007e0500001e20000011810000,NSO Sega Genesis Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,misc1:b3,rightshoulder:b2,righttrigger:b4,start:b5,platform:Linux, +030000007e0500001720000011810000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b8,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500001720000001800000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000550900001472000011010000,NVIDIA Controller,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +05000000550900001472000001000000,NVIDIA Controller,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +030000004b120000014d000000010000,NYKO Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +19000000010000000100000001010000,ODROID Go 2,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux, +19000000010000000200000011000000,ODROID Go 2,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux, +05000000362800000100000002010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +05000000362800000100000003010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +05000000362800000100000004010000,OUYA Controller,a:b0,b:b3,back:b14,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b16,x:b1,y:b2,platform:Linux, +03000000830500005020000010010000,Padix Rockfire PlayStation Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux, +03000000ff1100003133000010010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e0000b802000001010000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000b802000013020000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000d702000006640000,PDP Black Camo Wired Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b13,dpup:b14,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00008501000011010000,PDP Fightpad Pro Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00000901000011010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00002f01000011010000,PDP Wired PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000004f9000000010000,PDP Xbox 360 Versus Fighting,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000f102000000000000,PDP Xbox Atomic,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000d802000006640000,PDP Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000ef02000007640000,PDP Xbox Series Kinetic Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000540000001010000,PowerA Advantage Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d620000011a7000011010000,PowerA Core Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000dd62000015a7000011010000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000012a7000011010000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000dd62000016a7000000000000,PowerA Fusion Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d620000013a7000011010000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000014a7000011010000,PowerA Spectra Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000520000050010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000b20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000f20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000250900000017000010010000,PS/SS/N64 Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b5,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2~,righty:a3,start:b8,platform:Linux, +03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000120c0000160e000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000005f1400003102000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +050000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +0300004b4c0500005f0e000011010000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000e60c000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000f20d000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000f20d000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +050000004c050000f20d000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, +03000000222c00000225000011010000,Qanba Dragon Arcade Joystick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000222c00000025000011010000,Qanba Dragon Arcade Joystick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000222c00001220000011010000,Qanba Drone 2 Arcade Joystick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000222c00001020000011010000,Qanba Drone 2 Arcade Joystick PS5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux, +03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000009b2800000300000001010000,Raphnet 4nes4snes,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, +030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux, +0300132d9b2800006500000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +0300132d9b2800006500000001010000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800003c00000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux, +030000009b2800006100000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux, +030000009b2800006300000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux, +030000009b2800006400000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux, +030000009b2800008000000020020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux, +030000009b2800008000000001010000,Raphnet Wii Classic Adapter V3,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux, +03000000f8270000bf0b000011010000,Razer Kishi,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000321500000010000011010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000b10000011010000,Razer Wolverine PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +0300000032150000140a000001010000,Razer Wolverine Ultimate Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f0000c100000010010000,Retro Bit Legacy16,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b12,leftshoulder:b4,lefttrigger:b6,misc1:b13,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux, +0300000003040000c197000011010000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, +190000004b4800000111000000010000,RetroGame Joypad,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, +0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +00000000526574726f53746f6e653200,RetroStone 2 Controller,a:b1,b:b0,back:b10,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,platform:Linux, +03000000341200000400000000010000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Linux, +030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00008701000011010000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001311000011010000,Saffun Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Linux, +03000000a306000023f6000011010000,Saitek Cyborg PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux, +03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux, +03000000a30600000cff000010010000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux, +03000000a30600000d5f000010010000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux, +03000000a30600000c04000011010000,Saitek P2900,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, +03000000a306000018f5000010010000,Saitek P3200 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, +03000000a30600000b04000000010000,Saitek P990 Dual Analog,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux, +03000000a306000020f6000011010000,Saitek PS2700 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +05000000e804000000a000001b010000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux, +03000000952e00004b43000011010000,Scuf Envision,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000952e00004d43000011010000,Scuf Envision,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000952e00004e43000011010000,Scuf Envision,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000a30c00002500000011010000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Linux, +03000000790000001100000011010000,Sega Saturn,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Linux, +03000000b40400000a01000000010000,Sega Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux, +03000000632500002305000010010000,ShanWan Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000632500002605000010010000,ShanWan Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000632500007505000010010000,ShanWan Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000bc2000000055000010010000,ShanWan Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000004b2900000430000011000000,Snakebyte Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000666600006706000000010000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, +030000004c050000da0c000011010000,Sony PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d9040000160f000000010000,Sony PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +030000004c0500003713000011010000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000250900000500000000010000,Sony PS2 pad with SmartJoy Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000112000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:+a5,dpleft:-a4,dpright:+a4,dpup:-a5,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800004211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000512000010010000,Steam Deck,a:b3,b:b4,back:b11,dpdown:b17,dpleft:b18,dpright:b19,dpup:b16,guide:b13,leftshoulder:b7,leftstick:b14,lefttrigger:a9,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b15,righttrigger:a8,rightx:a2,righty:a3,start:b12,x:b5,y:b6,platform:Linux, +03000000de2800000512000011010000,Steam Deck,a:b3,b:b4,back:b11,dpdown:b17,dpleft:b18,dpright:b19,dpup:b16,guide:b13,leftshoulder:b7,leftstick:b14,lefttrigger:a9,leftx:a0,lefty:a1,misc1:b2,paddle1:b21,paddle2:b20,paddle3:b23,paddle4:b22,rightshoulder:b8,rightstick:b15,righttrigger:a8,rightx:a2,righty:a3,start:b12,x:b5,y:b6,platform:Linux, +03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b10,guide:b11,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Linux, +03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000ad1b000038f0000090040000,Street Fighter IV Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000003b07000004a1000000010000,Suncom SFX Plus,a:b0,b:b2,back:b7,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Linux, +030000001f08000001e4000010010000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000457500000401000011010000,SZMY Power DS4 Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000e40a00000307000011010000,Taito Egret II Mini Control Panel,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Linux, +03000000e40a00000207000011010000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Linux, +03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux, +03000000790000001c18000011010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000591c00002400000010010000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +03000000591c00002600000010010000,THEGamepad,a:b2,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, +030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000023b3000000010000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f0400000ed0000011010000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,back:b11,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b0,righttrigger:b9,start:b1,x:b3,y:b5,platform:Linux, +030000004f04000003b3000010010000,Thrustmaster Firestorm Dual Analog 2,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b9,rightx:a2,righty:a3,x:b1,y:b3,platform:Linux, +030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux, +030000004f04000004b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000026b3000002040000,Thrustmaster GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000025b000002020000,Thrustmaster GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000004f04000008d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000009d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000007d0000000010000,Thrustmaster T Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000012b3000010010000,Thrustmaster Vibrating Gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +03000000571d00002000000010010000,Tomee SNES Adapter,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +03000000bd12000015d0000010010000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d814000007cd000011010000,Toodles 2008 Chimp PC PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000680a00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000780300000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000e00d00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +06000000f51000000870000003010000,Turtle Beach Recon,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000c0160000e105000010010000,Ultimate Atari Fight Stick,a:b1,b:b2,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b8,x:b0,y:b3,platform:Linux, +03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, +03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, +03000000790000001a18000011010000,Venom PS4 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000790000001b18000011010000,Venom PS4 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +05000000434f4d4d414e440000000000,VX Gaming Command Series,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +030000005e0400001907000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000014010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400009102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000030060000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001503000000020000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000000010000,Xbox 360 EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000014010000,Xbox 360 Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0000000058626f782047616d65706100,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400000202000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400008e02000072050000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001304000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000ffff0000ffff000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400000a0b000005040000,Xbox One Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000001030000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000dd02000003020000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000ea02000011050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000015050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000017050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000ea0200000d050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000ea02000016050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000005050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000009050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000011050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000014050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000015050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000007050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000011050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000017050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +060000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000130b000022050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +060000005e040000120b000011050000,Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000200b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000200b000023050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000220b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, +03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, +030000005e0400008e02000020010000,XInput Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000120c0000100e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000101e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000182e000011010000,Zeroplus PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000790000002201000011010000,ZhiXu GuliKit D,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, + +# Android +38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f20417263616465205374,8BitDo Arcade Stick,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b5,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android, +38426974446f204e4743204d6f646b69,8BitDo GameCube,a:b0,b:b2,back:b4,dpdown:b12,dpleft:b13,dpright:b14,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b18,paddle2:b17,rightshoulder:b15,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b1,y:b3,platform:Android, +38426974446f2038426974446f204c69,8BitDo Lite,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +30643332373663313263316637356631,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f204c6974652032000000,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +62656331626461363634633735353032,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f204c6974652053450000,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000006500000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a5,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000051060000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android, +32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android, +38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android, +64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android, +66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android, +66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android, +38426974446f204d6963726f2067616d,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, +61653365323561356263373333643266,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, +62613137616239666338343866326336,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, +33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android, +38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android, +32363135613966656338666638666237,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35363534633333373639386466346631,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f204e454f47454f204750,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39383963623932353561633733306334,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android, +38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +61333362366131643730353063616330,8BitDo Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android, +38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android, +61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android, +05000000c82d000012900000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000062280000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000002600000ffff0f00,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000002028000009000000ffff3f00,8BitDo SNES30,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000003512000020ab000000780f00,8BitDo SNES30,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android, +33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +38426974646f205a65726f2047616d65,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +4c696e757820342e31392e3137322077,Anbernic Handheld,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Android, +417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, +35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,start:b6,platform:Android, +32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4f64696e20436f6e74726f6c6c657200,AYN Odin,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b14,dpright:b13,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:+a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android, +05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +476f6f676c65204c4c43205374616469,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +5374616469614e3848532d6532633400,Google Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android, +66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, +65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b18,platform:Android, +31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +32656664353964393561366362333636,Hori Switch Split Pad Pro,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android, +62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android, +31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android, +5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android, +64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android, +532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android, +65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android, +33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39373064396565646338333134303131,Joy-Con (R),a:b1,b:b2,back:b5,leftstick:b8,leftx:a1~,lefty:a0,start:b6,x:b0,y:b3,platform:Android, +4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android, +436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android, +31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, +37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b9,x:b2,y:b3,platform:Android, +33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android, +30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b20,lefttrigger:b9,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android, +32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4d4f42415041442050726f2d48440000,Mobapad Chitu HD,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android, +050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android, +31316661666466633938376335383661,Nintendo Switch Pro Controller,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,start:b6,x:b3,y:b2,platform:Android, +34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android, +36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, +4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, +534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +050000005509000014720000df7f3f80,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android, +37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39383335313438623439373538343266,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b16,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, +4f5559412047616d6520436f6e74726f,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b6,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, +506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, +61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android, +32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android, +050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +536f6e7920504c415953544154494f4e,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363034663839376638653463633865,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66366539656564653432353139356536,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66383132326164626636313737373037,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000c4050000fffe3f80,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android, +31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000e60c0000fffe3f80,PS5 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b2,y:b17,platform:Android, +050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000f8270000bf0b0000ffff3f00,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android, +32417865732031314b6579732047616d,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +36313938306539326233393732613361,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android, +61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android, +526574726f696420506f636b65742043,Retroid Pocket,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +582d426f7820436f6e74726f6c6c6572,Retroid Pocket,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64633735616665613536653363336132,Retroid Pocket,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b19,paddle2:b20,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b6,platform:Android, +37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, +5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, +526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, +64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, +37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, +36363537303435333566386638366333,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +53616d73756e672047616d6520506164,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android, +32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android, +61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +62653335326261303663356263626339,Sony PlayStation Classic Controller,a:b19,b:b1,back:b17,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b3,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android, +536f6e7920496e746572616374697665,Sony PlayStation Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +576972656c65737320436f6e74726f6c,Sony PlayStation Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android, +63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, +35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android, +33313930373536613937326534303931,Taito Egret II Mini Control Panel,a:b25,b:b23,back:b27,guide:b30,leftx:a0,lefty:a1,rightshoulder:b21,righttrigger:b22,start:b28,x:b29,y:b24,platform:Android, +54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37323236633763666465316365313236,THEC64 Joystick,a:b21,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b27,x:b23,y:b24,platform:Android, +38346162326232346533316164363336,THEGamepad,a:b23,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b24,y:b21,platform:Android, +050000004f0400000ed00000fffe3f00,Thrustmaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, +30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30396232393162346330326334636566,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38313038323730383864666463383533,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65353331386662343338643939643636,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65613532386633373963616462363038,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e04000091020000ff073f80,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, +050000005e040000e00200000ffe3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android, +050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, +050000005e040000e0020000ffff3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android, +050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android, +35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65316262316265373335666131623538,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e040000000b000000783f80,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000050b0000ffff3f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e040000120b000000783f80,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, + +# iOS +05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000df076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +05000000ac05000004000000a8986d04,8BitDo Micro,a:b1,b:b0,back:b4,dpdown:b7,dpleft:b8,dpright:b9,dpup:b10,guide:b2,leftshoulder:b11,lefttrigger:b12,rightshoulder:b13,righttrigger:b14,start:b3,x:b6,y:b5,platform:iOS, +05000000ac05000004000000fd216d04,8BitDo Pro 2,a:b3,b:b2,back:b6,dpdown:b9,dpleft:b10,dpright:b11,dpup:b12,guide:b4,leftshoulder:b13,leftstick:b14,lefttrigger:+a2,leftx:a0,lefty:a1~,paddle1:b1,paddle2:b0,rightshoulder:b16,rightstick:b17,righttrigger:+a5,rightx:a3,righty:a4~,start:b5,x:b8,y:b7,platform:iOS, +05000000ac05000004000000209f6d04,8Bitdo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b7,dpleft:b8,dpright:b9,dpup:b10,guide:b2,leftshoulder:b11,leftstick:b12,lefttrigger:b13,leftx:a0,lefty:a1~,rightshoulder:b14,rightstick:b15,righttrigger:b16,rightx:a2,righty:a3~,start:b3,x:b6,y:b5,platform:iOS, +05000000ac050000040000003b8a6d04,8BitDo SN30 Pro+,a:b1,b:b0,back:b4,dpdown:b7,dpleft:b8,dpright:b9,dpup:b10,guide:b2,leftshoulder:b11,leftstick:b12,lefttrigger:b13,leftx:a0,lefty:a1~,rightshoulder:b14,rightstick:b15,righttrigger:b16,rightx:a2,righty:a3~,start:b3,x:b6,y:b5,platform:iOS, +050000008a35000003010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000008a35000004010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, +4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, +050000007e050000062000000f060000,Nintendo Switch Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS, +050000007e050000062000004f060000,Nintendo Switch Joy-Con (L),+leftx:h0.1,+lefty:h0.2,-leftx:h0.4,-lefty:h0.8,dpdown:b2,dpleft:b0,dpright:b3,dpup:b1,leftshoulder:b4,misc1:b6,rightshoulder:b5,platform:iOS, +050000007e05000008200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, +050000007e0500000e200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, +050000007e050000072000000f060000,Nintendo Switch Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS, +050000007e050000072000004f060000,Nintendo Switch Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS, +050000007e05000009200000df870000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, +050000007e05000009200000ff870000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b3,y:b2,platform:iOS, +05000000ac050000040000008e586d04,PlayStation VR2 Sense Controller (L),+leftx:+a3,+lefty:+a1,-leftx:+a2,-lefty:+a4,back:b2,leftstick:b4,lefttrigger:+a7,paddle2:b3,x:b0,y:b1,platform:iOS, +05000000ac050000040000000eb86d04,PlayStation VR2 Sense Controller (R),+rightx:+a3,+righty:+a1,-rightx:+a2,-righty:+a4,a:b0,b:b1,paddle1:b3,rightstick:b4,righttrigger:+a7,start:b2,platform:iOS, +050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff876d01,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000e60c0000df870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,touchpad:b10,x:b2,y:b3,platform:iOS, +050000004c050000e60c0000ff870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, +05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +050000005e040000050b0000df070001,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b10,paddle2:b12,paddle3:b11,paddle4:b13,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000050b0000ff070001,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000005e040000130b0000df870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000130b0000ff870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000005e040000e0020000df070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000e0020000ff070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, diff --git a/py/assets/levels/collecting.ldtk b/py/assets/levels/collecting.ldtk new file mode 100644 index 0000000..926052a --- /dev/null +++ b/py/assets/levels/collecting.ldtk @@ -0,0 +1,5571 @@ +{ + "__header__": { + "fileType": "LDtk Project JSON", + "app": "LDtk", + "doc": "https://ldtk.io/json", + "schema": "https://ldtk.io/files/JSON_SCHEMA.json", + "appAuthor": "Sebastien 'deepnight' Benard", + "appVersion": "1.5.3", + "url": "https://ldtk.io" + }, + "iid": "d73f3980-d380-11f0-87cf-5fab6ff1ccf3", + "jsonVersion": "1.5.3", + "appBuildId": 473703, + "nextUid": 193, + "identifierStyle": "Capitalize", + "toc": [], + "worldLayout": "Free", + "worldGridWidth": 256, + "worldGridHeight": 256, + "defaultLevelWidth": 256, + "defaultLevelHeight": 256, + "defaultPivotX": 0, + "defaultPivotY": 0, + "defaultGridSize": 18, + "defaultEntityWidth": 18, + "defaultEntityHeight": 18, + "bgColor": "#40465B", + "defaultLevelBgColor": "#696A79", + "minifyJson": false, + "externalLevels": false, + "exportTiled": false, + "simplifiedExport": false, + "imageExportMode": "None", + "exportLevelBg": true, + "pngFilePattern": null, + "backupOnSave": false, + "backupLimit": 10, + "backupRelPath": null, + "levelNamePattern": "Level_%idx", + "tutorialDesc": null, + "customCommands": [], + "flags": [], + "defs": { "layers": [ + { + "__type": "Entities", + "identifier": "Entities", + "type": "Entities", + "uid": 191, + "doc": null, + "uiColor": null, + "gridSize": 4, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 0.6, + "hideInList": false, + "hideFieldsWhenInactive": true, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [], + "intGridValuesGroups": [], + "autoRuleGroups": [], + "autoSourceLayerDefUid": null, + "tilesetDefUid": null, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + }, + { + "__type": "IntGrid", + "identifier": "IntGrid", + "type": "IntGrid", + "uid": 3, + "doc": null, + "uiColor": null, + "gridSize": 18, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 1, + "hideInList": false, + "hideFieldsWhenInactive": false, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [ + { "value": 1, "identifier": "walls", "color": "#C28569", "tile": null, "groupUid": 0 }, + { "value": 2, "identifier": "clouds", "color": "#F7F5F5", "tile": null, "groupUid": 0 }, + { "value": 3, "identifier": "trees", "color": "#63C74D", "tile": null, "groupUid": 0 }, + { "value": 4, "identifier": "trunks", "color": "#BE4A2F", "tile": null, "groupUid": 0 } + ], + "intGridValuesGroups": [], + "autoRuleGroups": [ + { + "uid": 116, + "name": "trunks", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 167, + "active": true, + "size": 3, + "tileRectsIds": [[58]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,3,0,3,3,4,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3116739, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 172, + "active": true, + "size": 3, + "tileRectsIds": [[57]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,3,0,-3,3,4,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3116739, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 168, + "active": true, + "size": 3, + "tileRectsIds": [[38]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,3,0,3,3,4,0,3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3116739, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 169, + "active": true, + "size": 3, + "tileRectsIds": [[38]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,3,0,4,3,3,0,3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3116739, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 170, + "active": true, + "size": 3, + "tileRectsIds": [[58]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,3,0,4,3,3,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3116739, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 171, + "active": true, + "size": 3, + "tileRectsIds": [[59]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,3,0,4,3,-3,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3116739, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 173, + "active": true, + "size": 3, + "tileRectsIds": [[38]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,3,0,3,3,3,0,4,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3116739, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 174, + "active": true, + "size": 3, + "tileRectsIds": [[18]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,3,3,3,0,4,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3116739, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 117, + "active": true, + "size": 3, + "tileRectsIds": [[97]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,3,0,3,4,3,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4416921, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 166, + "active": true, + "size": 3, + "tileRectsIds": [ [96], [116] ], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,4,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3675461, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 175, + "active": true, + "size": 3, + "tileRectsIds": [[137]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,4,0,0,4,0,0,1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3675461, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": false, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 99, + "name": "trees", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 150, + "active": true, + "size": 3, + "tileRectsIds": [[16]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,-3,3,-3,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 8361328, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 151, + "active": true, + "size": 3, + "tileRectsIds": [[77]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,-3,3,0,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2633089, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 152, + "active": true, + "size": 3, + "tileRectsIds": [[79]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,0,3,-3,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 5051035, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 153, + "active": true, + "size": 3, + "tileRectsIds": [[78]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,0,3,0,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1854154, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 154, + "active": true, + "size": 3, + "tileRectsIds": [[36]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,-3,3,-3,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 579623, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 155, + "active": true, + "size": 3, + "tileRectsIds": [[76]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-3,3,-3,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 7616645, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 156, + "active": true, + "size": 3, + "tileRectsIds": [[56]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-3,3,-3,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9052676, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 157, + "active": true, + "size": 3, + "tileRectsIds": [[17]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,-3,3,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1665955, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 158, + "active": true, + "size": 3, + "tileRectsIds": [[19]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,0,3,-3,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6836908, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 159, + "active": true, + "size": 3, + "tileRectsIds": [[59]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,3,-3,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9407960, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 160, + "active": true, + "size": 3, + "tileRectsIds": [[57]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-3,3,0,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2177855, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 161, + "active": true, + "size": 3, + "tileRectsIds": [[18]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-3,0,0,3,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1611404, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 162, + "active": true, + "size": 3, + "tileRectsIds": [[39]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,3,-3,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 7076077, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 163, + "active": true, + "size": 3, + "tileRectsIds": [[58]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,3,0,0,-3,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4450915, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 164, + "active": true, + "size": 3, + "tileRectsIds": [[37]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-3,3,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 5393818, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 165, + "active": true, + "size": 1, + "tileRectsIds": [[38]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [3], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 3, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1014530, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": false, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 39, + "name": "clouds", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 40, + "active": true, + "size": 3, + "tileRectsIds": [[156]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-2,0,-2,2,-2,0,-2,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 2, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1447730, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 41, + "active": true, + "size": 3, + "tileRectsIds": [[153]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-2,0,-2,2,0,0,-2,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 2, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3308547, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 42, + "active": true, + "size": 3, + "tileRectsIds": [[155]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-2,0,0,2,-2,0,-2,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 2, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2061711, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 43, + "active": true, + "size": 3, + "tileRectsIds": [[154]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-2,0,0,2,0,0,-2,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 2, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6319210, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": true, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 4, + "name": "walls", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 47, + "active": true, + "size": 3, + "tileRectsIds": [[0]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,-1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2573424, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 48, + "active": true, + "size": 3, + "tileRectsIds": [[4]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,1,0,1,-1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 5728887, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 49, + "active": true, + "size": 3, + "tileRectsIds": [[5]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,1,1,-1,-1,1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3731684, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 50, + "active": true, + "size": 3, + "tileRectsIds": [[25]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,0,1,1,-1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 5393657, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 51, + "active": true, + "size": 3, + "tileRectsIds": [[24]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,1,-1,-1,1,1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2759139, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 52, + "active": true, + "size": 3, + "tileRectsIds": [[1]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3628070, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 53, + "active": true, + "size": 3, + "tileRectsIds": [[3]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,-1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 329268, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 54, + "active": true, + "size": 3, + "tileRectsIds": [[2]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3230151, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 55, + "active": true, + "size": 3, + "tileRectsIds": [[21]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 5032169, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 56, + "active": true, + "size": 3, + "tileRectsIds": [[23]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,-1,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3560916, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 57, + "active": true, + "size": 3, + "tileRectsIds": [[143]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,1,-1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2981275, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 58, + "active": true, + "size": 3, + "tileRectsIds": [[141]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-1,1,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2125068, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 59, + "active": true, + "size": 3, + "tileRectsIds": [[22]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4206024, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 60, + "active": true, + "size": 3, + "tileRectsIds": [[123]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,1,-1,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6801093, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 61, + "active": true, + "size": 3, + "tileRectsIds": [[142]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,1,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 256579, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 62, + "active": true, + "size": 3, + "tileRectsIds": [[121]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-1,1,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6625497, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 63, + "active": true, + "size": 1, + "tileRectsIds": [[122]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 58927, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": true, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 21, + "name": "plants", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 22, + "active": true, + "size": 3, + "tileRectsIds": [ [124], [125], [128], [144] ], + "alpha": 1, + "chance": 0.2, + "breakOnMatch": true, + "pattern": [0,0,0,0,0,0,0,1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 467680, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": false, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + } + ], + "autoSourceLayerDefUid": null, + "tilesetDefUid": 1, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + }, + { + "__type": "Tiles", + "identifier": "Background", + "type": "Tiles", + "uid": 180, + "doc": null, + "uiColor": null, + "gridSize": 24, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 1, + "hideInList": false, + "hideFieldsWhenInactive": false, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [], + "intGridValuesGroups": [], + "autoRuleGroups": [], + "autoSourceLayerDefUid": null, + "tilesetDefUid": 2, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + } + ], "entities": [ + { + "identifier": "Start", + "uid": 181, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 24, + "height": 24, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 0.08, + "lineOpacity": 0, + "hollow": false, + "color": "#4CBE2F", + "renderMode": "Tile", + "showName": true, + "tilesetId": 183, + "tileRenderMode": "FitInside", + "tileRect": { "tilesetUid": 183, "x": 24, "y": 0, "w": 24, "h": 24 }, + "uiTileRect": { "tilesetUid": 183, "x": 24, "y": 0, "w": 24, "h": 24 }, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0.5, + "pivotY": 0.5, + "fieldDefs": [] + }, + { + "identifier": "Bat", + "uid": 182, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 24, + "height": 24, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 0.08, + "lineOpacity": 0, + "hollow": false, + "color": "#F03307", + "renderMode": "Tile", + "showName": true, + "tilesetId": 183, + "tileRenderMode": "FitInside", + "tileRect": { "tilesetUid": 183, "x": 144, "y": 48, "w": 24, "h": 24 }, + "uiTileRect": { "tilesetUid": 183, "x": 144, "y": 48, "w": 24, "h": 24 }, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0.5, + "pivotY": 0.5, + "fieldDefs": [ + { + "identifier": "end", + "doc": null, + "__type": "Point", + "uid": 185, + "type": "F_Point", + "isArray": false, + "canBeNull": false, + "arrayMinLength": null, + "arrayMaxLength": null, + "editorDisplayMode": "PointPath", + "editorDisplayScale": 1, + "editorDisplayPos": "Above", + "editorLinkStyle": "StraightArrow", + "editorDisplayColor": null, + "editorAlwaysShow": false, + "editorShowInWorld": true, + "editorCutLongValues": true, + "editorTextSuffix": null, + "editorTextPrefix": null, + "useForSmartColor": false, + "exportToToc": false, + "searchable": false, + "min": null, + "max": null, + "regex": null, + "acceptFileTypes": null, + "defaultOverride": null, + "textLanguageMode": null, + "symmetricalRef": false, + "autoChainRef": true, + "allowOutOfLevelRef": true, + "allowedRefs": "OnlySame", + "allowedRefsEntityUid": null, + "allowedRefTags": [], + "tilesetUid": null + } + ] + }, + { + "identifier": "DrillHead", + "uid": 186, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 24, + "height": 24, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 0.08, + "lineOpacity": 0, + "hollow": false, + "color": "#F52F01", + "renderMode": "Tile", + "showName": true, + "tilesetId": 183, + "tileRenderMode": "FitInside", + "tileRect": { "tilesetUid": 183, "x": 144, "y": 24, "w": 24, "h": 24 }, + "uiTileRect": { "tilesetUid": 183, "x": 144, "y": 24, "w": 24, "h": 24 }, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0.5, + "pivotY": 0.5, + "fieldDefs": [ + { + "identifier": "end", + "doc": null, + "__type": "Point", + "uid": 188, + "type": "F_Point", + "isArray": false, + "canBeNull": false, + "arrayMinLength": null, + "arrayMaxLength": null, + "editorDisplayMode": "PointPath", + "editorDisplayScale": 1, + "editorDisplayPos": "Above", + "editorLinkStyle": "StraightArrow", + "editorDisplayColor": null, + "editorAlwaysShow": false, + "editorShowInWorld": true, + "editorCutLongValues": true, + "editorTextSuffix": null, + "editorTextPrefix": null, + "useForSmartColor": false, + "exportToToc": false, + "searchable": false, + "min": null, + "max": null, + "regex": null, + "acceptFileTypes": null, + "defaultOverride": null, + "textLanguageMode": null, + "symmetricalRef": false, + "autoChainRef": true, + "allowOutOfLevelRef": true, + "allowedRefs": "OnlySame", + "allowedRefsEntityUid": null, + "allowedRefTags": [], + "tilesetUid": null + } + ] + }, + { + "identifier": "BlockHead", + "uid": 189, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 24, + "height": 24, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 0.08, + "lineOpacity": 0, + "hollow": false, + "color": "#EB350B", + "renderMode": "Tile", + "showName": true, + "tilesetId": 183, + "tileRenderMode": "FitInside", + "tileRect": { "tilesetUid": 183, "x": 0, "y": 48, "w": 24, "h": 24 }, + "uiTileRect": { "tilesetUid": 183, "x": 0, "y": 48, "w": 24, "h": 24 }, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0.5, + "pivotY": 0.5, + "fieldDefs": [ + { + "identifier": "end", + "doc": null, + "__type": "Point", + "uid": 190, + "type": "F_Point", + "isArray": false, + "canBeNull": false, + "arrayMinLength": null, + "arrayMaxLength": null, + "editorDisplayMode": "PointPath", + "editorDisplayScale": 1, + "editorDisplayPos": "Above", + "editorLinkStyle": "StraightArrow", + "editorDisplayColor": null, + "editorAlwaysShow": false, + "editorShowInWorld": true, + "editorCutLongValues": true, + "editorTextSuffix": null, + "editorTextPrefix": null, + "useForSmartColor": false, + "exportToToc": false, + "searchable": false, + "min": null, + "max": null, + "regex": null, + "acceptFileTypes": null, + "defaultOverride": null, + "textLanguageMode": null, + "symmetricalRef": false, + "autoChainRef": true, + "allowOutOfLevelRef": true, + "allowedRefs": "OnlySame", + "allowedRefsEntityUid": null, + "allowedRefTags": [], + "tilesetUid": null + } + ] + }, + { + "identifier": "Coin", + "uid": 192, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 18, + "height": 18, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 0.08, + "lineOpacity": 0, + "hollow": false, + "color": "#E5EB08", + "renderMode": "Tile", + "showName": true, + "tilesetId": 1, + "tileRenderMode": "FitInside", + "tileRect": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "uiTileRect": null, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0.5, + "pivotY": 0.5, + "fieldDefs": [] + } + ], "tilesets": [ + { + "__cWid": 20, + "__cHei": 9, + "identifier": "Tilemap", + "uid": 1, + "relPath": "../pixel_platformer/tilemap.png", + "embedAtlas": null, + "pxWid": 360, + "pxHei": 162, + "tileGridSize": 18, + "spacing": 0, + "padding": 0, + "tags": [], + "tagsSourceEnumUid": null, + "enumTags": [], + "customData": [], + "savedSelections": [], + "cachedPixelData": { + "opaqueTiles": "001011000000000000000010110000000000001000100000010000110000001000000001011100000010000000000000000000101000000000000000111100000010000000000010000000100000000000000000000000000000", + "averageColors": "f786f886f886f886fc85fc85fa756a653965fc94fc95fc96fd75fc65fc65fc65c396e3a7e3a7e3a7f886f886f996f886fc85fc85fa659a73fb84fa75fa75fa759c96f3bef6bdf6bdd397e3a7f3a8e3a7fa76fb86fb86fb866b4359444446fa65fb75fb75fb75c9659c96f3bef4bdf4bde397e3a7e3a7e3a7fb86fb86fc86fb867977797779776379688978665889f965ac96f3cef6bdf6bdd397d397e3a7d397fa99fba9fbaafba9ca65ca65ca65b955b9555854786658547866c3acc3ace39bb786f59765868675fb99fba9fcaafba9fc85c96589657977997878664b75ca55ca55c3acc3ace39c9a65ba6538545954fb75fb76fc85fb7563869386748693866b657a75fa765778e39be39ce39be39baa65aa65aa653854fa76fb75fb75fb754899a9998a658976589a489afa656b854a74abcccccdabcc7aaa167769996889599a5999599a599a5999599a599a5899599a599a799a5999799a799a7999899a699a699979aa699a" + } + }, + { + "__cWid": 8, + "__cHei": 3, + "identifier": "Backgrounds", + "uid": 2, + "relPath": "../pixel_platformer/backgrounds.png", + "embedAtlas": null, + "pxWid": 192, + "pxHei": 72, + "tileGridSize": 24, + "spacing": 0, + "padding": 0, + "tags": [], + "tagsSourceEnumUid": null, + "enumTags": [], + "customData": [], + "savedSelections": [], + "cachedPixelData": { + "opaqueTiles": "111111111111111111111111", + "averageColors": "fdeefdeefdeefdeeffc7ffc7f7eaf7eafefffeeefffffefffea6fea6f4d7f4d8fbdefbdefbdefbdefc85fc85f3a8f3a8" + } + }, + { + "__cWid": 9, + "__cHei": 3, + "identifier": "Characters", + "uid": 183, + "relPath": "../pixel_platformer/characters.png", + "embedAtlas": null, + "pxWid": 216, + "pxHei": 72, + "tileGridSize": 24, + "spacing": 0, + "padding": 0, + "tags": [], + "tagsSourceEnumUid": null, + "enumTags": [], + "customData": [], + "savedSelections": [], + "cachedPixelData": { + "opaqueTiles": "000000000000000000000000000", + "averageColors": "a9cba9cbaacdaabdacbcacbcacbbacbb9889accbaccb8c948c954a744a74597769775977568a568a568ac68ad68ac69a587758775877" + } + } + ], "enums": [], "externalEnums": [], "levelFields": [] }, + "levels": [ + { + "identifier": "Level", + "iid": "d7407200-d380-11f0-87cf-077db831fe53", + "uid": 0, + "worldX": 0, + "worldY": 0, + "worldDepth": 0, + "pxWid": 1024, + "pxHei": 1024, + "__bgColor": "#696A79", + "bgColor": null, + "useAutoIdentifier": false, + "bgRelPath": null, + "bgPos": null, + "bgPivotX": 0.5, + "bgPivotY": 0.5, + "__smartColor": "#ADADB5", + "__bgPos": null, + "externalRelPath": null, + "fieldInstances": [], + "layerInstances": [ + { + "__identifier": "Entities", + "__type": "Entities", + "__cWid": 256, + "__cHei": 256, + "__gridSize": 4, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": null, + "__tilesetRelPath": null, + "iid": "a2f8aa20-d380-11f0-8c50-9763fc783dba", + "levelId": 0, + "layerDefUid": 191, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [], + "autoLayerTiles": [], + "seed": 2769432, + "overrideTilesetUid": null, + "gridTiles": [], + "entityInstances": [ + { + "__identifier": "Start", + "__grid": [14,15], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 24, "y": 0, "w": 24, "h": 24 }, + "__smartColor": "#4CBE2F", + "iid": "00a25df0-d380-11f0-8c50-739061d740f3", + "width": 24, + "height": 24, + "defUid": 181, + "px": [58,62], + "fieldInstances": [], + "__worldX": 58, + "__worldY": 62 + }, + { + "__identifier": "Start", + "__grid": [221,46], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 24, "y": 0, "w": 24, "h": 24 }, + "__smartColor": "#4CBE2F", + "iid": "045d4310-d380-11f0-8c50-710bd1478e02", + "width": 24, + "height": 24, + "defUid": 181, + "px": [886,186], + "fieldInstances": [], + "__worldX": 886, + "__worldY": 186 + }, + { + "__identifier": "Bat", + "__grid": [98,160], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 144, "y": 48, "w": 24, "h": 24 }, + "__smartColor": "#F03307", + "iid": "0ae13340-d380-11f0-8c50-65300abf4c46", + "width": 24, + "height": 24, + "defUid": 182, + "px": [394,642], + "fieldInstances": [{ "__identifier": "end", "__type": "Point", "__value": { "cx": 157, "cy": 160 }, "__tile": null, "defUid": 185, "realEditorValues": [{ + "id": "V_String", + "params": ["157,160"] + }] }], + "__worldX": 394, + "__worldY": 642 + }, + { + "__identifier": "Bat", + "__grid": [224,82], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 144, "y": 48, "w": 24, "h": 24 }, + "__smartColor": "#F03307", + "iid": "177d0b60-d380-11f0-8c50-ffbb9eac13b3", + "width": 24, + "height": 24, + "defUid": 182, + "px": [898,330], + "fieldInstances": [{ "__identifier": "end", "__type": "Point", "__value": { "cx": 241, "cy": 82 }, "__tile": null, "defUid": 185, "realEditorValues": [{ + "id": "V_String", + "params": ["241,82"] + }] }], + "__worldX": 898, + "__worldY": 330 + }, + { + "__identifier": "Bat", + "__grid": [98,34], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 144, "y": 48, "w": 24, "h": 24 }, + "__smartColor": "#F03307", + "iid": "19da8360-d380-11f0-8c50-bf21d35bf7f8", + "width": 24, + "height": 24, + "defUid": 182, + "px": [394,138], + "fieldInstances": [{ "__identifier": "end", "__type": "Point", "__value": { "cx": 166, "cy": 34 }, "__tile": null, "defUid": 185, "realEditorValues": [{ + "id": "V_String", + "params": ["166,34"] + }] }], + "__worldX": 394, + "__worldY": 138 + }, + { + "__identifier": "DrillHead", + "__grid": [51,123], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 144, "y": 24, "w": 24, "h": 24 }, + "__smartColor": "#F52F01", + "iid": "201a65b0-d380-11f0-8c50-5d44b9b521d7", + "width": 24, + "height": 24, + "defUid": 186, + "px": [206,494], + "fieldInstances": [{ "__identifier": "end", "__type": "Point", "__value": { "cx": 10, "cy": 123 }, "__tile": null, "defUid": 188, "realEditorValues": [{ + "id": "V_String", + "params": ["10,123"] + }] }], + "__worldX": 206, + "__worldY": 494 + }, + { + "__identifier": "DrillHead", + "__grid": [160,132], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 144, "y": 24, "w": 24, "h": 24 }, + "__smartColor": "#F52F01", + "iid": "2a8e06a0-d380-11f0-8c50-75c2c285118f", + "width": 24, + "height": 24, + "defUid": 186, + "px": [642,530], + "fieldInstances": [{ "__identifier": "end", "__type": "Point", "__value": { "cx": 204, "cy": 132 }, "__tile": null, "defUid": 188, "realEditorValues": [{ + "id": "V_String", + "params": ["204,132"] + }] }], + "__worldX": 642, + "__worldY": 530 + }, + { + "__identifier": "BlockHead", + "__grid": [32,235], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 0, "y": 48, "w": 24, "h": 24 }, + "__smartColor": "#EB350B", + "iid": "3119bf00-d380-11f0-8c50-576bc1ad5a31", + "width": 24, + "height": 24, + "defUid": 189, + "px": [130,942], + "fieldInstances": [{ "__identifier": "end", "__type": "Point", "__value": { "cx": 90, "cy": 235 }, "__tile": null, "defUid": 190, "realEditorValues": [{ + "id": "V_String", + "params": ["90,235"] + }] }], + "__worldX": 130, + "__worldY": 942 + }, + { + "__identifier": "BlockHead", + "__grid": [145,235], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 0, "y": 48, "w": 24, "h": 24 }, + "__smartColor": "#EB350B", + "iid": "3868a050-d380-11f0-8c50-85188ffcff08", + "width": 24, + "height": 24, + "defUid": 189, + "px": [582,942], + "fieldInstances": [{ "__identifier": "end", "__type": "Point", "__value": { "cx": 191, "cy": 235 }, "__tile": null, "defUid": 190, "realEditorValues": [{ + "id": "V_String", + "params": ["191,235"] + }] }], + "__worldX": 582, + "__worldY": 942 + }, + { + "__identifier": "BlockHead", + "__grid": [182,82], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 0, "y": 48, "w": 24, "h": 24 }, + "__smartColor": "#EB350B", + "iid": "41315060-d380-11f0-8c50-1b8e3004102a", + "width": 24, + "height": 24, + "defUid": 189, + "px": [730,330], + "fieldInstances": [{ "__identifier": "end", "__type": "Point", "__value": { "cx": 200, "cy": 82 }, "__tile": null, "defUid": 190, "realEditorValues": [{ + "id": "V_String", + "params": ["200,82"] + }] }], + "__worldX": 730, + "__worldY": 330 + }, + { + "__identifier": "Coin", + "__grid": [89,74], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "4972f620-d380-11f0-8c50-5d5d153784fc", + "width": 18, + "height": 18, + "defUid": 192, + "px": [358,298], + "fieldInstances": [], + "__worldX": 358, + "__worldY": 298 + }, + { + "__identifier": "Coin", + "__grid": [127,168], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "4bc76d70-d380-11f0-8c50-e5748b4866b3", + "width": 18, + "height": 18, + "defUid": 192, + "px": [510,674], + "fieldInstances": [], + "__worldX": 510, + "__worldY": 674 + }, + { + "__identifier": "Coin", + "__grid": [111,167], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "4ccfdcc0-d380-11f0-8c50-c39270d8de5b", + "width": 18, + "height": 18, + "defUid": 192, + "px": [446,670], + "fieldInstances": [], + "__worldX": 446, + "__worldY": 670 + }, + { + "__identifier": "Coin", + "__grid": [145,166], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "4d9eec90-d380-11f0-8c50-57a6decc2b9e", + "width": 18, + "height": 18, + "defUid": 192, + "px": [582,666], + "fieldInstances": [], + "__worldX": 582, + "__worldY": 666 + }, + { + "__identifier": "Coin", + "__grid": [200,183], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "4f3d0c30-d380-11f0-8c50-fbf31ff006f5", + "width": 18, + "height": 18, + "defUid": 192, + "px": [802,734], + "fieldInstances": [], + "__worldX": 802, + "__worldY": 734 + }, + { + "__identifier": "Coin", + "__grid": [247,235], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5093c290-d380-11f0-8c50-6bd5819aa46f", + "width": 18, + "height": 18, + "defUid": 192, + "px": [990,942], + "fieldInstances": [], + "__worldX": 990, + "__worldY": 942 + }, + { + "__identifier": "Coin", + "__grid": [225,234], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "516ac1a0-d380-11f0-8c50-6f45c2705899", + "width": 18, + "height": 18, + "defUid": 192, + "px": [902,938], + "fieldInstances": [], + "__worldX": 902, + "__worldY": 938 + }, + { + "__identifier": "Coin", + "__grid": [54,204], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5312f360-d380-11f0-8c50-c96e13577028", + "width": 18, + "height": 18, + "defUid": 192, + "px": [218,818], + "fieldInstances": [], + "__worldX": 218, + "__worldY": 818 + }, + { + "__identifier": "Coin", + "__grid": [20,123], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "54a88780-d380-11f0-8c50-ab7ce626f220", + "width": 18, + "height": 18, + "defUid": 192, + "px": [82,494], + "fieldInstances": [], + "__worldX": 82, + "__worldY": 494 + }, + { + "__identifier": "Coin", + "__grid": [43,123], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "559a6190-d380-11f0-8c50-cb4213af8bca", + "width": 18, + "height": 18, + "defUid": 192, + "px": [174,494], + "fieldInstances": [], + "__worldX": 174, + "__worldY": 494 + }, + { + "__identifier": "Coin", + "__grid": [103,87], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5757f010-d380-11f0-8c50-874c95593ff2", + "width": 18, + "height": 18, + "defUid": 192, + "px": [414,350], + "fieldInstances": [], + "__worldX": 414, + "__worldY": 350 + }, + { + "__identifier": "Coin", + "__grid": [58,56], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "596bb4e0-d380-11f0-8c50-5f2f941b5561", + "width": 18, + "height": 18, + "defUid": 192, + "px": [234,226], + "fieldInstances": [], + "__worldX": 234, + "__worldY": 226 + }, + { + "__identifier": "Coin", + "__grid": [91,56], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5a79a270-d380-11f0-8c50-479af5647ebf", + "width": 18, + "height": 18, + "defUid": 192, + "px": [366,226], + "fieldInstances": [], + "__worldX": 366, + "__worldY": 226 + }, + { + "__identifier": "Coin", + "__grid": [142,60], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5b745620-d380-11f0-8c50-4ff429a23456", + "width": 18, + "height": 18, + "defUid": 192, + "px": [570,242], + "fieldInstances": [], + "__worldX": 570, + "__worldY": 242 + }, + { + "__identifier": "Coin", + "__grid": [159,60], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5c31d9c0-d380-11f0-8c50-192cafdb0960", + "width": 18, + "height": 18, + "defUid": 192, + "px": [638,242], + "fieldInstances": [], + "__worldX": 638, + "__worldY": 242 + }, + { + "__identifier": "Coin", + "__grid": [231,15], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5db67df0-d380-11f0-8c50-bd6a51eabfa2", + "width": 18, + "height": 18, + "defUid": 192, + "px": [926,62], + "fieldInstances": [], + "__worldX": 926, + "__worldY": 62 + }, + { + "__identifier": "Coin", + "__grid": [239,46], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5f078f00-d380-11f0-8c50-9bfe2de7aee6", + "width": 18, + "height": 18, + "defUid": 192, + "px": [958,186], + "fieldInstances": [], + "__worldX": 958, + "__worldY": 186 + }, + { + "__identifier": "Coin", + "__grid": [188,32], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "5fedf760-d380-11f0-8c50-59f5dad6cb06", + "width": 18, + "height": 18, + "defUid": 192, + "px": [754,130], + "fieldInstances": [], + "__worldX": 754, + "__worldY": 130 + }, + { + "__identifier": "Coin", + "__grid": [223,110], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "60b65070-d380-11f0-8c50-3b7861f4afae", + "width": 18, + "height": 18, + "defUid": 192, + "px": [894,442], + "fieldInstances": [], + "__worldX": 894, + "__worldY": 442 + }, + { + "__identifier": "Coin", + "__grid": [191,82], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "620a47b0-d380-11f0-8c50-d35c233a202e", + "width": 18, + "height": 18, + "defUid": 192, + "px": [766,330], + "fieldInstances": [], + "__worldX": 766, + "__worldY": 330 + }, + { + "__identifier": "Coin", + "__grid": [232,165], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "63760cb0-d380-11f0-8c50-412f99fa06fb", + "width": 18, + "height": 18, + "defUid": 192, + "px": [930,662], + "fieldInstances": [], + "__worldX": 930, + "__worldY": 662 + }, + { + "__identifier": "Coin", + "__grid": [10,236], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "661e7060-d380-11f0-8c50-2b6841643e82", + "width": 18, + "height": 18, + "defUid": 192, + "px": [42,946], + "fieldInstances": [], + "__worldX": 42, + "__worldY": 946 + }, + { + "__identifier": "Coin", + "__grid": [61,235], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "672a3b10-d380-11f0-8c50-5b5a32b08555", + "width": 18, + "height": 18, + "defUid": 192, + "px": [246,942], + "fieldInstances": [], + "__worldX": 246, + "__worldY": 942 + }, + { + "__identifier": "Coin", + "__grid": [112,235], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "69c7f060-d380-11f0-8c50-7f9a3ec5a2a9", + "width": 18, + "height": 18, + "defUid": 192, + "px": [450,942], + "fieldInstances": [], + "__worldX": 450, + "__worldY": 942 + }, + { + "__identifier": "Coin", + "__grid": [208,204], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 1, "x": 198, "y": 126, "w": 18, "h": 18 }, + "__smartColor": "#E5EB08", + "iid": "6cf49f40-d380-11f0-8c50-dd815cc55c9d", + "width": 18, + "height": 18, + "defUid": 192, + "px": [834,818], + "fieldInstances": [], + "__worldX": 834, + "__worldY": 818 + }, + { + "__identifier": "Start", + "__grid": [44,203], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 24, "y": 0, "w": 24, "h": 24 }, + "__smartColor": "#4CBE2F", + "iid": "d3d65b90-d380-11f0-99ec-6ba27ee57174", + "width": 24, + "height": 24, + "defUid": 181, + "px": [178,814], + "fieldInstances": [], + "__worldX": 178, + "__worldY": 814 + }, + { + "__identifier": "Start", + "__grid": [205,235], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": { "tilesetUid": 183, "x": 24, "y": 0, "w": 24, "h": 24 }, + "__smartColor": "#4CBE2F", + "iid": "d5b61810-d380-11f0-99ec-55871e1edc52", + "width": 24, + "height": 24, + "defUid": 181, + "px": [822,942], + "fieldInstances": [], + "__worldX": 822, + "__worldY": 942 + } + ] + }, + { + "__identifier": "IntGrid", + "__type": "IntGrid", + "__cWid": 57, + "__cHei": 57, + "__gridSize": 18, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": 1, + "__tilesetRelPath": "../pixel_platformer/tilemap.png", + "iid": "546900d0-d380-11f0-87cf-9d65a3c66d96", + "levelId": 0, + "layerDefUid": 3, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [ + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3, + 3,3,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,0,0,1,1,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3,3,4,3,3,0,0,1,1,0,0,0,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, + 1,1,0,0,0,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,4,0,0,0,0,1,1,0,0,0,0,0,0,0,0,3,3,4, + 3,3,0,0,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,3,4,3,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,1,1,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, + 0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, + 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0, + 0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0, + 0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,3,3,3,3,3,3,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, + 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, + 1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,2,2,2,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,1,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,0,0,3,3,3,3,3,3,3,3,3,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3, + 3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0, + 3,3,3,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, + 0,0,0,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,0,0,0,0, + 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,4,3,3,3,3,0, + 0,0,0,0,1,1,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0, + 0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0, + 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, + 0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ], + "autoLayerTiles": [ + { "px": [18,54], "src": [144,108], "f": 0, "t": 128, "d": [22,172], "a": 1 }, + { "px": [72,54], "src": [90,108], "f": 0, "t": 125, "d": [22,175], "a": 1 }, + { "px": [900,180], "src": [72,126], "f": 0, "t": 144, "d": [22,620], "a": 1 }, + { "px": [972,180], "src": [72,108], "f": 0, "t": 124, "d": [22,624], "a": 1 }, + { "px": [990,180], "src": [72,126], "f": 0, "t": 144, "d": [22,625], "a": 1 }, + { "px": [450,216], "src": [144,108], "f": 0, "t": 128, "d": [22,709], "a": 1 }, + { "px": [432,324], "src": [72,108], "f": 0, "t": 124, "d": [22,1050], "a": 1 }, + { "px": [18,486], "src": [72,126], "f": 0, "t": 144, "d": [22,1540], "a": 1 }, + { "px": [108,486], "src": [72,126], "f": 0, "t": 144, "d": [22,1545], "a": 1 }, + { "px": [144,486], "src": [144,108], "f": 0, "t": 128, "d": [22,1547], "a": 1 }, + { "px": [792,522], "src": [90,108], "f": 0, "t": 125, "d": [22,1697], "a": 1 }, + { "px": [810,522], "src": [90,108], "f": 0, "t": 125, "d": [22,1698], "a": 1 }, + { "px": [612,684], "src": [72,126], "f": 0, "t": 144, "d": [22,2200], "a": 1 }, + { "px": [630,684], "src": [144,108], "f": 0, "t": 128, "d": [22,2201], "a": 1 }, + { "px": [684,756], "src": [90,108], "f": 0, "t": 125, "d": [22,2432], "a": 1 }, + { "px": [90,810], "src": [90,108], "f": 0, "t": 125, "d": [22,2570], "a": 1 }, + { "px": [126,810], "src": [144,108], "f": 0, "t": 128, "d": [22,2572], "a": 1 }, + { "px": [774,810], "src": [72,108], "f": 0, "t": 124, "d": [22,2608], "a": 1 }, + { "px": [810,810], "src": [90,108], "f": 0, "t": 125, "d": [22,2610], "a": 1 }, + { "px": [918,864], "src": [144,108], "f": 0, "t": 128, "d": [22,2787], "a": 1 }, + { "px": [54,936], "src": [144,108], "f": 0, "t": 128, "d": [22,2967], "a": 1 }, + { "px": [108,936], "src": [144,108], "f": 0, "t": 128, "d": [22,2970], "a": 1 }, + { "px": [144,936], "src": [72,108], "f": 0, "t": 124, "d": [22,2972], "a": 1 }, + { "px": [288,936], "src": [72,126], "f": 0, "t": 144, "d": [22,2980], "a": 1 }, + { "px": [378,936], "src": [144,108], "f": 0, "t": 128, "d": [22,2985], "a": 1 }, + { "px": [468,936], "src": [72,126], "f": 0, "t": 144, "d": [22,2990], "a": 1 }, + { "px": [486,936], "src": [144,108], "f": 0, "t": 128, "d": [22,2991], "a": 1 }, + { "px": [558,936], "src": [90,108], "f": 0, "t": 125, "d": [22,2995], "a": 1 }, + { "px": [594,936], "src": [72,126], "f": 0, "t": 144, "d": [22,2997], "a": 1 }, + { "px": [630,936], "src": [72,108], "f": 0, "t": 124, "d": [22,2999], "a": 1 }, + { "px": [648,936], "src": [90,108], "f": 0, "t": 125, "d": [22,3000], "a": 1 }, + { "px": [666,936], "src": [144,108], "f": 0, "t": 128, "d": [22,3001], "a": 1 }, + { "px": [702,936], "src": [72,108], "f": 0, "t": 124, "d": [22,3003], "a": 1 }, + { "px": [864,936], "src": [72,126], "f": 0, "t": 144, "d": [22,3012], "a": 1 }, + { "px": [918,936], "src": [72,108], "f": 0, "t": 124, "d": [22,3015], "a": 1 }, + { "px": [0,72], "src": [36,108], "f": 0, "t": 122, "d": [63,228], "a": 1 }, + { "px": [0,90], "src": [36,108], "f": 0, "t": 122, "d": [63,285], "a": 1 }, + { "px": [1008,198], "src": [36,108], "f": 0, "t": 122, "d": [63,683], "a": 1 }, + { "px": [324,252], "src": [36,108], "f": 0, "t": 122, "d": [63,816], "a": 1 }, + { "px": [432,252], "src": [36,108], "f": 0, "t": 122, "d": [63,822], "a": 1 }, + { "px": [450,252], "src": [36,108], "f": 0, "t": 122, "d": [63,823], "a": 1 }, + { "px": [468,252], "src": [36,108], "f": 0, "t": 122, "d": [63,824], "a": 1 }, + { "px": [486,252], "src": [36,108], "f": 0, "t": 122, "d": [63,825], "a": 1 }, + { "px": [504,252], "src": [36,108], "f": 0, "t": 122, "d": [63,826], "a": 1 }, + { "px": [486,270], "src": [36,108], "f": 0, "t": 122, "d": [63,882], "a": 1 }, + { "px": [504,270], "src": [36,108], "f": 0, "t": 122, "d": [63,883], "a": 1 }, + { "px": [522,270], "src": [36,108], "f": 0, "t": 122, "d": [63,884], "a": 1 }, + { "px": [540,270], "src": [36,108], "f": 0, "t": 122, "d": [63,885], "a": 1 }, + { "px": [504,288], "src": [36,108], "f": 0, "t": 122, "d": [63,940], "a": 1 }, + { "px": [522,288], "src": [36,108], "f": 0, "t": 122, "d": [63,941], "a": 1 }, + { "px": [540,288], "src": [36,108], "f": 0, "t": 122, "d": [63,942], "a": 1 }, + { "px": [504,306], "src": [36,108], "f": 0, "t": 122, "d": [63,997], "a": 1 }, + { "px": [486,324], "src": [36,108], "f": 0, "t": 122, "d": [63,1053], "a": 1 }, + { "px": [468,342], "src": [36,108], "f": 0, "t": 122, "d": [63,1109], "a": 1 }, + { "px": [486,342], "src": [36,108], "f": 0, "t": 122, "d": [63,1110], "a": 1 }, + { "px": [432,360], "src": [36,108], "f": 0, "t": 122, "d": [63,1164], "a": 1 }, + { "px": [450,360], "src": [36,108], "f": 0, "t": 122, "d": [63,1165], "a": 1 }, + { "px": [468,360], "src": [36,108], "f": 0, "t": 122, "d": [63,1166], "a": 1 }, + { "px": [486,360], "src": [36,108], "f": 0, "t": 122, "d": [63,1167], "a": 1 }, + { "px": [396,378], "src": [36,108], "f": 0, "t": 122, "d": [63,1219], "a": 1 }, + { "px": [414,378], "src": [36,108], "f": 0, "t": 122, "d": [63,1220], "a": 1 }, + { "px": [432,378], "src": [36,108], "f": 0, "t": 122, "d": [63,1221], "a": 1 }, + { "px": [450,378], "src": [36,108], "f": 0, "t": 122, "d": [63,1222], "a": 1 }, + { "px": [468,378], "src": [36,108], "f": 0, "t": 122, "d": [63,1223], "a": 1 }, + { "px": [486,378], "src": [36,108], "f": 0, "t": 122, "d": [63,1224], "a": 1 }, + { "px": [0,504], "src": [36,108], "f": 0, "t": 122, "d": [63,1596], "a": 1 }, + { "px": [0,522], "src": [36,108], "f": 0, "t": 122, "d": [63,1653], "a": 1 }, + { "px": [648,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1803], "a": 1 }, + { "px": [666,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1804], "a": 1 }, + { "px": [684,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1805], "a": 1 }, + { "px": [702,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1806], "a": 1 }, + { "px": [720,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1807], "a": 1 }, + { "px": [738,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1808], "a": 1 }, + { "px": [756,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1809], "a": 1 }, + { "px": [774,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1810], "a": 1 }, + { "px": [792,558], "src": [36,108], "f": 0, "t": 122, "d": [63,1811], "a": 1 }, + { "px": [648,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1860], "a": 1 }, + { "px": [666,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1861], "a": 1 }, + { "px": [684,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1862], "a": 1 }, + { "px": [702,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1863], "a": 1 }, + { "px": [720,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1864], "a": 1 }, + { "px": [738,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1865], "a": 1 }, + { "px": [756,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1866], "a": 1 }, + { "px": [774,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1867], "a": 1 }, + { "px": [792,576], "src": [36,108], "f": 0, "t": 122, "d": [63,1868], "a": 1 }, + { "px": [0,954], "src": [36,108], "f": 0, "t": 122, "d": [63,3021], "a": 1 }, + { "px": [1008,954], "src": [36,108], "f": 0, "t": 122, "d": [63,3077], "a": 1 }, + { "px": [0,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3078], "a": 1 }, + { "px": [18,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3079], "a": 1 }, + { "px": [36,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3080], "a": 1 }, + { "px": [54,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3081], "a": 1 }, + { "px": [72,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3082], "a": 1 }, + { "px": [90,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3083], "a": 1 }, + { "px": [108,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3084], "a": 1 }, + { "px": [126,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3085], "a": 1 }, + { "px": [144,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3086], "a": 1 }, + { "px": [162,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3087], "a": 1 }, + { "px": [180,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3088], "a": 1 }, + { "px": [198,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3089], "a": 1 }, + { "px": [216,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3090], "a": 1 }, + { "px": [234,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3091], "a": 1 }, + { "px": [252,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3092], "a": 1 }, + { "px": [270,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3093], "a": 1 }, + { "px": [288,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3094], "a": 1 }, + { "px": [306,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3095], "a": 1 }, + { "px": [324,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3096], "a": 1 }, + { "px": [342,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3097], "a": 1 }, + { "px": [360,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3098], "a": 1 }, + { "px": [378,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3099], "a": 1 }, + { "px": [396,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3100], "a": 1 }, + { "px": [414,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3101], "a": 1 }, + { "px": [432,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3102], "a": 1 }, + { "px": [450,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3103], "a": 1 }, + { "px": [468,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3104], "a": 1 }, + { "px": [486,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3105], "a": 1 }, + { "px": [504,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3106], "a": 1 }, + { "px": [522,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3107], "a": 1 }, + { "px": [540,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3108], "a": 1 }, + { "px": [558,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3109], "a": 1 }, + { "px": [576,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3110], "a": 1 }, + { "px": [594,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3111], "a": 1 }, + { "px": [612,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3112], "a": 1 }, + { "px": [630,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3113], "a": 1 }, + { "px": [648,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3114], "a": 1 }, + { "px": [666,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3115], "a": 1 }, + { "px": [684,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3116], "a": 1 }, + { "px": [702,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3117], "a": 1 }, + { "px": [720,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3118], "a": 1 }, + { "px": [738,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3119], "a": 1 }, + { "px": [756,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3120], "a": 1 }, + { "px": [774,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3121], "a": 1 }, + { "px": [792,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3122], "a": 1 }, + { "px": [810,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3123], "a": 1 }, + { "px": [828,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3124], "a": 1 }, + { "px": [846,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3125], "a": 1 }, + { "px": [864,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3126], "a": 1 }, + { "px": [882,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3127], "a": 1 }, + { "px": [900,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3128], "a": 1 }, + { "px": [918,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3129], "a": 1 }, + { "px": [936,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3130], "a": 1 }, + { "px": [954,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3131], "a": 1 }, + { "px": [972,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3132], "a": 1 }, + { "px": [990,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3133], "a": 1 }, + { "px": [1008,972], "src": [36,108], "f": 0, "t": 122, "d": [63,3134], "a": 1 }, + { "px": [0,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3135], "a": 1 }, + { "px": [18,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3136], "a": 1 }, + { "px": [36,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3137], "a": 1 }, + { "px": [54,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3138], "a": 1 }, + { "px": [72,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3139], "a": 1 }, + { "px": [90,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3140], "a": 1 }, + { "px": [108,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3141], "a": 1 }, + { "px": [126,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3142], "a": 1 }, + { "px": [144,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3143], "a": 1 }, + { "px": [162,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3144], "a": 1 }, + { "px": [180,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3145], "a": 1 }, + { "px": [198,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3146], "a": 1 }, + { "px": [216,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3147], "a": 1 }, + { "px": [234,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3148], "a": 1 }, + { "px": [252,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3149], "a": 1 }, + { "px": [270,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3150], "a": 1 }, + { "px": [288,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3151], "a": 1 }, + { "px": [306,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3152], "a": 1 }, + { "px": [324,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3153], "a": 1 }, + { "px": [342,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3154], "a": 1 }, + { "px": [360,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3155], "a": 1 }, + { "px": [378,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3156], "a": 1 }, + { "px": [396,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3157], "a": 1 }, + { "px": [414,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3158], "a": 1 }, + { "px": [432,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3159], "a": 1 }, + { "px": [450,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3160], "a": 1 }, + { "px": [468,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3161], "a": 1 }, + { "px": [486,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3162], "a": 1 }, + { "px": [504,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3163], "a": 1 }, + { "px": [522,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3164], "a": 1 }, + { "px": [540,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3165], "a": 1 }, + { "px": [558,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3166], "a": 1 }, + { "px": [576,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3167], "a": 1 }, + { "px": [594,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3168], "a": 1 }, + { "px": [612,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3169], "a": 1 }, + { "px": [630,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3170], "a": 1 }, + { "px": [648,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3171], "a": 1 }, + { "px": [666,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3172], "a": 1 }, + { "px": [684,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3173], "a": 1 }, + { "px": [702,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3174], "a": 1 }, + { "px": [720,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3175], "a": 1 }, + { "px": [738,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3176], "a": 1 }, + { "px": [756,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3177], "a": 1 }, + { "px": [774,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3178], "a": 1 }, + { "px": [792,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3179], "a": 1 }, + { "px": [810,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3180], "a": 1 }, + { "px": [828,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3181], "a": 1 }, + { "px": [846,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3182], "a": 1 }, + { "px": [864,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3183], "a": 1 }, + { "px": [882,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3184], "a": 1 }, + { "px": [900,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3185], "a": 1 }, + { "px": [918,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3186], "a": 1 }, + { "px": [936,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3187], "a": 1 }, + { "px": [954,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3188], "a": 1 }, + { "px": [972,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3189], "a": 1 }, + { "px": [990,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3190], "a": 1 }, + { "px": [1008,990], "src": [36,108], "f": 0, "t": 122, "d": [63,3191], "a": 1 }, + { "px": [0,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3192], "a": 1 }, + { "px": [18,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3193], "a": 1 }, + { "px": [36,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3194], "a": 1 }, + { "px": [54,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3195], "a": 1 }, + { "px": [72,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3196], "a": 1 }, + { "px": [90,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3197], "a": 1 }, + { "px": [108,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3198], "a": 1 }, + { "px": [126,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3199], "a": 1 }, + { "px": [144,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3200], "a": 1 }, + { "px": [162,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3201], "a": 1 }, + { "px": [180,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3202], "a": 1 }, + { "px": [198,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3203], "a": 1 }, + { "px": [216,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3204], "a": 1 }, + { "px": [234,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3205], "a": 1 }, + { "px": [252,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3206], "a": 1 }, + { "px": [270,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3207], "a": 1 }, + { "px": [288,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3208], "a": 1 }, + { "px": [306,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3209], "a": 1 }, + { "px": [324,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3210], "a": 1 }, + { "px": [342,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3211], "a": 1 }, + { "px": [360,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3212], "a": 1 }, + { "px": [378,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3213], "a": 1 }, + { "px": [396,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3214], "a": 1 }, + { "px": [414,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3215], "a": 1 }, + { "px": [432,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3216], "a": 1 }, + { "px": [450,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3217], "a": 1 }, + { "px": [468,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3218], "a": 1 }, + { "px": [486,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3219], "a": 1 }, + { "px": [504,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3220], "a": 1 }, + { "px": [522,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3221], "a": 1 }, + { "px": [540,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3222], "a": 1 }, + { "px": [558,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3223], "a": 1 }, + { "px": [576,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3224], "a": 1 }, + { "px": [594,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3225], "a": 1 }, + { "px": [612,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3226], "a": 1 }, + { "px": [630,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3227], "a": 1 }, + { "px": [648,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3228], "a": 1 }, + { "px": [666,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3229], "a": 1 }, + { "px": [684,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3230], "a": 1 }, + { "px": [702,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3231], "a": 1 }, + { "px": [720,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3232], "a": 1 }, + { "px": [738,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3233], "a": 1 }, + { "px": [756,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3234], "a": 1 }, + { "px": [774,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3235], "a": 1 }, + { "px": [792,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3236], "a": 1 }, + { "px": [810,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3237], "a": 1 }, + { "px": [828,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3238], "a": 1 }, + { "px": [846,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3239], "a": 1 }, + { "px": [864,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3240], "a": 1 }, + { "px": [882,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3241], "a": 1 }, + { "px": [900,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3242], "a": 1 }, + { "px": [918,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3243], "a": 1 }, + { "px": [936,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3244], "a": 1 }, + { "px": [954,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3245], "a": 1 }, + { "px": [972,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3246], "a": 1 }, + { "px": [990,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3247], "a": 1 }, + { "px": [1008,1008], "src": [36,108], "f": 0, "t": 122, "d": [63,3248], "a": 1 }, + { "px": [1008,0], "src": [18,108], "f": 0, "t": 121, "d": [62,56], "a": 1 }, + { "px": [1008,18], "src": [18,108], "f": 0, "t": 121, "d": [62,113], "a": 1 }, + { "px": [1008,36], "src": [18,108], "f": 0, "t": 121, "d": [62,170], "a": 1 }, + { "px": [1008,54], "src": [18,108], "f": 0, "t": 121, "d": [62,227], "a": 1 }, + { "px": [1008,72], "src": [18,108], "f": 0, "t": 121, "d": [62,284], "a": 1 }, + { "px": [1008,90], "src": [18,108], "f": 0, "t": 121, "d": [62,341], "a": 1 }, + { "px": [1008,108], "src": [18,108], "f": 0, "t": 121, "d": [62,398], "a": 1 }, + { "px": [1008,126], "src": [18,108], "f": 0, "t": 121, "d": [62,455], "a": 1 }, + { "px": [1008,144], "src": [18,108], "f": 0, "t": 121, "d": [62,512], "a": 1 }, + { "px": [1008,162], "src": [18,108], "f": 0, "t": 121, "d": [62,569], "a": 1 }, + { "px": [1008,180], "src": [18,108], "f": 0, "t": 121, "d": [62,626], "a": 1 }, + { "px": [1008,216], "src": [18,108], "f": 0, "t": 121, "d": [62,740], "a": 1 }, + { "px": [1008,234], "src": [18,108], "f": 0, "t": 121, "d": [62,797], "a": 1 }, + { "px": [306,252], "src": [18,108], "f": 0, "t": 121, "d": [62,815], "a": 1 }, + { "px": [1008,252], "src": [18,108], "f": 0, "t": 121, "d": [62,854], "a": 1 }, + { "px": [306,270], "src": [18,108], "f": 0, "t": 121, "d": [62,872], "a": 1 }, + { "px": [1008,270], "src": [18,108], "f": 0, "t": 121, "d": [62,911], "a": 1 }, + { "px": [306,288], "src": [18,108], "f": 0, "t": 121, "d": [62,929], "a": 1 }, + { "px": [486,288], "src": [18,108], "f": 0, "t": 121, "d": [62,939], "a": 1 }, + { "px": [1008,288], "src": [18,108], "f": 0, "t": 121, "d": [62,968], "a": 1 }, + { "px": [486,306], "src": [18,108], "f": 0, "t": 121, "d": [62,996], "a": 1 }, + { "px": [1008,306], "src": [18,108], "f": 0, "t": 121, "d": [62,1025], "a": 1 }, + { "px": [1008,324], "src": [18,108], "f": 0, "t": 121, "d": [62,1082], "a": 1 }, + { "px": [1008,342], "src": [18,108], "f": 0, "t": 121, "d": [62,1139], "a": 1 }, + { "px": [1008,360], "src": [18,108], "f": 0, "t": 121, "d": [62,1196], "a": 1 }, + { "px": [1008,378], "src": [18,108], "f": 0, "t": 121, "d": [62,1253], "a": 1 }, + { "px": [1008,396], "src": [18,108], "f": 0, "t": 121, "d": [62,1310], "a": 1 }, + { "px": [1008,414], "src": [18,108], "f": 0, "t": 121, "d": [62,1367], "a": 1 }, + { "px": [1008,432], "src": [18,108], "f": 0, "t": 121, "d": [62,1424], "a": 1 }, + { "px": [1008,450], "src": [18,108], "f": 0, "t": 121, "d": [62,1481], "a": 1 }, + { "px": [1008,468], "src": [18,108], "f": 0, "t": 121, "d": [62,1538], "a": 1 }, + { "px": [1008,486], "src": [18,108], "f": 0, "t": 121, "d": [62,1595], "a": 1 }, + { "px": [1008,504], "src": [18,108], "f": 0, "t": 121, "d": [62,1652], "a": 1 }, + { "px": [1008,522], "src": [18,108], "f": 0, "t": 121, "d": [62,1709], "a": 1 }, + { "px": [1008,540], "src": [18,108], "f": 0, "t": 121, "d": [62,1766], "a": 1 }, + { "px": [630,558], "src": [18,108], "f": 0, "t": 121, "d": [62,1802], "a": 1 }, + { "px": [1008,558], "src": [18,108], "f": 0, "t": 121, "d": [62,1823], "a": 1 }, + { "px": [630,576], "src": [18,108], "f": 0, "t": 121, "d": [62,1859], "a": 1 }, + { "px": [1008,576], "src": [18,108], "f": 0, "t": 121, "d": [62,1880], "a": 1 }, + { "px": [1008,594], "src": [18,108], "f": 0, "t": 121, "d": [62,1937], "a": 1 }, + { "px": [1008,612], "src": [18,108], "f": 0, "t": 121, "d": [62,1994], "a": 1 }, + { "px": [1008,630], "src": [18,108], "f": 0, "t": 121, "d": [62,2051], "a": 1 }, + { "px": [1008,648], "src": [18,108], "f": 0, "t": 121, "d": [62,2108], "a": 1 }, + { "px": [1008,666], "src": [18,108], "f": 0, "t": 121, "d": [62,2165], "a": 1 }, + { "px": [1008,684], "src": [18,108], "f": 0, "t": 121, "d": [62,2222], "a": 1 }, + { "px": [1008,702], "src": [18,108], "f": 0, "t": 121, "d": [62,2279], "a": 1 }, + { "px": [1008,720], "src": [18,108], "f": 0, "t": 121, "d": [62,2336], "a": 1 }, + { "px": [1008,738], "src": [18,108], "f": 0, "t": 121, "d": [62,2393], "a": 1 }, + { "px": [1008,756], "src": [18,108], "f": 0, "t": 121, "d": [62,2450], "a": 1 }, + { "px": [1008,774], "src": [18,108], "f": 0, "t": 121, "d": [62,2507], "a": 1 }, + { "px": [1008,792], "src": [18,108], "f": 0, "t": 121, "d": [62,2564], "a": 1 }, + { "px": [1008,810], "src": [18,108], "f": 0, "t": 121, "d": [62,2621], "a": 1 }, + { "px": [1008,828], "src": [18,108], "f": 0, "t": 121, "d": [62,2678], "a": 1 }, + { "px": [1008,846], "src": [18,108], "f": 0, "t": 121, "d": [62,2735], "a": 1 }, + { "px": [1008,864], "src": [18,108], "f": 0, "t": 121, "d": [62,2792], "a": 1 }, + { "px": [1008,882], "src": [18,108], "f": 0, "t": 121, "d": [62,2849], "a": 1 }, + { "px": [1008,900], "src": [18,108], "f": 0, "t": 121, "d": [62,2906], "a": 1 }, + { "px": [1008,918], "src": [18,108], "f": 0, "t": 121, "d": [62,2963], "a": 1 }, + { "px": [1008,936], "src": [18,108], "f": 0, "t": 121, "d": [62,3020], "a": 1 }, + { "px": [18,90], "src": [36,126], "f": 0, "t": 142, "d": [61,286], "a": 1 }, + { "px": [36,90], "src": [36,126], "f": 0, "t": 142, "d": [61,287], "a": 1 }, + { "px": [54,90], "src": [36,126], "f": 0, "t": 142, "d": [61,288], "a": 1 }, + { "px": [72,90], "src": [36,126], "f": 0, "t": 142, "d": [61,289], "a": 1 }, + { "px": [342,252], "src": [36,126], "f": 0, "t": 142, "d": [61,817], "a": 1 }, + { "px": [360,252], "src": [36,126], "f": 0, "t": 142, "d": [61,818], "a": 1 }, + { "px": [378,252], "src": [36,126], "f": 0, "t": 142, "d": [61,819], "a": 1 }, + { "px": [396,252], "src": [36,126], "f": 0, "t": 142, "d": [61,820], "a": 1 }, + { "px": [414,252], "src": [36,126], "f": 0, "t": 142, "d": [61,821], "a": 1 }, + { "px": [450,270], "src": [36,126], "f": 0, "t": 142, "d": [61,880], "a": 1 }, + { "px": [468,270], "src": [36,126], "f": 0, "t": 142, "d": [61,881], "a": 1 }, + { "px": [324,306], "src": [36,126], "f": 0, "t": 142, "d": [61,987], "a": 1 }, + { "px": [522,306], "src": [36,126], "f": 0, "t": 142, "d": [61,998], "a": 1 }, + { "px": [540,306], "src": [36,126], "f": 0, "t": 142, "d": [61,999], "a": 1 }, + { "px": [342,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1273], "a": 1 }, + { "px": [360,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1274], "a": 1 }, + { "px": [378,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1275], "a": 1 }, + { "px": [396,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1276], "a": 1 }, + { "px": [414,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1277], "a": 1 }, + { "px": [432,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1278], "a": 1 }, + { "px": [450,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1279], "a": 1 }, + { "px": [468,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1280], "a": 1 }, + { "px": [486,396], "src": [36,126], "f": 0, "t": 142, "d": [61,1281], "a": 1 }, + { "px": [18,522], "src": [36,126], "f": 0, "t": 142, "d": [61,1654], "a": 1 }, + { "px": [36,522], "src": [36,126], "f": 0, "t": 142, "d": [61,1655], "a": 1 }, + { "px": [54,522], "src": [36,126], "f": 0, "t": 142, "d": [61,1656], "a": 1 }, + { "px": [72,522], "src": [36,126], "f": 0, "t": 142, "d": [61,1657], "a": 1 }, + { "px": [648,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1917], "a": 1 }, + { "px": [666,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1918], "a": 1 }, + { "px": [684,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1919], "a": 1 }, + { "px": [702,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1920], "a": 1 }, + { "px": [720,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1921], "a": 1 }, + { "px": [738,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1922], "a": 1 }, + { "px": [756,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1923], "a": 1 }, + { "px": [774,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1924], "a": 1 }, + { "px": [792,594], "src": [36,126], "f": 0, "t": 142, "d": [61,1925], "a": 1 }, + { "px": [108,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2685], "a": 1 }, + { "px": [126,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2686], "a": 1 }, + { "px": [144,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2687], "a": 1 }, + { "px": [162,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2688], "a": 1 }, + { "px": [180,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2689], "a": 1 }, + { "px": [198,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2690], "a": 1 }, + { "px": [774,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2722], "a": 1 }, + { "px": [792,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2723], "a": 1 }, + { "px": [810,846], "src": [36,126], "f": 0, "t": 142, "d": [61,2724], "a": 1 }, + { "px": [0,0], "src": [54,108], "f": 0, "t": 123, "d": [60,0], "a": 1 }, + { "px": [0,18], "src": [54,108], "f": 0, "t": 123, "d": [60,57], "a": 1 }, + { "px": [0,36], "src": [54,108], "f": 0, "t": 123, "d": [60,114], "a": 1 }, + { "px": [0,54], "src": [54,108], "f": 0, "t": 123, "d": [60,171], "a": 1 }, + { "px": [0,108], "src": [54,108], "f": 0, "t": 123, "d": [60,342], "a": 1 }, + { "px": [0,126], "src": [54,108], "f": 0, "t": 123, "d": [60,399], "a": 1 }, + { "px": [0,144], "src": [54,108], "f": 0, "t": 123, "d": [60,456], "a": 1 }, + { "px": [0,162], "src": [54,108], "f": 0, "t": 123, "d": [60,513], "a": 1 }, + { "px": [0,180], "src": [54,108], "f": 0, "t": 123, "d": [60,570], "a": 1 }, + { "px": [0,198], "src": [54,108], "f": 0, "t": 123, "d": [60,627], "a": 1 }, + { "px": [0,216], "src": [54,108], "f": 0, "t": 123, "d": [60,684], "a": 1 }, + { "px": [0,234], "src": [54,108], "f": 0, "t": 123, "d": [60,741], "a": 1 }, + { "px": [0,252], "src": [54,108], "f": 0, "t": 123, "d": [60,798], "a": 1 }, + { "px": [0,270], "src": [54,108], "f": 0, "t": 123, "d": [60,855], "a": 1 }, + { "px": [324,270], "src": [54,108], "f": 0, "t": 123, "d": [60,873], "a": 1 }, + { "px": [558,270], "src": [54,108], "f": 0, "t": 123, "d": [60,886], "a": 1 }, + { "px": [0,288], "src": [54,108], "f": 0, "t": 123, "d": [60,912], "a": 1 }, + { "px": [324,288], "src": [54,108], "f": 0, "t": 123, "d": [60,930], "a": 1 }, + { "px": [558,288], "src": [54,108], "f": 0, "t": 123, "d": [60,943], "a": 1 }, + { "px": [0,306], "src": [54,108], "f": 0, "t": 123, "d": [60,969], "a": 1 }, + { "px": [0,324], "src": [54,108], "f": 0, "t": 123, "d": [60,1026], "a": 1 }, + { "px": [504,324], "src": [54,108], "f": 0, "t": 123, "d": [60,1054], "a": 1 }, + { "px": [0,342], "src": [54,108], "f": 0, "t": 123, "d": [60,1083], "a": 1 }, + { "px": [504,342], "src": [54,108], "f": 0, "t": 123, "d": [60,1111], "a": 1 }, + { "px": [0,360], "src": [54,108], "f": 0, "t": 123, "d": [60,1140], "a": 1 }, + { "px": [504,360], "src": [54,108], "f": 0, "t": 123, "d": [60,1168], "a": 1 }, + { "px": [0,378], "src": [54,108], "f": 0, "t": 123, "d": [60,1197], "a": 1 }, + { "px": [504,378], "src": [54,108], "f": 0, "t": 123, "d": [60,1225], "a": 1 }, + { "px": [0,396], "src": [54,108], "f": 0, "t": 123, "d": [60,1254], "a": 1 }, + { "px": [0,414], "src": [54,108], "f": 0, "t": 123, "d": [60,1311], "a": 1 }, + { "px": [0,432], "src": [54,108], "f": 0, "t": 123, "d": [60,1368], "a": 1 }, + { "px": [0,450], "src": [54,108], "f": 0, "t": 123, "d": [60,1425], "a": 1 }, + { "px": [0,468], "src": [54,108], "f": 0, "t": 123, "d": [60,1482], "a": 1 }, + { "px": [0,486], "src": [54,108], "f": 0, "t": 123, "d": [60,1539], "a": 1 }, + { "px": [0,540], "src": [54,108], "f": 0, "t": 123, "d": [60,1710], "a": 1 }, + { "px": [0,558], "src": [54,108], "f": 0, "t": 123, "d": [60,1767], "a": 1 }, + { "px": [810,558], "src": [54,108], "f": 0, "t": 123, "d": [60,1812], "a": 1 }, + { "px": [0,576], "src": [54,108], "f": 0, "t": 123, "d": [60,1824], "a": 1 }, + { "px": [810,576], "src": [54,108], "f": 0, "t": 123, "d": [60,1869], "a": 1 }, + { "px": [0,594], "src": [54,108], "f": 0, "t": 123, "d": [60,1881], "a": 1 }, + { "px": [0,612], "src": [54,108], "f": 0, "t": 123, "d": [60,1938], "a": 1 }, + { "px": [0,630], "src": [54,108], "f": 0, "t": 123, "d": [60,1995], "a": 1 }, + { "px": [0,648], "src": [54,108], "f": 0, "t": 123, "d": [60,2052], "a": 1 }, + { "px": [0,666], "src": [54,108], "f": 0, "t": 123, "d": [60,2109], "a": 1 }, + { "px": [0,684], "src": [54,108], "f": 0, "t": 123, "d": [60,2166], "a": 1 }, + { "px": [0,702], "src": [54,108], "f": 0, "t": 123, "d": [60,2223], "a": 1 }, + { "px": [0,720], "src": [54,108], "f": 0, "t": 123, "d": [60,2280], "a": 1 }, + { "px": [0,738], "src": [54,108], "f": 0, "t": 123, "d": [60,2337], "a": 1 }, + { "px": [0,756], "src": [54,108], "f": 0, "t": 123, "d": [60,2394], "a": 1 }, + { "px": [0,774], "src": [54,108], "f": 0, "t": 123, "d": [60,2451], "a": 1 }, + { "px": [0,792], "src": [54,108], "f": 0, "t": 123, "d": [60,2508], "a": 1 }, + { "px": [0,810], "src": [54,108], "f": 0, "t": 123, "d": [60,2565], "a": 1 }, + { "px": [0,828], "src": [54,108], "f": 0, "t": 123, "d": [60,2622], "a": 1 }, + { "px": [0,846], "src": [54,108], "f": 0, "t": 123, "d": [60,2679], "a": 1 }, + { "px": [0,864], "src": [54,108], "f": 0, "t": 123, "d": [60,2736], "a": 1 }, + { "px": [0,882], "src": [54,108], "f": 0, "t": 123, "d": [60,2793], "a": 1 }, + { "px": [0,900], "src": [54,108], "f": 0, "t": 123, "d": [60,2850], "a": 1 }, + { "px": [0,918], "src": [54,108], "f": 0, "t": 123, "d": [60,2907], "a": 1 }, + { "px": [0,936], "src": [54,108], "f": 0, "t": 123, "d": [60,2964], "a": 1 }, + { "px": [18,72], "src": [36,18], "f": 0, "t": 22, "d": [59,229], "a": 1 }, + { "px": [36,72], "src": [36,18], "f": 0, "t": 22, "d": [59,230], "a": 1 }, + { "px": [54,72], "src": [36,18], "f": 0, "t": 22, "d": [59,231], "a": 1 }, + { "px": [72,72], "src": [36,18], "f": 0, "t": 22, "d": [59,232], "a": 1 }, + { "px": [306,234], "src": [36,18], "f": 0, "t": 22, "d": [59,758], "a": 1 }, + { "px": [324,234], "src": [36,18], "f": 0, "t": 22, "d": [59,759], "a": 1 }, + { "px": [342,234], "src": [36,18], "f": 0, "t": 22, "d": [59,760], "a": 1 }, + { "px": [360,234], "src": [36,18], "f": 0, "t": 22, "d": [59,761], "a": 1 }, + { "px": [378,234], "src": [36,18], "f": 0, "t": 22, "d": [59,762], "a": 1 }, + { "px": [396,234], "src": [36,18], "f": 0, "t": 22, "d": [59,763], "a": 1 }, + { "px": [414,234], "src": [36,18], "f": 0, "t": 22, "d": [59,764], "a": 1 }, + { "px": [432,234], "src": [36,18], "f": 0, "t": 22, "d": [59,765], "a": 1 }, + { "px": [450,234], "src": [36,18], "f": 0, "t": 22, "d": [59,766], "a": 1 }, + { "px": [468,234], "src": [36,18], "f": 0, "t": 22, "d": [59,767], "a": 1 }, + { "px": [486,234], "src": [36,18], "f": 0, "t": 22, "d": [59,768], "a": 1 }, + { "px": [522,252], "src": [36,18], "f": 0, "t": 22, "d": [59,827], "a": 1 }, + { "px": [540,252], "src": [36,18], "f": 0, "t": 22, "d": [59,828], "a": 1 }, + { "px": [558,252], "src": [36,18], "f": 0, "t": 22, "d": [59,829], "a": 1 }, + { "px": [450,342], "src": [36,18], "f": 0, "t": 22, "d": [59,1108], "a": 1 }, + { "px": [414,360], "src": [36,18], "f": 0, "t": 22, "d": [59,1163], "a": 1 }, + { "px": [360,378], "src": [36,18], "f": 0, "t": 22, "d": [59,1217], "a": 1 }, + { "px": [378,378], "src": [36,18], "f": 0, "t": 22, "d": [59,1218], "a": 1 }, + { "px": [18,504], "src": [36,18], "f": 0, "t": 22, "d": [59,1597], "a": 1 }, + { "px": [36,504], "src": [36,18], "f": 0, "t": 22, "d": [59,1598], "a": 1 }, + { "px": [54,504], "src": [36,18], "f": 0, "t": 22, "d": [59,1599], "a": 1 }, + { "px": [72,504], "src": [36,18], "f": 0, "t": 22, "d": [59,1600], "a": 1 }, + { "px": [90,504], "src": [36,18], "f": 0, "t": 22, "d": [59,1601], "a": 1 }, + { "px": [630,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1745], "a": 1 }, + { "px": [648,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1746], "a": 1 }, + { "px": [666,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1747], "a": 1 }, + { "px": [684,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1748], "a": 1 }, + { "px": [702,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1749], "a": 1 }, + { "px": [720,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1750], "a": 1 }, + { "px": [738,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1751], "a": 1 }, + { "px": [756,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1752], "a": 1 }, + { "px": [774,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1753], "a": 1 }, + { "px": [792,540], "src": [36,18], "f": 0, "t": 22, "d": [59,1754], "a": 1 }, + { "px": [108,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2628], "a": 1 }, + { "px": [126,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2629], "a": 1 }, + { "px": [144,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2630], "a": 1 }, + { "px": [162,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2631], "a": 1 }, + { "px": [180,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2632], "a": 1 }, + { "px": [198,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2633], "a": 1 }, + { "px": [774,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2665], "a": 1 }, + { "px": [792,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2666], "a": 1 }, + { "px": [810,828], "src": [36,18], "f": 0, "t": 22, "d": [59,2667], "a": 1 }, + { "px": [18,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3022], "a": 1 }, + { "px": [36,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3023], "a": 1 }, + { "px": [54,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3024], "a": 1 }, + { "px": [72,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3025], "a": 1 }, + { "px": [90,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3026], "a": 1 }, + { "px": [108,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3027], "a": 1 }, + { "px": [126,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3028], "a": 1 }, + { "px": [144,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3029], "a": 1 }, + { "px": [162,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3030], "a": 1 }, + { "px": [180,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3031], "a": 1 }, + { "px": [198,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3032], "a": 1 }, + { "px": [216,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3033], "a": 1 }, + { "px": [234,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3034], "a": 1 }, + { "px": [252,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3035], "a": 1 }, + { "px": [270,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3036], "a": 1 }, + { "px": [288,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3037], "a": 1 }, + { "px": [306,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3038], "a": 1 }, + { "px": [324,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3039], "a": 1 }, + { "px": [342,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3040], "a": 1 }, + { "px": [360,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3041], "a": 1 }, + { "px": [378,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3042], "a": 1 }, + { "px": [396,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3043], "a": 1 }, + { "px": [414,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3044], "a": 1 }, + { "px": [432,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3045], "a": 1 }, + { "px": [450,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3046], "a": 1 }, + { "px": [468,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3047], "a": 1 }, + { "px": [486,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3048], "a": 1 }, + { "px": [504,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3049], "a": 1 }, + { "px": [522,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3050], "a": 1 }, + { "px": [540,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3051], "a": 1 }, + { "px": [558,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3052], "a": 1 }, + { "px": [576,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3053], "a": 1 }, + { "px": [594,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3054], "a": 1 }, + { "px": [612,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3055], "a": 1 }, + { "px": [630,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3056], "a": 1 }, + { "px": [648,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3057], "a": 1 }, + { "px": [666,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3058], "a": 1 }, + { "px": [684,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3059], "a": 1 }, + { "px": [702,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3060], "a": 1 }, + { "px": [720,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3061], "a": 1 }, + { "px": [738,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3062], "a": 1 }, + { "px": [756,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3063], "a": 1 }, + { "px": [774,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3064], "a": 1 }, + { "px": [792,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3065], "a": 1 }, + { "px": [810,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3066], "a": 1 }, + { "px": [828,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3067], "a": 1 }, + { "px": [846,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3068], "a": 1 }, + { "px": [864,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3069], "a": 1 }, + { "px": [882,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3070], "a": 1 }, + { "px": [900,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3071], "a": 1 }, + { "px": [918,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3072], "a": 1 }, + { "px": [936,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3073], "a": 1 }, + { "px": [954,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3074], "a": 1 }, + { "px": [972,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3075], "a": 1 }, + { "px": [990,954], "src": [36,18], "f": 0, "t": 22, "d": [59,3076], "a": 1 }, + { "px": [432,270], "src": [18,126], "f": 0, "t": 141, "d": [58,879], "a": 1 }, + { "px": [306,306], "src": [18,126], "f": 0, "t": 141, "d": [58,986], "a": 1 }, + { "px": [630,594], "src": [18,126], "f": 0, "t": 141, "d": [58,1916], "a": 1 }, + { "px": [90,846], "src": [18,126], "f": 0, "t": 141, "d": [58,2684], "a": 1 }, + { "px": [756,846], "src": [18,126], "f": 0, "t": 141, "d": [58,2721], "a": 1 }, + { "px": [90,90], "src": [54,126], "f": 0, "t": 143, "d": [57,290], "a": 1 }, + { "px": [558,306], "src": [54,126], "f": 0, "t": 143, "d": [57,1000], "a": 1 }, + { "px": [504,396], "src": [54,126], "f": 0, "t": 143, "d": [57,1282], "a": 1 }, + { "px": [90,522], "src": [54,126], "f": 0, "t": 143, "d": [57,1658], "a": 1 }, + { "px": [810,594], "src": [54,126], "f": 0, "t": 143, "d": [57,1926], "a": 1 }, + { "px": [216,846], "src": [54,126], "f": 0, "t": 143, "d": [57,2691], "a": 1 }, + { "px": [828,846], "src": [54,126], "f": 0, "t": 143, "d": [57,2725], "a": 1 }, + { "px": [90,72], "src": [54,18], "f": 0, "t": 23, "d": [56,233], "a": 1 }, + { "px": [504,234], "src": [54,18], "f": 0, "t": 23, "d": [56,769], "a": 1 }, + { "px": [810,540], "src": [54,18], "f": 0, "t": 23, "d": [56,1755], "a": 1 }, + { "px": [216,828], "src": [54,18], "f": 0, "t": 23, "d": [56,2634], "a": 1 }, + { "px": [828,828], "src": [54,18], "f": 0, "t": 23, "d": [56,2668], "a": 1 }, + { "px": [468,324], "src": [18,18], "f": 0, "t": 21, "d": [55,1052], "a": 1 }, + { "px": [432,342], "src": [18,18], "f": 0, "t": 21, "d": [55,1107], "a": 1 }, + { "px": [396,360], "src": [18,18], "f": 0, "t": 21, "d": [55,1162], "a": 1 }, + { "px": [342,378], "src": [18,18], "f": 0, "t": 21, "d": [55,1216], "a": 1 }, + { "px": [90,828], "src": [18,18], "f": 0, "t": 21, "d": [55,2627], "a": 1 }, + { "px": [756,828], "src": [18,18], "f": 0, "t": 21, "d": [55,2664], "a": 1 }, + { "px": [864,198], "src": [36,0], "f": 0, "t": 2, "d": [54,675], "a": 1 }, + { "px": [882,198], "src": [36,0], "f": 0, "t": 2, "d": [54,676], "a": 1 }, + { "px": [900,198], "src": [36,0], "f": 0, "t": 2, "d": [54,677], "a": 1 }, + { "px": [918,198], "src": [36,0], "f": 0, "t": 2, "d": [54,678], "a": 1 }, + { "px": [936,198], "src": [36,0], "f": 0, "t": 2, "d": [54,679], "a": 1 }, + { "px": [954,198], "src": [36,0], "f": 0, "t": 2, "d": [54,680], "a": 1 }, + { "px": [972,198], "src": [36,0], "f": 0, "t": 2, "d": [54,681], "a": 1 }, + { "px": [990,198], "src": [36,0], "f": 0, "t": 2, "d": [54,682], "a": 1 }, + { "px": [198,234], "src": [36,0], "f": 0, "t": 2, "d": [54,752], "a": 1 }, + { "px": [216,234], "src": [36,0], "f": 0, "t": 2, "d": [54,753], "a": 1 }, + { "px": [234,234], "src": [36,0], "f": 0, "t": 2, "d": [54,754], "a": 1 }, + { "px": [252,234], "src": [36,0], "f": 0, "t": 2, "d": [54,755], "a": 1 }, + { "px": [270,234], "src": [36,0], "f": 0, "t": 2, "d": [54,756], "a": 1 }, + { "px": [288,234], "src": [36,0], "f": 0, "t": 2, "d": [54,757], "a": 1 }, + { "px": [576,252], "src": [36,0], "f": 0, "t": 2, "d": [54,830], "a": 1 }, + { "px": [594,252], "src": [36,0], "f": 0, "t": 2, "d": [54,831], "a": 1 }, + { "px": [612,252], "src": [36,0], "f": 0, "t": 2, "d": [54,832], "a": 1 }, + { "px": [630,252], "src": [36,0], "f": 0, "t": 2, "d": [54,833], "a": 1 }, + { "px": [342,306], "src": [36,0], "f": 0, "t": 2, "d": [54,988], "a": 1 }, + { "px": [306,396], "src": [36,0], "f": 0, "t": 2, "d": [54,1271], "a": 1 }, + { "px": [324,396], "src": [36,0], "f": 0, "t": 2, "d": [54,1272], "a": 1 }, + { "px": [108,504], "src": [36,0], "f": 0, "t": 2, "d": [54,1602], "a": 1 }, + { "px": [126,504], "src": [36,0], "f": 0, "t": 2, "d": [54,1603], "a": 1 }, + { "px": [144,504], "src": [36,0], "f": 0, "t": 2, "d": [54,1604], "a": 1 }, + { "px": [162,504], "src": [36,0], "f": 0, "t": 2, "d": [54,1605], "a": 1 }, + { "px": [180,504], "src": [36,0], "f": 0, "t": 2, "d": [54,1606], "a": 1 }, + { "px": [558,540], "src": [36,0], "f": 0, "t": 2, "d": [54,1741], "a": 1 }, + { "px": [576,540], "src": [36,0], "f": 0, "t": 2, "d": [54,1742], "a": 1 }, + { "px": [594,540], "src": [36,0], "f": 0, "t": 2, "d": [54,1743], "a": 1 }, + { "px": [612,540], "src": [36,0], "f": 0, "t": 2, "d": [54,1744], "a": 1 }, + { "px": [630,702], "src": [36,0], "f": 0, "t": 2, "d": [54,2258], "a": 1 }, + { "px": [648,702], "src": [36,0], "f": 0, "t": 2, "d": [54,2259], "a": 1 }, + { "px": [702,774], "src": [36,0], "f": 0, "t": 2, "d": [54,2490], "a": 1 }, + { "px": [918,882], "src": [36,0], "f": 0, "t": 2, "d": [54,2844], "a": 1 }, + { "px": [936,882], "src": [36,0], "f": 0, "t": 2, "d": [54,2845], "a": 1 }, + { "px": [306,900], "src": [36,0], "f": 0, "t": 2, "d": [54,2867], "a": 1 }, + { "px": [324,900], "src": [36,0], "f": 0, "t": 2, "d": [54,2868], "a": 1 }, + { "px": [648,252], "src": [54,0], "f": 0, "t": 3, "d": [53,834], "a": 1 }, + { "px": [360,306], "src": [54,0], "f": 0, "t": 3, "d": [53,989], "a": 1 }, + { "px": [198,504], "src": [54,0], "f": 0, "t": 3, "d": [53,1607], "a": 1 }, + { "px": [666,702], "src": [54,0], "f": 0, "t": 3, "d": [53,2260], "a": 1 }, + { "px": [720,774], "src": [54,0], "f": 0, "t": 3, "d": [53,2491], "a": 1 }, + { "px": [954,882], "src": [54,0], "f": 0, "t": 3, "d": [53,2846], "a": 1 }, + { "px": [342,900], "src": [54,0], "f": 0, "t": 3, "d": [53,2869], "a": 1 }, + { "px": [846,198], "src": [18,0], "f": 0, "t": 1, "d": [52,674], "a": 1 }, + { "px": [180,234], "src": [18,0], "f": 0, "t": 1, "d": [52,751], "a": 1 }, + { "px": [288,396], "src": [18,0], "f": 0, "t": 1, "d": [52,1270], "a": 1 }, + { "px": [540,540], "src": [18,0], "f": 0, "t": 1, "d": [52,1740], "a": 1 }, + { "px": [612,702], "src": [18,0], "f": 0, "t": 1, "d": [52,2257], "a": 1 }, + { "px": [684,774], "src": [18,0], "f": 0, "t": 1, "d": [52,2489], "a": 1 }, + { "px": [900,882], "src": [18,0], "f": 0, "t": 1, "d": [52,2843], "a": 1 }, + { "px": [288,900], "src": [18,0], "f": 0, "t": 1, "d": [52,2866], "a": 1 }, + { "px": [738,144], "src": [252,126], "f": 0, "t": 154, "d": [43,497], "a": 1 }, + { "px": [756,144], "src": [252,126], "f": 0, "t": 154, "d": [43,498], "a": 1 }, + { "px": [360,540], "src": [252,126], "f": 0, "t": 154, "d": [43,1730], "a": 1 }, + { "px": [378,540], "src": [252,126], "f": 0, "t": 154, "d": [43,1731], "a": 1 }, + { "px": [396,540], "src": [252,126], "f": 0, "t": 154, "d": [43,1732], "a": 1 }, + { "px": [414,540], "src": [252,126], "f": 0, "t": 154, "d": [43,1733], "a": 1 }, + { "px": [270,576], "src": [252,126], "f": 0, "t": 154, "d": [43,1839], "a": 1 }, + { "px": [180,648], "src": [252,126], "f": 0, "t": 154, "d": [43,2062], "a": 1 }, + { "px": [198,648], "src": [252,126], "f": 0, "t": 154, "d": [43,2063], "a": 1 }, + { "px": [216,648], "src": [252,126], "f": 0, "t": 154, "d": [43,2064], "a": 1 }, + { "px": [900,666], "src": [252,126], "f": 0, "t": 154, "d": [43,2159], "a": 1 }, + { "px": [918,666], "src": [252,126], "f": 0, "t": 154, "d": [43,2160], "a": 1 }, + { "px": [936,666], "src": [252,126], "f": 0, "t": 154, "d": [43,2161], "a": 1 }, + { "px": [324,702], "src": [252,126], "f": 0, "t": 154, "d": [43,2241], "a": 1 }, + { "px": [342,702], "src": [252,126], "f": 0, "t": 154, "d": [43,2242], "a": 1 }, + { "px": [360,702], "src": [252,126], "f": 0, "t": 154, "d": [43,2243], "a": 1 }, + { "px": [774,144], "src": [270,126], "f": 0, "t": 155, "d": [42,499], "a": 1 }, + { "px": [432,540], "src": [270,126], "f": 0, "t": 155, "d": [42,1734], "a": 1 }, + { "px": [288,576], "src": [270,126], "f": 0, "t": 155, "d": [42,1840], "a": 1 }, + { "px": [234,648], "src": [270,126], "f": 0, "t": 155, "d": [42,2065], "a": 1 }, + { "px": [954,666], "src": [270,126], "f": 0, "t": 155, "d": [42,2162], "a": 1 }, + { "px": [378,702], "src": [270,126], "f": 0, "t": 155, "d": [42,2244], "a": 1 }, + { "px": [720,144], "src": [234,126], "f": 0, "t": 153, "d": [41,496], "a": 1 }, + { "px": [342,540], "src": [234,126], "f": 0, "t": 153, "d": [41,1729], "a": 1 }, + { "px": [252,576], "src": [234,126], "f": 0, "t": 153, "d": [41,1838], "a": 1 }, + { "px": [162,648], "src": [234,126], "f": 0, "t": 153, "d": [41,2061], "a": 1 }, + { "px": [882,666], "src": [234,126], "f": 0, "t": 153, "d": [41,2158], "a": 1 }, + { "px": [306,702], "src": [234,126], "f": 0, "t": 153, "d": [41,2240], "a": 1 }, + { "px": [684,198], "src": [288,126], "f": 0, "t": 156, "d": [40,665], "a": 1 }, + { "px": [252,414], "src": [288,126], "f": 0, "t": 156, "d": [40,1325], "a": 1 }, + { "px": [198,450], "src": [288,126], "f": 0, "t": 156, "d": [40,1436], "a": 1 }, + { "px": [252,756], "src": [288,126], "f": 0, "t": 156, "d": [40,2408], "a": 1 }, + { "px": [900,90], "src": [324,18], "f": 0, "t": 38, "d": [165,335], "a": 1 }, + { "px": [936,90], "src": [324,18], "f": 0, "t": 38, "d": [165,337], "a": 1 }, + { "px": [180,144], "src": [324,18], "f": 0, "t": 38, "d": [165,466], "a": 1 }, + { "px": [216,144], "src": [324,18], "f": 0, "t": 38, "d": [165,468], "a": 1 }, + { "px": [450,702], "src": [324,18], "f": 0, "t": 38, "d": [165,2248], "a": 1 }, + { "px": [468,702], "src": [324,18], "f": 0, "t": 38, "d": [165,2249], "a": 1 }, + { "px": [486,702], "src": [324,18], "f": 0, "t": 38, "d": [165,2250], "a": 1 }, + { "px": [504,702], "src": [324,18], "f": 0, "t": 38, "d": [165,2251], "a": 1 }, + { "px": [522,702], "src": [324,18], "f": 0, "t": 38, "d": [165,2252], "a": 1 }, + { "px": [540,702], "src": [324,18], "f": 0, "t": 38, "d": [165,2253], "a": 1 }, + { "px": [558,702], "src": [324,18], "f": 0, "t": 38, "d": [165,2254], "a": 1 }, + { "px": [450,720], "src": [324,18], "f": 0, "t": 38, "d": [165,2305], "a": 1 }, + { "px": [468,720], "src": [324,18], "f": 0, "t": 38, "d": [165,2306], "a": 1 }, + { "px": [486,720], "src": [324,18], "f": 0, "t": 38, "d": [165,2307], "a": 1 }, + { "px": [504,720], "src": [324,18], "f": 0, "t": 38, "d": [165,2308], "a": 1 }, + { "px": [522,720], "src": [324,18], "f": 0, "t": 38, "d": [165,2309], "a": 1 }, + { "px": [540,720], "src": [324,18], "f": 0, "t": 38, "d": [165,2310], "a": 1 }, + { "px": [558,720], "src": [324,18], "f": 0, "t": 38, "d": [165,2311], "a": 1 }, + { "px": [450,738], "src": [324,18], "f": 0, "t": 38, "d": [165,2362], "a": 1 }, + { "px": [468,738], "src": [324,18], "f": 0, "t": 38, "d": [165,2363], "a": 1 }, + { "px": [486,738], "src": [324,18], "f": 0, "t": 38, "d": [165,2364], "a": 1 }, + { "px": [504,738], "src": [324,18], "f": 0, "t": 38, "d": [165,2365], "a": 1 }, + { "px": [522,738], "src": [324,18], "f": 0, "t": 38, "d": [165,2366], "a": 1 }, + { "px": [540,738], "src": [324,18], "f": 0, "t": 38, "d": [165,2367], "a": 1 }, + { "px": [558,738], "src": [324,18], "f": 0, "t": 38, "d": [165,2368], "a": 1 }, + { "px": [450,756], "src": [324,18], "f": 0, "t": 38, "d": [165,2419], "a": 1 }, + { "px": [468,756], "src": [324,18], "f": 0, "t": 38, "d": [165,2420], "a": 1 }, + { "px": [486,756], "src": [324,18], "f": 0, "t": 38, "d": [165,2421], "a": 1 }, + { "px": [522,756], "src": [324,18], "f": 0, "t": 38, "d": [165,2423], "a": 1 }, + { "px": [540,756], "src": [324,18], "f": 0, "t": 38, "d": [165,2424], "a": 1 }, + { "px": [558,756], "src": [324,18], "f": 0, "t": 38, "d": [165,2425], "a": 1 }, + { "px": [882,90], "src": [306,18], "f": 0, "t": 37, "d": [164,334], "a": 1 }, + { "px": [162,144], "src": [306,18], "f": 0, "t": 37, "d": [164,465], "a": 1 }, + { "px": [432,702], "src": [306,18], "f": 0, "t": 37, "d": [164,2247], "a": 1 }, + { "px": [432,720], "src": [306,18], "f": 0, "t": 37, "d": [164,2304], "a": 1 }, + { "px": [432,738], "src": [306,18], "f": 0, "t": 37, "d": [164,2361], "a": 1 }, + { "px": [432,756], "src": [306,18], "f": 0, "t": 37, "d": [164,2418], "a": 1 }, + { "px": [450,774], "src": [324,36], "f": 0, "t": 58, "d": [163,2476], "a": 1 }, + { "px": [468,774], "src": [324,36], "f": 0, "t": 58, "d": [163,2477], "a": 1 }, + { "px": [540,774], "src": [324,36], "f": 0, "t": 58, "d": [163,2481], "a": 1 }, + { "px": [558,774], "src": [324,36], "f": 0, "t": 58, "d": [163,2482], "a": 1 }, + { "px": [954,90], "src": [342,18], "f": 0, "t": 39, "d": [162,338], "a": 1 }, + { "px": [234,144], "src": [342,18], "f": 0, "t": 39, "d": [162,469], "a": 1 }, + { "px": [576,702], "src": [342,18], "f": 0, "t": 39, "d": [162,2255], "a": 1 }, + { "px": [576,720], "src": [342,18], "f": 0, "t": 39, "d": [162,2312], "a": 1 }, + { "px": [576,738], "src": [342,18], "f": 0, "t": 39, "d": [162,2369], "a": 1 }, + { "px": [576,756], "src": [342,18], "f": 0, "t": 39, "d": [162,2426], "a": 1 }, + { "px": [900,72], "src": [324,0], "f": 0, "t": 18, "d": [161,278], "a": 1 }, + { "px": [918,72], "src": [324,0], "f": 0, "t": 18, "d": [161,279], "a": 1 }, + { "px": [936,72], "src": [324,0], "f": 0, "t": 18, "d": [161,280], "a": 1 }, + { "px": [180,126], "src": [324,0], "f": 0, "t": 18, "d": [161,409], "a": 1 }, + { "px": [198,126], "src": [324,0], "f": 0, "t": 18, "d": [161,410], "a": 1 }, + { "px": [216,126], "src": [324,0], "f": 0, "t": 18, "d": [161,411], "a": 1 }, + { "px": [450,684], "src": [324,0], "f": 0, "t": 18, "d": [161,2191], "a": 1 }, + { "px": [468,684], "src": [324,0], "f": 0, "t": 18, "d": [161,2192], "a": 1 }, + { "px": [486,684], "src": [324,0], "f": 0, "t": 18, "d": [161,2193], "a": 1 }, + { "px": [504,684], "src": [324,0], "f": 0, "t": 18, "d": [161,2194], "a": 1 }, + { "px": [522,684], "src": [324,0], "f": 0, "t": 18, "d": [161,2195], "a": 1 }, + { "px": [540,684], "src": [324,0], "f": 0, "t": 18, "d": [161,2196], "a": 1 }, + { "px": [558,684], "src": [324,0], "f": 0, "t": 18, "d": [161,2197], "a": 1 }, + { "px": [792,738], "src": [324,0], "f": 0, "t": 18, "d": [161,2381], "a": 1 }, + { "px": [882,108], "src": [306,36], "f": 0, "t": 57, "d": [160,391], "a": 1 }, + { "px": [162,162], "src": [306,36], "f": 0, "t": 57, "d": [160,522], "a": 1 }, + { "px": [774,756], "src": [306,36], "f": 0, "t": 57, "d": [160,2437], "a": 1 }, + { "px": [432,774], "src": [306,36], "f": 0, "t": 57, "d": [160,2475], "a": 1 }, + { "px": [954,108], "src": [342,36], "f": 0, "t": 59, "d": [159,395], "a": 1 }, + { "px": [234,162], "src": [342,36], "f": 0, "t": 59, "d": [159,526], "a": 1 }, + { "px": [810,756], "src": [342,36], "f": 0, "t": 59, "d": [159,2439], "a": 1 }, + { "px": [576,774], "src": [342,36], "f": 0, "t": 59, "d": [159,2483], "a": 1 }, + { "px": [954,72], "src": [342,0], "f": 0, "t": 19, "d": [158,281], "a": 1 }, + { "px": [234,126], "src": [342,0], "f": 0, "t": 19, "d": [158,412], "a": 1 }, + { "px": [324,162], "src": [342,0], "f": 0, "t": 19, "d": [158,531], "a": 1 }, + { "px": [576,684], "src": [342,0], "f": 0, "t": 19, "d": [158,2198], "a": 1 }, + { "px": [810,738], "src": [342,0], "f": 0, "t": 19, "d": [158,2382], "a": 1 }, + { "px": [882,72], "src": [306,0], "f": 0, "t": 17, "d": [157,277], "a": 1 }, + { "px": [162,126], "src": [306,0], "f": 0, "t": 17, "d": [157,408], "a": 1 }, + { "px": [288,162], "src": [306,0], "f": 0, "t": 17, "d": [157,529], "a": 1 }, + { "px": [432,684], "src": [306,0], "f": 0, "t": 17, "d": [157,2190], "a": 1 }, + { "px": [774,738], "src": [306,0], "f": 0, "t": 17, "d": [157,2380], "a": 1 }, + { "px": [738,342], "src": [324,54], "f": 0, "t": 78, "d": [153,1124], "a": 1 }, + { "px": [756,342], "src": [324,54], "f": 0, "t": 78, "d": [153,1125], "a": 1 }, + { "px": [774,342], "src": [324,54], "f": 0, "t": 78, "d": [153,1126], "a": 1 }, + { "px": [864,450], "src": [324,54], "f": 0, "t": 78, "d": [153,1473], "a": 1 }, + { "px": [882,450], "src": [324,54], "f": 0, "t": 78, "d": [153,1474], "a": 1 }, + { "px": [900,450], "src": [324,54], "f": 0, "t": 78, "d": [153,1475], "a": 1 }, + { "px": [918,450], "src": [324,54], "f": 0, "t": 78, "d": [153,1476], "a": 1 }, + { "px": [792,342], "src": [342,54], "f": 0, "t": 79, "d": [152,1127], "a": 1 }, + { "px": [936,450], "src": [342,54], "f": 0, "t": 79, "d": [152,1477], "a": 1 }, + { "px": [720,342], "src": [306,54], "f": 0, "t": 77, "d": [151,1123], "a": 1 }, + { "px": [846,450], "src": [306,54], "f": 0, "t": 77, "d": [151,1472], "a": 1 }, + { "px": [684,288], "src": [288,0], "f": 0, "t": 16, "d": [150,950], "a": 1 }, + { "px": [846,378], "src": [288,0], "f": 0, "t": 16, "d": [150,1244], "a": 1 }, + { "px": [774,486], "src": [288,0], "f": 0, "t": 16, "d": [150,1582], "a": 1 }, + { "px": [918,180], "src": [306,108], "f": 0, "t": 137, "d": [175,621], "a": 1 }, + { "px": [198,216], "src": [306,108], "f": 0, "t": 137, "d": [175,695], "a": 1 }, + { "px": [306,216], "src": [306,108], "f": 0, "t": 137, "d": [175,701], "a": 1 }, + { "px": [792,810], "src": [306,108], "f": 0, "t": 137, "d": [175,2609], "a": 1 }, + { "px": [504,936], "src": [306,108], "f": 0, "t": 137, "d": [175,2992], "a": 1 }, + { "px": [918,126], "src": [288,72], "f": 0, "t": 96, "d": [166,450], "a": 1 }, + { "px": [918,144], "src": [288,90], "f": 0, "t": 116, "d": [166,507], "a": 1 }, + { "px": [918,162], "src": [288,90], "f": 0, "t": 116, "d": [166,564], "a": 1 }, + { "px": [198,180], "src": [288,72], "f": 0, "t": 96, "d": [166,581], "a": 1 }, + { "px": [198,198], "src": [288,90], "f": 0, "t": 116, "d": [166,638], "a": 1 }, + { "px": [306,198], "src": [288,90], "f": 0, "t": 116, "d": [166,644], "a": 1 }, + { "px": [792,774], "src": [288,90], "f": 0, "t": 116, "d": [166,2495], "a": 1 }, + { "px": [504,792], "src": [288,90], "f": 0, "t": 116, "d": [166,2536], "a": 1 }, + { "px": [792,792], "src": [288,72], "f": 0, "t": 96, "d": [166,2552], "a": 1 }, + { "px": [504,810], "src": [288,72], "f": 0, "t": 96, "d": [166,2593], "a": 1 }, + { "px": [504,828], "src": [288,72], "f": 0, "t": 96, "d": [166,2650], "a": 1 }, + { "px": [504,846], "src": [288,90], "f": 0, "t": 116, "d": [166,2707], "a": 1 }, + { "px": [504,864], "src": [288,72], "f": 0, "t": 96, "d": [166,2764], "a": 1 }, + { "px": [504,882], "src": [288,72], "f": 0, "t": 96, "d": [166,2821], "a": 1 }, + { "px": [504,900], "src": [288,72], "f": 0, "t": 96, "d": [166,2878], "a": 1 }, + { "px": [504,918], "src": [288,72], "f": 0, "t": 96, "d": [166,2935], "a": 1 }, + { "px": [918,108], "src": [306,72], "f": 0, "t": 97, "d": [117,393], "a": 1 }, + { "px": [198,162], "src": [306,72], "f": 0, "t": 97, "d": [117,524], "a": 1 }, + { "px": [306,180], "src": [306,72], "f": 0, "t": 97, "d": [117,587], "a": 1 }, + { "px": [504,774], "src": [306,72], "f": 0, "t": 97, "d": [117,2479], "a": 1 }, + { "px": [306,162], "src": [324,0], "f": 0, "t": 18, "d": [174,530], "a": 1 }, + { "px": [918,90], "src": [324,18], "f": 0, "t": 38, "d": [173,336], "a": 1 }, + { "px": [198,144], "src": [324,18], "f": 0, "t": 38, "d": [173,467], "a": 1 }, + { "px": [504,756], "src": [324,18], "f": 0, "t": 38, "d": [173,2422], "a": 1 }, + { "px": [792,756], "src": [324,18], "f": 0, "t": 38, "d": [173,2438], "a": 1 }, + { "px": [324,180], "src": [342,36], "f": 0, "t": 59, "d": [171,588], "a": 1 }, + { "px": [936,108], "src": [324,36], "f": 0, "t": 58, "d": [170,394], "a": 1 }, + { "px": [216,162], "src": [324,36], "f": 0, "t": 58, "d": [170,525], "a": 1 }, + { "px": [522,774], "src": [324,36], "f": 0, "t": 58, "d": [170,2480], "a": 1 }, + { "px": [288,180], "src": [306,36], "f": 0, "t": 57, "d": [172,586], "a": 1 }, + { "px": [900,108], "src": [324,36], "f": 0, "t": 58, "d": [167,392], "a": 1 }, + { "px": [180,162], "src": [324,36], "f": 0, "t": 58, "d": [167,523], "a": 1 }, + { "px": [486,774], "src": [324,36], "f": 0, "t": 58, "d": [167,2478], "a": 1 } + ], + "seed": 2107805, + "overrideTilesetUid": null, + "gridTiles": [], + "entityInstances": [] + }, + { + "__identifier": "Background", + "__type": "Tiles", + "__cWid": 43, + "__cHei": 43, + "__gridSize": 24, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": 2, + "__tilesetRelPath": "../pixel_platformer/backgrounds.png", + "iid": "1196c220-d380-11f0-8c50-6362bd330b3b", + "levelId": 0, + "layerDefUid": 180, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [], + "autoLayerTiles": [], + "seed": 4198490, + "overrideTilesetUid": null, + "gridTiles": [ + { "px": [0,0], "src": [0,0], "f": 0, "t": 0, "d": [0], "a": 1 }, + { "px": [24,0], "src": [24,0], "f": 0, "t": 1, "d": [1], "a": 1 }, + { "px": [48,0], "src": [48,0], "f": 0, "t": 2, "d": [2], "a": 1 }, + { "px": [72,0], "src": [72,0], "f": 0, "t": 3, "d": [3], "a": 1 }, + { "px": [96,0], "src": [0,0], "f": 0, "t": 0, "d": [4], "a": 1 }, + { "px": [120,0], "src": [24,0], "f": 0, "t": 1, "d": [5], "a": 1 }, + { "px": [144,0], "src": [48,0], "f": 0, "t": 2, "d": [6], "a": 1 }, + { "px": [168,0], "src": [72,0], "f": 0, "t": 3, "d": [7], "a": 1 }, + { "px": [192,0], "src": [0,0], "f": 0, "t": 0, "d": [8], "a": 1 }, + { "px": [216,0], "src": [24,0], "f": 0, "t": 1, "d": [9], "a": 1 }, + { "px": [240,0], "src": [48,0], "f": 0, "t": 2, "d": [10], "a": 1 }, + { "px": [264,0], "src": [72,0], "f": 0, "t": 3, "d": [11], "a": 1 }, + { "px": [288,0], "src": [0,0], "f": 0, "t": 0, "d": [12], "a": 1 }, + { "px": [312,0], "src": [24,0], "f": 0, "t": 1, "d": [13], "a": 1 }, + { "px": [336,0], "src": [48,0], "f": 0, "t": 2, "d": [14], "a": 1 }, + { "px": [360,0], "src": [72,0], "f": 0, "t": 3, "d": [15], "a": 1 }, + { "px": [384,0], "src": [0,0], "f": 0, "t": 0, "d": [16], "a": 1 }, + { "px": [408,0], "src": [24,0], "f": 0, "t": 1, "d": [17], "a": 1 }, + { "px": [432,0], "src": [48,0], "f": 0, "t": 2, "d": [18], "a": 1 }, + { "px": [456,0], "src": [72,0], "f": 0, "t": 3, "d": [19], "a": 1 }, + { "px": [480,0], "src": [0,0], "f": 0, "t": 0, "d": [20], "a": 1 }, + { "px": [504,0], "src": [24,0], "f": 0, "t": 1, "d": [21], "a": 1 }, + { "px": [528,0], "src": [48,0], "f": 0, "t": 2, "d": [22], "a": 1 }, + { "px": [552,0], "src": [72,0], "f": 0, "t": 3, "d": [23], "a": 1 }, + { "px": [576,0], "src": [0,0], "f": 0, "t": 0, "d": [24], "a": 1 }, + { "px": [600,0], "src": [24,0], "f": 0, "t": 1, "d": [25], "a": 1 }, + { "px": [624,0], "src": [48,0], "f": 0, "t": 2, "d": [26], "a": 1 }, + { "px": [648,0], "src": [72,0], "f": 0, "t": 3, "d": [27], "a": 1 }, + { "px": [672,0], "src": [0,0], "f": 0, "t": 0, "d": [28], "a": 1 }, + { "px": [696,0], "src": [24,0], "f": 0, "t": 1, "d": [29], "a": 1 }, + { "px": [720,0], "src": [48,0], "f": 0, "t": 2, "d": [30], "a": 1 }, + { "px": [744,0], "src": [72,0], "f": 0, "t": 3, "d": [31], "a": 1 }, + { "px": [768,0], "src": [0,0], "f": 0, "t": 0, "d": [32], "a": 1 }, + { "px": [792,0], "src": [24,0], "f": 0, "t": 1, "d": [33], "a": 1 }, + { "px": [816,0], "src": [48,0], "f": 0, "t": 2, "d": [34], "a": 1 }, + { "px": [840,0], "src": [72,0], "f": 0, "t": 3, "d": [35], "a": 1 }, + { "px": [864,0], "src": [0,0], "f": 0, "t": 0, "d": [36], "a": 1 }, + { "px": [888,0], "src": [24,0], "f": 0, "t": 1, "d": [37], "a": 1 }, + { "px": [912,0], "src": [48,0], "f": 0, "t": 2, "d": [38], "a": 1 }, + { "px": [936,0], "src": [72,0], "f": 0, "t": 3, "d": [39], "a": 1 }, + { "px": [960,0], "src": [0,0], "f": 0, "t": 0, "d": [40], "a": 1 }, + { "px": [984,0], "src": [24,0], "f": 0, "t": 1, "d": [41], "a": 1 }, + { "px": [1008,0], "src": [48,0], "f": 0, "t": 2, "d": [42], "a": 1 }, + { "px": [0,24], "src": [0,0], "f": 0, "t": 0, "d": [43], "a": 1 }, + { "px": [24,24], "src": [24,0], "f": 0, "t": 1, "d": [44], "a": 1 }, + { "px": [48,24], "src": [48,0], "f": 0, "t": 2, "d": [45], "a": 1 }, + { "px": [72,24], "src": [72,0], "f": 0, "t": 3, "d": [46], "a": 1 }, + { "px": [96,24], "src": [0,0], "f": 0, "t": 0, "d": [47], "a": 1 }, + { "px": [120,24], "src": [24,0], "f": 0, "t": 1, "d": [48], "a": 1 }, + { "px": [144,24], "src": [48,0], "f": 0, "t": 2, "d": [49], "a": 1 }, + { "px": [168,24], "src": [72,0], "f": 0, "t": 3, "d": [50], "a": 1 }, + { "px": [192,24], "src": [0,0], "f": 0, "t": 0, "d": [51], "a": 1 }, + { "px": [216,24], "src": [24,0], "f": 0, "t": 1, "d": [52], "a": 1 }, + { "px": [240,24], "src": [48,0], "f": 0, "t": 2, "d": [53], "a": 1 }, + { "px": [264,24], "src": [72,0], "f": 0, "t": 3, "d": [54], "a": 1 }, + { "px": [288,24], "src": [0,0], "f": 0, "t": 0, "d": [55], "a": 1 }, + { "px": [312,24], "src": [24,0], "f": 0, "t": 1, "d": [56], "a": 1 }, + { "px": [336,24], "src": [48,0], "f": 0, "t": 2, "d": [57], "a": 1 }, + { "px": [360,24], "src": [72,0], "f": 0, "t": 3, "d": [58], "a": 1 }, + { "px": [384,24], "src": [0,0], "f": 0, "t": 0, "d": [59], "a": 1 }, + { "px": [408,24], "src": [24,0], "f": 0, "t": 1, "d": [60], "a": 1 }, + { "px": [432,24], "src": [48,0], "f": 0, "t": 2, "d": [61], "a": 1 }, + { "px": [456,24], "src": [72,0], "f": 0, "t": 3, "d": [62], "a": 1 }, + { "px": [480,24], "src": [0,0], "f": 0, "t": 0, "d": [63], "a": 1 }, + { "px": [504,24], "src": [24,0], "f": 0, "t": 1, "d": [64], "a": 1 }, + { "px": [528,24], "src": [48,0], "f": 0, "t": 2, "d": [65], "a": 1 }, + { "px": [552,24], "src": [72,0], "f": 0, "t": 3, "d": [66], "a": 1 }, + { "px": [576,24], "src": [0,0], "f": 0, "t": 0, "d": [67], "a": 1 }, + { "px": [600,24], "src": [24,0], "f": 0, "t": 1, "d": [68], "a": 1 }, + { "px": [624,24], "src": [48,0], "f": 0, "t": 2, "d": [69], "a": 1 }, + { "px": [648,24], "src": [72,0], "f": 0, "t": 3, "d": [70], "a": 1 }, + { "px": [672,24], "src": [0,0], "f": 0, "t": 0, "d": [71], "a": 1 }, + { "px": [696,24], "src": [24,0], "f": 0, "t": 1, "d": [72], "a": 1 }, + { "px": [720,24], "src": [48,0], "f": 0, "t": 2, "d": [73], "a": 1 }, + { "px": [744,24], "src": [72,0], "f": 0, "t": 3, "d": [74], "a": 1 }, + { "px": [768,24], "src": [0,0], "f": 0, "t": 0, "d": [75], "a": 1 }, + { "px": [792,24], "src": [24,0], "f": 0, "t": 1, "d": [76], "a": 1 }, + { "px": [816,24], "src": [48,0], "f": 0, "t": 2, "d": [77], "a": 1 }, + { "px": [840,24], "src": [72,0], "f": 0, "t": 3, "d": [78], "a": 1 }, + { "px": [864,24], "src": [0,0], "f": 0, "t": 0, "d": [79], "a": 1 }, + { "px": [888,24], "src": [24,0], "f": 0, "t": 1, "d": [80], "a": 1 }, + { "px": [912,24], "src": [48,0], "f": 0, "t": 2, "d": [81], "a": 1 }, + { "px": [936,24], "src": [72,0], "f": 0, "t": 3, "d": [82], "a": 1 }, + { "px": [960,24], "src": [0,0], "f": 0, "t": 0, "d": [83], "a": 1 }, + { "px": [984,24], "src": [24,0], "f": 0, "t": 1, "d": [84], "a": 1 }, + { "px": [1008,24], "src": [48,0], "f": 0, "t": 2, "d": [85], "a": 1 }, + { "px": [0,48], "src": [0,0], "f": 0, "t": 0, "d": [86], "a": 1 }, + { "px": [24,48], "src": [24,0], "f": 0, "t": 1, "d": [87], "a": 1 }, + { "px": [48,48], "src": [48,0], "f": 0, "t": 2, "d": [88], "a": 1 }, + { "px": [72,48], "src": [72,0], "f": 0, "t": 3, "d": [89], "a": 1 }, + { "px": [96,48], "src": [0,0], "f": 0, "t": 0, "d": [90], "a": 1 }, + { "px": [120,48], "src": [24,0], "f": 0, "t": 1, "d": [91], "a": 1 }, + { "px": [144,48], "src": [48,0], "f": 0, "t": 2, "d": [92], "a": 1 }, + { "px": [168,48], "src": [72,0], "f": 0, "t": 3, "d": [93], "a": 1 }, + { "px": [192,48], "src": [0,0], "f": 0, "t": 0, "d": [94], "a": 1 }, + { "px": [216,48], "src": [24,0], "f": 0, "t": 1, "d": [95], "a": 1 }, + { "px": [240,48], "src": [48,0], "f": 0, "t": 2, "d": [96], "a": 1 }, + { "px": [264,48], "src": [72,0], "f": 0, "t": 3, "d": [97], "a": 1 }, + { "px": [288,48], "src": [0,0], "f": 0, "t": 0, "d": [98], "a": 1 }, + { "px": [312,48], "src": [24,0], "f": 0, "t": 1, "d": [99], "a": 1 }, + { "px": [336,48], "src": [48,0], "f": 0, "t": 2, "d": [100], "a": 1 }, + { "px": [360,48], "src": [72,0], "f": 0, "t": 3, "d": [101], "a": 1 }, + { "px": [384,48], "src": [0,0], "f": 0, "t": 0, "d": [102], "a": 1 }, + { "px": [408,48], "src": [24,0], "f": 0, "t": 1, "d": [103], "a": 1 }, + { "px": [432,48], "src": [48,0], "f": 0, "t": 2, "d": [104], "a": 1 }, + { "px": [456,48], "src": [72,0], "f": 0, "t": 3, "d": [105], "a": 1 }, + { "px": [480,48], "src": [0,0], "f": 0, "t": 0, "d": [106], "a": 1 }, + { "px": [504,48], "src": [24,0], "f": 0, "t": 1, "d": [107], "a": 1 }, + { "px": [528,48], "src": [48,0], "f": 0, "t": 2, "d": [108], "a": 1 }, + { "px": [552,48], "src": [72,0], "f": 0, "t": 3, "d": [109], "a": 1 }, + { "px": [576,48], "src": [0,0], "f": 0, "t": 0, "d": [110], "a": 1 }, + { "px": [600,48], "src": [24,0], "f": 0, "t": 1, "d": [111], "a": 1 }, + { "px": [624,48], "src": [48,0], "f": 0, "t": 2, "d": [112], "a": 1 }, + { "px": [648,48], "src": [72,0], "f": 0, "t": 3, "d": [113], "a": 1 }, + { "px": [672,48], "src": [0,0], "f": 0, "t": 0, "d": [114], "a": 1 }, + { "px": [696,48], "src": [24,0], "f": 0, "t": 1, "d": [115], "a": 1 }, + { "px": [720,48], "src": [48,0], "f": 0, "t": 2, "d": [116], "a": 1 }, + { "px": [744,48], "src": [72,0], "f": 0, "t": 3, "d": [117], "a": 1 }, + { "px": [768,48], "src": [0,0], "f": 0, "t": 0, "d": [118], "a": 1 }, + { "px": [792,48], "src": [24,0], "f": 0, "t": 1, "d": [119], "a": 1 }, + { "px": [816,48], "src": [48,0], "f": 0, "t": 2, "d": [120], "a": 1 }, + { "px": [840,48], "src": [72,0], "f": 0, "t": 3, "d": [121], "a": 1 }, + { "px": [864,48], "src": [0,0], "f": 0, "t": 0, "d": [122], "a": 1 }, + { "px": [888,48], "src": [24,0], "f": 0, "t": 1, "d": [123], "a": 1 }, + { "px": [912,48], "src": [48,0], "f": 0, "t": 2, "d": [124], "a": 1 }, + { "px": [936,48], "src": [72,0], "f": 0, "t": 3, "d": [125], "a": 1 }, + { "px": [960,48], "src": [0,0], "f": 0, "t": 0, "d": [126], "a": 1 }, + { "px": [984,48], "src": [24,0], "f": 0, "t": 1, "d": [127], "a": 1 }, + { "px": [1008,48], "src": [48,0], "f": 0, "t": 2, "d": [128], "a": 1 }, + { "px": [0,72], "src": [0,0], "f": 0, "t": 0, "d": [129], "a": 1 }, + { "px": [24,72], "src": [24,0], "f": 0, "t": 1, "d": [130], "a": 1 }, + { "px": [48,72], "src": [48,0], "f": 0, "t": 2, "d": [131], "a": 1 }, + { "px": [72,72], "src": [72,0], "f": 0, "t": 3, "d": [132], "a": 1 }, + { "px": [96,72], "src": [0,0], "f": 0, "t": 0, "d": [133], "a": 1 }, + { "px": [120,72], "src": [24,0], "f": 0, "t": 1, "d": [134], "a": 1 }, + { "px": [144,72], "src": [48,0], "f": 0, "t": 2, "d": [135], "a": 1 }, + { "px": [168,72], "src": [72,0], "f": 0, "t": 3, "d": [136], "a": 1 }, + { "px": [192,72], "src": [0,0], "f": 0, "t": 0, "d": [137], "a": 1 }, + { "px": [216,72], "src": [24,0], "f": 0, "t": 1, "d": [138], "a": 1 }, + { "px": [240,72], "src": [48,0], "f": 0, "t": 2, "d": [139], "a": 1 }, + { "px": [264,72], "src": [72,0], "f": 0, "t": 3, "d": [140], "a": 1 }, + { "px": [288,72], "src": [0,0], "f": 0, "t": 0, "d": [141], "a": 1 }, + { "px": [312,72], "src": [24,0], "f": 0, "t": 1, "d": [142], "a": 1 }, + { "px": [336,72], "src": [48,0], "f": 0, "t": 2, "d": [143], "a": 1 }, + { "px": [360,72], "src": [72,0], "f": 0, "t": 3, "d": [144], "a": 1 }, + { "px": [384,72], "src": [0,0], "f": 0, "t": 0, "d": [145], "a": 1 }, + { "px": [408,72], "src": [24,0], "f": 0, "t": 1, "d": [146], "a": 1 }, + { "px": [432,72], "src": [48,0], "f": 0, "t": 2, "d": [147], "a": 1 }, + { "px": [456,72], "src": [72,0], "f": 0, "t": 3, "d": [148], "a": 1 }, + { "px": [480,72], "src": [0,0], "f": 0, "t": 0, "d": [149], "a": 1 }, + { "px": [504,72], "src": [24,0], "f": 0, "t": 1, "d": [150], "a": 1 }, + { "px": [528,72], "src": [48,0], "f": 0, "t": 2, "d": [151], "a": 1 }, + { "px": [552,72], "src": [72,0], "f": 0, "t": 3, "d": [152], "a": 1 }, + { "px": [576,72], "src": [0,0], "f": 0, "t": 0, "d": [153], "a": 1 }, + { "px": [600,72], "src": [24,0], "f": 0, "t": 1, "d": [154], "a": 1 }, + { "px": [624,72], "src": [48,0], "f": 0, "t": 2, "d": [155], "a": 1 }, + { "px": [648,72], "src": [72,0], "f": 0, "t": 3, "d": [156], "a": 1 }, + { "px": [672,72], "src": [0,0], "f": 0, "t": 0, "d": [157], "a": 1 }, + { "px": [696,72], "src": [24,0], "f": 0, "t": 1, "d": [158], "a": 1 }, + { "px": [720,72], "src": [48,0], "f": 0, "t": 2, "d": [159], "a": 1 }, + { "px": [744,72], "src": [72,0], "f": 0, "t": 3, "d": [160], "a": 1 }, + { "px": [768,72], "src": [0,0], "f": 0, "t": 0, "d": [161], "a": 1 }, + { "px": [792,72], "src": [24,0], "f": 0, "t": 1, "d": [162], "a": 1 }, + { "px": [816,72], "src": [48,0], "f": 0, "t": 2, "d": [163], "a": 1 }, + { "px": [840,72], "src": [72,0], "f": 0, "t": 3, "d": [164], "a": 1 }, + { "px": [864,72], "src": [0,0], "f": 0, "t": 0, "d": [165], "a": 1 }, + { "px": [888,72], "src": [24,0], "f": 0, "t": 1, "d": [166], "a": 1 }, + { "px": [912,72], "src": [48,0], "f": 0, "t": 2, "d": [167], "a": 1 }, + { "px": [936,72], "src": [72,0], "f": 0, "t": 3, "d": [168], "a": 1 }, + { "px": [960,72], "src": [0,0], "f": 0, "t": 0, "d": [169], "a": 1 }, + { "px": [984,72], "src": [24,0], "f": 0, "t": 1, "d": [170], "a": 1 }, + { "px": [1008,72], "src": [48,0], "f": 0, "t": 2, "d": [171], "a": 1 }, + { "px": [0,96], "src": [0,0], "f": 0, "t": 0, "d": [172], "a": 1 }, + { "px": [24,96], "src": [24,0], "f": 0, "t": 1, "d": [173], "a": 1 }, + { "px": [48,96], "src": [48,0], "f": 0, "t": 2, "d": [174], "a": 1 }, + { "px": [72,96], "src": [72,0], "f": 0, "t": 3, "d": [175], "a": 1 }, + { "px": [96,96], "src": [0,0], "f": 0, "t": 0, "d": [176], "a": 1 }, + { "px": [120,96], "src": [24,0], "f": 0, "t": 1, "d": [177], "a": 1 }, + { "px": [144,96], "src": [48,0], "f": 0, "t": 2, "d": [178], "a": 1 }, + { "px": [168,96], "src": [72,0], "f": 0, "t": 3, "d": [179], "a": 1 }, + { "px": [192,96], "src": [0,0], "f": 0, "t": 0, "d": [180], "a": 1 }, + { "px": [216,96], "src": [24,0], "f": 0, "t": 1, "d": [181], "a": 1 }, + { "px": [240,96], "src": [48,0], "f": 0, "t": 2, "d": [182], "a": 1 }, + { "px": [264,96], "src": [72,0], "f": 0, "t": 3, "d": [183], "a": 1 }, + { "px": [288,96], "src": [0,0], "f": 0, "t": 0, "d": [184], "a": 1 }, + { "px": [312,96], "src": [24,0], "f": 0, "t": 1, "d": [185], "a": 1 }, + { "px": [336,96], "src": [48,0], "f": 0, "t": 2, "d": [186], "a": 1 }, + { "px": [360,96], "src": [72,0], "f": 0, "t": 3, "d": [187], "a": 1 }, + { "px": [384,96], "src": [0,0], "f": 0, "t": 0, "d": [188], "a": 1 }, + { "px": [408,96], "src": [24,0], "f": 0, "t": 1, "d": [189], "a": 1 }, + { "px": [432,96], "src": [48,0], "f": 0, "t": 2, "d": [190], "a": 1 }, + { "px": [456,96], "src": [72,0], "f": 0, "t": 3, "d": [191], "a": 1 }, + { "px": [480,96], "src": [0,0], "f": 0, "t": 0, "d": [192], "a": 1 }, + { "px": [504,96], "src": [24,0], "f": 0, "t": 1, "d": [193], "a": 1 }, + { "px": [528,96], "src": [48,0], "f": 0, "t": 2, "d": [194], "a": 1 }, + { "px": [552,96], "src": [72,0], "f": 0, "t": 3, "d": [195], "a": 1 }, + { "px": [576,96], "src": [0,0], "f": 0, "t": 0, "d": [196], "a": 1 }, + { "px": [600,96], "src": [24,0], "f": 0, "t": 1, "d": [197], "a": 1 }, + { "px": [624,96], "src": [48,0], "f": 0, "t": 2, "d": [198], "a": 1 }, + { "px": [648,96], "src": [72,0], "f": 0, "t": 3, "d": [199], "a": 1 }, + { "px": [672,96], "src": [0,0], "f": 0, "t": 0, "d": [200], "a": 1 }, + { "px": [696,96], "src": [24,0], "f": 0, "t": 1, "d": [201], "a": 1 }, + { "px": [720,96], "src": [48,0], "f": 0, "t": 2, "d": [202], "a": 1 }, + { "px": [744,96], "src": [72,0], "f": 0, "t": 3, "d": [203], "a": 1 }, + { "px": [768,96], "src": [0,0], "f": 0, "t": 0, "d": [204], "a": 1 }, + { "px": [792,96], "src": [24,0], "f": 0, "t": 1, "d": [205], "a": 1 }, + { "px": [816,96], "src": [48,0], "f": 0, "t": 2, "d": [206], "a": 1 }, + { "px": [840,96], "src": [72,0], "f": 0, "t": 3, "d": [207], "a": 1 }, + { "px": [864,96], "src": [0,0], "f": 0, "t": 0, "d": [208], "a": 1 }, + { "px": [888,96], "src": [24,0], "f": 0, "t": 1, "d": [209], "a": 1 }, + { "px": [912,96], "src": [48,0], "f": 0, "t": 2, "d": [210], "a": 1 }, + { "px": [936,96], "src": [72,0], "f": 0, "t": 3, "d": [211], "a": 1 }, + { "px": [960,96], "src": [0,0], "f": 0, "t": 0, "d": [212], "a": 1 }, + { "px": [984,96], "src": [24,0], "f": 0, "t": 1, "d": [213], "a": 1 }, + { "px": [1008,96], "src": [48,0], "f": 0, "t": 2, "d": [214], "a": 1 }, + { "px": [0,120], "src": [0,0], "f": 0, "t": 0, "d": [215], "a": 1 }, + { "px": [24,120], "src": [24,0], "f": 0, "t": 1, "d": [216], "a": 1 }, + { "px": [48,120], "src": [48,0], "f": 0, "t": 2, "d": [217], "a": 1 }, + { "px": [72,120], "src": [72,0], "f": 0, "t": 3, "d": [218], "a": 1 }, + { "px": [96,120], "src": [0,0], "f": 0, "t": 0, "d": [219], "a": 1 }, + { "px": [120,120], "src": [24,0], "f": 0, "t": 1, "d": [220], "a": 1 }, + { "px": [144,120], "src": [48,0], "f": 0, "t": 2, "d": [221], "a": 1 }, + { "px": [168,120], "src": [72,0], "f": 0, "t": 3, "d": [222], "a": 1 }, + { "px": [192,120], "src": [0,0], "f": 0, "t": 0, "d": [223], "a": 1 }, + { "px": [216,120], "src": [24,0], "f": 0, "t": 1, "d": [224], "a": 1 }, + { "px": [240,120], "src": [48,0], "f": 0, "t": 2, "d": [225], "a": 1 }, + { "px": [264,120], "src": [72,0], "f": 0, "t": 3, "d": [226], "a": 1 }, + { "px": [288,120], "src": [0,0], "f": 0, "t": 0, "d": [227], "a": 1 }, + { "px": [312,120], "src": [24,0], "f": 0, "t": 1, "d": [228], "a": 1 }, + { "px": [336,120], "src": [48,0], "f": 0, "t": 2, "d": [229], "a": 1 }, + { "px": [360,120], "src": [72,0], "f": 0, "t": 3, "d": [230], "a": 1 }, + { "px": [384,120], "src": [0,0], "f": 0, "t": 0, "d": [231], "a": 1 }, + { "px": [408,120], "src": [24,0], "f": 0, "t": 1, "d": [232], "a": 1 }, + { "px": [432,120], "src": [48,0], "f": 0, "t": 2, "d": [233], "a": 1 }, + { "px": [456,120], "src": [72,0], "f": 0, "t": 3, "d": [234], "a": 1 }, + { "px": [480,120], "src": [0,0], "f": 0, "t": 0, "d": [235], "a": 1 }, + { "px": [504,120], "src": [24,0], "f": 0, "t": 1, "d": [236], "a": 1 }, + { "px": [528,120], "src": [48,0], "f": 0, "t": 2, "d": [237], "a": 1 }, + { "px": [552,120], "src": [72,0], "f": 0, "t": 3, "d": [238], "a": 1 }, + { "px": [576,120], "src": [0,0], "f": 0, "t": 0, "d": [239], "a": 1 }, + { "px": [600,120], "src": [24,0], "f": 0, "t": 1, "d": [240], "a": 1 }, + { "px": [624,120], "src": [48,0], "f": 0, "t": 2, "d": [241], "a": 1 }, + { "px": [648,120], "src": [72,0], "f": 0, "t": 3, "d": [242], "a": 1 }, + { "px": [672,120], "src": [0,0], "f": 0, "t": 0, "d": [243], "a": 1 }, + { "px": [696,120], "src": [24,0], "f": 0, "t": 1, "d": [244], "a": 1 }, + { "px": [720,120], "src": [48,0], "f": 0, "t": 2, "d": [245], "a": 1 }, + { "px": [744,120], "src": [72,0], "f": 0, "t": 3, "d": [246], "a": 1 }, + { "px": [768,120], "src": [0,0], "f": 0, "t": 0, "d": [247], "a": 1 }, + { "px": [792,120], "src": [24,0], "f": 0, "t": 1, "d": [248], "a": 1 }, + { "px": [816,120], "src": [48,0], "f": 0, "t": 2, "d": [249], "a": 1 }, + { "px": [840,120], "src": [72,0], "f": 0, "t": 3, "d": [250], "a": 1 }, + { "px": [864,120], "src": [0,0], "f": 0, "t": 0, "d": [251], "a": 1 }, + { "px": [888,120], "src": [24,0], "f": 0, "t": 1, "d": [252], "a": 1 }, + { "px": [912,120], "src": [48,0], "f": 0, "t": 2, "d": [253], "a": 1 }, + { "px": [936,120], "src": [72,0], "f": 0, "t": 3, "d": [254], "a": 1 }, + { "px": [960,120], "src": [0,0], "f": 0, "t": 0, "d": [255], "a": 1 }, + { "px": [984,120], "src": [24,0], "f": 0, "t": 1, "d": [256], "a": 1 }, + { "px": [1008,120], "src": [48,0], "f": 0, "t": 2, "d": [257], "a": 1 }, + { "px": [0,144], "src": [0,0], "f": 0, "t": 0, "d": [258], "a": 1 }, + { "px": [24,144], "src": [24,0], "f": 0, "t": 1, "d": [259], "a": 1 }, + { "px": [48,144], "src": [48,0], "f": 0, "t": 2, "d": [260], "a": 1 }, + { "px": [72,144], "src": [72,0], "f": 0, "t": 3, "d": [261], "a": 1 }, + { "px": [96,144], "src": [0,0], "f": 0, "t": 0, "d": [262], "a": 1 }, + { "px": [120,144], "src": [24,0], "f": 0, "t": 1, "d": [263], "a": 1 }, + { "px": [144,144], "src": [48,0], "f": 0, "t": 2, "d": [264], "a": 1 }, + { "px": [168,144], "src": [72,0], "f": 0, "t": 3, "d": [265], "a": 1 }, + { "px": [192,144], "src": [0,0], "f": 0, "t": 0, "d": [266], "a": 1 }, + { "px": [216,144], "src": [24,0], "f": 0, "t": 1, "d": [267], "a": 1 }, + { "px": [240,144], "src": [48,0], "f": 0, "t": 2, "d": [268], "a": 1 }, + { "px": [264,144], "src": [72,0], "f": 0, "t": 3, "d": [269], "a": 1 }, + { "px": [288,144], "src": [0,0], "f": 0, "t": 0, "d": [270], "a": 1 }, + { "px": [312,144], "src": [24,0], "f": 0, "t": 1, "d": [271], "a": 1 }, + { "px": [336,144], "src": [48,0], "f": 0, "t": 2, "d": [272], "a": 1 }, + { "px": [360,144], "src": [72,0], "f": 0, "t": 3, "d": [273], "a": 1 }, + { "px": [384,144], "src": [0,0], "f": 0, "t": 0, "d": [274], "a": 1 }, + { "px": [408,144], "src": [24,0], "f": 0, "t": 1, "d": [275], "a": 1 }, + { "px": [432,144], "src": [48,0], "f": 0, "t": 2, "d": [276], "a": 1 }, + { "px": [456,144], "src": [72,0], "f": 0, "t": 3, "d": [277], "a": 1 }, + { "px": [480,144], "src": [0,0], "f": 0, "t": 0, "d": [278], "a": 1 }, + { "px": [504,144], "src": [24,0], "f": 0, "t": 1, "d": [279], "a": 1 }, + { "px": [528,144], "src": [48,0], "f": 0, "t": 2, "d": [280], "a": 1 }, + { "px": [552,144], "src": [72,0], "f": 0, "t": 3, "d": [281], "a": 1 }, + { "px": [576,144], "src": [0,0], "f": 0, "t": 0, "d": [282], "a": 1 }, + { "px": [600,144], "src": [24,0], "f": 0, "t": 1, "d": [283], "a": 1 }, + { "px": [624,144], "src": [48,0], "f": 0, "t": 2, "d": [284], "a": 1 }, + { "px": [648,144], "src": [72,0], "f": 0, "t": 3, "d": [285], "a": 1 }, + { "px": [672,144], "src": [0,0], "f": 0, "t": 0, "d": [286], "a": 1 }, + { "px": [696,144], "src": [24,0], "f": 0, "t": 1, "d": [287], "a": 1 }, + { "px": [720,144], "src": [48,0], "f": 0, "t": 2, "d": [288], "a": 1 }, + { "px": [744,144], "src": [72,0], "f": 0, "t": 3, "d": [289], "a": 1 }, + { "px": [768,144], "src": [0,0], "f": 0, "t": 0, "d": [290], "a": 1 }, + { "px": [792,144], "src": [24,0], "f": 0, "t": 1, "d": [291], "a": 1 }, + { "px": [816,144], "src": [48,0], "f": 0, "t": 2, "d": [292], "a": 1 }, + { "px": [840,144], "src": [72,0], "f": 0, "t": 3, "d": [293], "a": 1 }, + { "px": [864,144], "src": [0,0], "f": 0, "t": 0, "d": [294], "a": 1 }, + { "px": [888,144], "src": [24,0], "f": 0, "t": 1, "d": [295], "a": 1 }, + { "px": [912,144], "src": [48,0], "f": 0, "t": 2, "d": [296], "a": 1 }, + { "px": [936,144], "src": [72,0], "f": 0, "t": 3, "d": [297], "a": 1 }, + { "px": [960,144], "src": [0,0], "f": 0, "t": 0, "d": [298], "a": 1 }, + { "px": [984,144], "src": [24,0], "f": 0, "t": 1, "d": [299], "a": 1 }, + { "px": [1008,144], "src": [48,0], "f": 0, "t": 2, "d": [300], "a": 1 }, + { "px": [0,168], "src": [0,0], "f": 0, "t": 0, "d": [301], "a": 1 }, + { "px": [24,168], "src": [24,0], "f": 0, "t": 1, "d": [302], "a": 1 }, + { "px": [48,168], "src": [48,0], "f": 0, "t": 2, "d": [303], "a": 1 }, + { "px": [72,168], "src": [72,0], "f": 0, "t": 3, "d": [304], "a": 1 }, + { "px": [96,168], "src": [0,0], "f": 0, "t": 0, "d": [305], "a": 1 }, + { "px": [120,168], "src": [24,0], "f": 0, "t": 1, "d": [306], "a": 1 }, + { "px": [144,168], "src": [48,0], "f": 0, "t": 2, "d": [307], "a": 1 }, + { "px": [168,168], "src": [72,0], "f": 0, "t": 3, "d": [308], "a": 1 }, + { "px": [192,168], "src": [0,0], "f": 0, "t": 0, "d": [309], "a": 1 }, + { "px": [216,168], "src": [24,0], "f": 0, "t": 1, "d": [310], "a": 1 }, + { "px": [240,168], "src": [48,0], "f": 0, "t": 2, "d": [311], "a": 1 }, + { "px": [264,168], "src": [72,0], "f": 0, "t": 3, "d": [312], "a": 1 }, + { "px": [288,168], "src": [0,0], "f": 0, "t": 0, "d": [313], "a": 1 }, + { "px": [312,168], "src": [24,0], "f": 0, "t": 1, "d": [314], "a": 1 }, + { "px": [336,168], "src": [48,0], "f": 0, "t": 2, "d": [315], "a": 1 }, + { "px": [360,168], "src": [72,0], "f": 0, "t": 3, "d": [316], "a": 1 }, + { "px": [384,168], "src": [0,0], "f": 0, "t": 0, "d": [317], "a": 1 }, + { "px": [408,168], "src": [24,0], "f": 0, "t": 1, "d": [318], "a": 1 }, + { "px": [432,168], "src": [48,0], "f": 0, "t": 2, "d": [319], "a": 1 }, + { "px": [456,168], "src": [72,0], "f": 0, "t": 3, "d": [320], "a": 1 }, + { "px": [480,168], "src": [0,0], "f": 0, "t": 0, "d": [321], "a": 1 }, + { "px": [504,168], "src": [24,0], "f": 0, "t": 1, "d": [322], "a": 1 }, + { "px": [528,168], "src": [48,0], "f": 0, "t": 2, "d": [323], "a": 1 }, + { "px": [552,168], "src": [72,0], "f": 0, "t": 3, "d": [324], "a": 1 }, + { "px": [576,168], "src": [0,0], "f": 0, "t": 0, "d": [325], "a": 1 }, + { "px": [600,168], "src": [24,0], "f": 0, "t": 1, "d": [326], "a": 1 }, + { "px": [624,168], "src": [48,0], "f": 0, "t": 2, "d": [327], "a": 1 }, + { "px": [648,168], "src": [72,0], "f": 0, "t": 3, "d": [328], "a": 1 }, + { "px": [672,168], "src": [0,0], "f": 0, "t": 0, "d": [329], "a": 1 }, + { "px": [696,168], "src": [24,0], "f": 0, "t": 1, "d": [330], "a": 1 }, + { "px": [720,168], "src": [48,0], "f": 0, "t": 2, "d": [331], "a": 1 }, + { "px": [744,168], "src": [72,0], "f": 0, "t": 3, "d": [332], "a": 1 }, + { "px": [768,168], "src": [0,0], "f": 0, "t": 0, "d": [333], "a": 1 }, + { "px": [792,168], "src": [24,0], "f": 0, "t": 1, "d": [334], "a": 1 }, + { "px": [816,168], "src": [48,0], "f": 0, "t": 2, "d": [335], "a": 1 }, + { "px": [840,168], "src": [72,0], "f": 0, "t": 3, "d": [336], "a": 1 }, + { "px": [864,168], "src": [0,0], "f": 0, "t": 0, "d": [337], "a": 1 }, + { "px": [888,168], "src": [24,0], "f": 0, "t": 1, "d": [338], "a": 1 }, + { "px": [912,168], "src": [48,0], "f": 0, "t": 2, "d": [339], "a": 1 }, + { "px": [936,168], "src": [72,0], "f": 0, "t": 3, "d": [340], "a": 1 }, + { "px": [960,168], "src": [0,0], "f": 0, "t": 0, "d": [341], "a": 1 }, + { "px": [984,168], "src": [24,0], "f": 0, "t": 1, "d": [342], "a": 1 }, + { "px": [1008,168], "src": [48,0], "f": 0, "t": 2, "d": [343], "a": 1 }, + { "px": [0,192], "src": [0,0], "f": 0, "t": 0, "d": [344], "a": 1 }, + { "px": [24,192], "src": [24,0], "f": 0, "t": 1, "d": [345], "a": 1 }, + { "px": [48,192], "src": [48,0], "f": 0, "t": 2, "d": [346], "a": 1 }, + { "px": [72,192], "src": [72,0], "f": 0, "t": 3, "d": [347], "a": 1 }, + { "px": [96,192], "src": [0,0], "f": 0, "t": 0, "d": [348], "a": 1 }, + { "px": [120,192], "src": [24,0], "f": 0, "t": 1, "d": [349], "a": 1 }, + { "px": [144,192], "src": [48,0], "f": 0, "t": 2, "d": [350], "a": 1 }, + { "px": [168,192], "src": [72,0], "f": 0, "t": 3, "d": [351], "a": 1 }, + { "px": [192,192], "src": [0,0], "f": 0, "t": 0, "d": [352], "a": 1 }, + { "px": [216,192], "src": [24,0], "f": 0, "t": 1, "d": [353], "a": 1 }, + { "px": [240,192], "src": [48,0], "f": 0, "t": 2, "d": [354], "a": 1 }, + { "px": [264,192], "src": [72,0], "f": 0, "t": 3, "d": [355], "a": 1 }, + { "px": [288,192], "src": [0,0], "f": 0, "t": 0, "d": [356], "a": 1 }, + { "px": [312,192], "src": [24,0], "f": 0, "t": 1, "d": [357], "a": 1 }, + { "px": [336,192], "src": [48,0], "f": 0, "t": 2, "d": [358], "a": 1 }, + { "px": [360,192], "src": [72,0], "f": 0, "t": 3, "d": [359], "a": 1 }, + { "px": [384,192], "src": [0,0], "f": 0, "t": 0, "d": [360], "a": 1 }, + { "px": [408,192], "src": [24,0], "f": 0, "t": 1, "d": [361], "a": 1 }, + { "px": [432,192], "src": [48,0], "f": 0, "t": 2, "d": [362], "a": 1 }, + { "px": [456,192], "src": [72,0], "f": 0, "t": 3, "d": [363], "a": 1 }, + { "px": [480,192], "src": [0,0], "f": 0, "t": 0, "d": [364], "a": 1 }, + { "px": [504,192], "src": [24,0], "f": 0, "t": 1, "d": [365], "a": 1 }, + { "px": [528,192], "src": [48,0], "f": 0, "t": 2, "d": [366], "a": 1 }, + { "px": [552,192], "src": [72,0], "f": 0, "t": 3, "d": [367], "a": 1 }, + { "px": [576,192], "src": [0,0], "f": 0, "t": 0, "d": [368], "a": 1 }, + { "px": [600,192], "src": [24,0], "f": 0, "t": 1, "d": [369], "a": 1 }, + { "px": [624,192], "src": [48,0], "f": 0, "t": 2, "d": [370], "a": 1 }, + { "px": [648,192], "src": [72,0], "f": 0, "t": 3, "d": [371], "a": 1 }, + { "px": [672,192], "src": [0,0], "f": 0, "t": 0, "d": [372], "a": 1 }, + { "px": [696,192], "src": [24,0], "f": 0, "t": 1, "d": [373], "a": 1 }, + { "px": [720,192], "src": [48,0], "f": 0, "t": 2, "d": [374], "a": 1 }, + { "px": [744,192], "src": [72,0], "f": 0, "t": 3, "d": [375], "a": 1 }, + { "px": [768,192], "src": [0,0], "f": 0, "t": 0, "d": [376], "a": 1 }, + { "px": [792,192], "src": [24,0], "f": 0, "t": 1, "d": [377], "a": 1 }, + { "px": [816,192], "src": [48,0], "f": 0, "t": 2, "d": [378], "a": 1 }, + { "px": [840,192], "src": [72,0], "f": 0, "t": 3, "d": [379], "a": 1 }, + { "px": [864,192], "src": [0,0], "f": 0, "t": 0, "d": [380], "a": 1 }, + { "px": [888,192], "src": [24,0], "f": 0, "t": 1, "d": [381], "a": 1 }, + { "px": [912,192], "src": [48,0], "f": 0, "t": 2, "d": [382], "a": 1 }, + { "px": [936,192], "src": [72,0], "f": 0, "t": 3, "d": [383], "a": 1 }, + { "px": [960,192], "src": [0,0], "f": 0, "t": 0, "d": [384], "a": 1 }, + { "px": [984,192], "src": [24,0], "f": 0, "t": 1, "d": [385], "a": 1 }, + { "px": [1008,192], "src": [48,0], "f": 0, "t": 2, "d": [386], "a": 1 }, + { "px": [0,216], "src": [0,0], "f": 0, "t": 0, "d": [387], "a": 1 }, + { "px": [24,216], "src": [24,0], "f": 0, "t": 1, "d": [388], "a": 1 }, + { "px": [48,216], "src": [48,0], "f": 0, "t": 2, "d": [389], "a": 1 }, + { "px": [72,216], "src": [72,0], "f": 0, "t": 3, "d": [390], "a": 1 }, + { "px": [96,216], "src": [0,0], "f": 0, "t": 0, "d": [391], "a": 1 }, + { "px": [120,216], "src": [24,0], "f": 0, "t": 1, "d": [392], "a": 1 }, + { "px": [144,216], "src": [48,0], "f": 0, "t": 2, "d": [393], "a": 1 }, + { "px": [168,216], "src": [72,0], "f": 0, "t": 3, "d": [394], "a": 1 }, + { "px": [192,216], "src": [0,0], "f": 0, "t": 0, "d": [395], "a": 1 }, + { "px": [216,216], "src": [24,0], "f": 0, "t": 1, "d": [396], "a": 1 }, + { "px": [240,216], "src": [48,0], "f": 0, "t": 2, "d": [397], "a": 1 }, + { "px": [264,216], "src": [72,0], "f": 0, "t": 3, "d": [398], "a": 1 }, + { "px": [288,216], "src": [0,0], "f": 0, "t": 0, "d": [399], "a": 1 }, + { "px": [312,216], "src": [24,0], "f": 0, "t": 1, "d": [400], "a": 1 }, + { "px": [336,216], "src": [48,0], "f": 0, "t": 2, "d": [401], "a": 1 }, + { "px": [360,216], "src": [72,0], "f": 0, "t": 3, "d": [402], "a": 1 }, + { "px": [384,216], "src": [0,0], "f": 0, "t": 0, "d": [403], "a": 1 }, + { "px": [408,216], "src": [24,0], "f": 0, "t": 1, "d": [404], "a": 1 }, + { "px": [432,216], "src": [48,0], "f": 0, "t": 2, "d": [405], "a": 1 }, + { "px": [456,216], "src": [72,0], "f": 0, "t": 3, "d": [406], "a": 1 }, + { "px": [480,216], "src": [0,0], "f": 0, "t": 0, "d": [407], "a": 1 }, + { "px": [504,216], "src": [24,0], "f": 0, "t": 1, "d": [408], "a": 1 }, + { "px": [528,216], "src": [48,0], "f": 0, "t": 2, "d": [409], "a": 1 }, + { "px": [552,216], "src": [72,0], "f": 0, "t": 3, "d": [410], "a": 1 }, + { "px": [576,216], "src": [0,0], "f": 0, "t": 0, "d": [411], "a": 1 }, + { "px": [600,216], "src": [24,0], "f": 0, "t": 1, "d": [412], "a": 1 }, + { "px": [624,216], "src": [48,0], "f": 0, "t": 2, "d": [413], "a": 1 }, + { "px": [648,216], "src": [72,0], "f": 0, "t": 3, "d": [414], "a": 1 }, + { "px": [672,216], "src": [0,0], "f": 0, "t": 0, "d": [415], "a": 1 }, + { "px": [696,216], "src": [24,0], "f": 0, "t": 1, "d": [416], "a": 1 }, + { "px": [720,216], "src": [48,0], "f": 0, "t": 2, "d": [417], "a": 1 }, + { "px": [744,216], "src": [72,0], "f": 0, "t": 3, "d": [418], "a": 1 }, + { "px": [768,216], "src": [0,0], "f": 0, "t": 0, "d": [419], "a": 1 }, + { "px": [792,216], "src": [24,0], "f": 0, "t": 1, "d": [420], "a": 1 }, + { "px": [816,216], "src": [48,0], "f": 0, "t": 2, "d": [421], "a": 1 }, + { "px": [840,216], "src": [72,0], "f": 0, "t": 3, "d": [422], "a": 1 }, + { "px": [864,216], "src": [0,0], "f": 0, "t": 0, "d": [423], "a": 1 }, + { "px": [888,216], "src": [24,0], "f": 0, "t": 1, "d": [424], "a": 1 }, + { "px": [912,216], "src": [48,0], "f": 0, "t": 2, "d": [425], "a": 1 }, + { "px": [936,216], "src": [72,0], "f": 0, "t": 3, "d": [426], "a": 1 }, + { "px": [960,216], "src": [0,0], "f": 0, "t": 0, "d": [427], "a": 1 }, + { "px": [984,216], "src": [24,0], "f": 0, "t": 1, "d": [428], "a": 1 }, + { "px": [1008,216], "src": [48,0], "f": 0, "t": 2, "d": [429], "a": 1 }, + { "px": [0,240], "src": [0,0], "f": 0, "t": 0, "d": [430], "a": 1 }, + { "px": [24,240], "src": [24,0], "f": 0, "t": 1, "d": [431], "a": 1 }, + { "px": [48,240], "src": [48,0], "f": 0, "t": 2, "d": [432], "a": 1 }, + { "px": [72,240], "src": [72,0], "f": 0, "t": 3, "d": [433], "a": 1 }, + { "px": [96,240], "src": [0,0], "f": 0, "t": 0, "d": [434], "a": 1 }, + { "px": [120,240], "src": [24,0], "f": 0, "t": 1, "d": [435], "a": 1 }, + { "px": [144,240], "src": [48,0], "f": 0, "t": 2, "d": [436], "a": 1 }, + { "px": [168,240], "src": [72,0], "f": 0, "t": 3, "d": [437], "a": 1 }, + { "px": [192,240], "src": [0,0], "f": 0, "t": 0, "d": [438], "a": 1 }, + { "px": [216,240], "src": [24,0], "f": 0, "t": 1, "d": [439], "a": 1 }, + { "px": [240,240], "src": [48,0], "f": 0, "t": 2, "d": [440], "a": 1 }, + { "px": [264,240], "src": [72,0], "f": 0, "t": 3, "d": [441], "a": 1 }, + { "px": [288,240], "src": [0,0], "f": 0, "t": 0, "d": [442], "a": 1 }, + { "px": [312,240], "src": [24,0], "f": 0, "t": 1, "d": [443], "a": 1 }, + { "px": [336,240], "src": [48,0], "f": 0, "t": 2, "d": [444], "a": 1 }, + { "px": [360,240], "src": [72,0], "f": 0, "t": 3, "d": [445], "a": 1 }, + { "px": [384,240], "src": [0,0], "f": 0, "t": 0, "d": [446], "a": 1 }, + { "px": [408,240], "src": [24,0], "f": 0, "t": 1, "d": [447], "a": 1 }, + { "px": [432,240], "src": [48,0], "f": 0, "t": 2, "d": [448], "a": 1 }, + { "px": [456,240], "src": [72,0], "f": 0, "t": 3, "d": [449], "a": 1 }, + { "px": [480,240], "src": [0,0], "f": 0, "t": 0, "d": [450], "a": 1 }, + { "px": [504,240], "src": [24,0], "f": 0, "t": 1, "d": [451], "a": 1 }, + { "px": [528,240], "src": [48,0], "f": 0, "t": 2, "d": [452], "a": 1 }, + { "px": [552,240], "src": [72,0], "f": 0, "t": 3, "d": [453], "a": 1 }, + { "px": [576,240], "src": [0,0], "f": 0, "t": 0, "d": [454], "a": 1 }, + { "px": [600,240], "src": [24,0], "f": 0, "t": 1, "d": [455], "a": 1 }, + { "px": [624,240], "src": [48,0], "f": 0, "t": 2, "d": [456], "a": 1 }, + { "px": [648,240], "src": [72,0], "f": 0, "t": 3, "d": [457], "a": 1 }, + { "px": [672,240], "src": [0,0], "f": 0, "t": 0, "d": [458], "a": 1 }, + { "px": [696,240], "src": [24,0], "f": 0, "t": 1, "d": [459], "a": 1 }, + { "px": [720,240], "src": [48,0], "f": 0, "t": 2, "d": [460], "a": 1 }, + { "px": [744,240], "src": [72,0], "f": 0, "t": 3, "d": [461], "a": 1 }, + { "px": [768,240], "src": [0,0], "f": 0, "t": 0, "d": [462], "a": 1 }, + { "px": [792,240], "src": [24,0], "f": 0, "t": 1, "d": [463], "a": 1 }, + { "px": [816,240], "src": [48,0], "f": 0, "t": 2, "d": [464], "a": 1 }, + { "px": [840,240], "src": [72,0], "f": 0, "t": 3, "d": [465], "a": 1 }, + { "px": [864,240], "src": [0,0], "f": 0, "t": 0, "d": [466], "a": 1 }, + { "px": [888,240], "src": [24,0], "f": 0, "t": 1, "d": [467], "a": 1 }, + { "px": [912,240], "src": [48,0], "f": 0, "t": 2, "d": [468], "a": 1 }, + { "px": [936,240], "src": [72,0], "f": 0, "t": 3, "d": [469], "a": 1 }, + { "px": [960,240], "src": [0,0], "f": 0, "t": 0, "d": [470], "a": 1 }, + { "px": [984,240], "src": [24,0], "f": 0, "t": 1, "d": [471], "a": 1 }, + { "px": [1008,240], "src": [48,0], "f": 0, "t": 2, "d": [472], "a": 1 }, + { "px": [0,264], "src": [0,0], "f": 0, "t": 0, "d": [473], "a": 1 }, + { "px": [24,264], "src": [24,0], "f": 0, "t": 1, "d": [474], "a": 1 }, + { "px": [48,264], "src": [48,0], "f": 0, "t": 2, "d": [475], "a": 1 }, + { "px": [72,264], "src": [72,0], "f": 0, "t": 3, "d": [476], "a": 1 }, + { "px": [96,264], "src": [0,0], "f": 0, "t": 0, "d": [477], "a": 1 }, + { "px": [120,264], "src": [24,0], "f": 0, "t": 1, "d": [478], "a": 1 }, + { "px": [144,264], "src": [48,0], "f": 0, "t": 2, "d": [479], "a": 1 }, + { "px": [168,264], "src": [72,0], "f": 0, "t": 3, "d": [480], "a": 1 }, + { "px": [192,264], "src": [0,0], "f": 0, "t": 0, "d": [481], "a": 1 }, + { "px": [216,264], "src": [24,0], "f": 0, "t": 1, "d": [482], "a": 1 }, + { "px": [240,264], "src": [48,0], "f": 0, "t": 2, "d": [483], "a": 1 }, + { "px": [264,264], "src": [72,0], "f": 0, "t": 3, "d": [484], "a": 1 }, + { "px": [288,264], "src": [0,0], "f": 0, "t": 0, "d": [485], "a": 1 }, + { "px": [312,264], "src": [24,0], "f": 0, "t": 1, "d": [486], "a": 1 }, + { "px": [336,264], "src": [48,0], "f": 0, "t": 2, "d": [487], "a": 1 }, + { "px": [360,264], "src": [72,0], "f": 0, "t": 3, "d": [488], "a": 1 }, + { "px": [384,264], "src": [0,0], "f": 0, "t": 0, "d": [489], "a": 1 }, + { "px": [408,264], "src": [24,0], "f": 0, "t": 1, "d": [490], "a": 1 }, + { "px": [432,264], "src": [48,0], "f": 0, "t": 2, "d": [491], "a": 1 }, + { "px": [456,264], "src": [72,0], "f": 0, "t": 3, "d": [492], "a": 1 }, + { "px": [480,264], "src": [0,0], "f": 0, "t": 0, "d": [493], "a": 1 }, + { "px": [504,264], "src": [24,0], "f": 0, "t": 1, "d": [494], "a": 1 }, + { "px": [528,264], "src": [48,0], "f": 0, "t": 2, "d": [495], "a": 1 }, + { "px": [552,264], "src": [72,0], "f": 0, "t": 3, "d": [496], "a": 1 }, + { "px": [576,264], "src": [0,0], "f": 0, "t": 0, "d": [497], "a": 1 }, + { "px": [600,264], "src": [24,0], "f": 0, "t": 1, "d": [498], "a": 1 }, + { "px": [624,264], "src": [48,0], "f": 0, "t": 2, "d": [499], "a": 1 }, + { "px": [648,264], "src": [72,0], "f": 0, "t": 3, "d": [500], "a": 1 }, + { "px": [672,264], "src": [0,0], "f": 0, "t": 0, "d": [501], "a": 1 }, + { "px": [696,264], "src": [24,0], "f": 0, "t": 1, "d": [502], "a": 1 }, + { "px": [720,264], "src": [48,0], "f": 0, "t": 2, "d": [503], "a": 1 }, + { "px": [744,264], "src": [72,0], "f": 0, "t": 3, "d": [504], "a": 1 }, + { "px": [768,264], "src": [0,0], "f": 0, "t": 0, "d": [505], "a": 1 }, + { "px": [792,264], "src": [24,0], "f": 0, "t": 1, "d": [506], "a": 1 }, + { "px": [816,264], "src": [48,0], "f": 0, "t": 2, "d": [507], "a": 1 }, + { "px": [840,264], "src": [72,0], "f": 0, "t": 3, "d": [508], "a": 1 }, + { "px": [864,264], "src": [0,0], "f": 0, "t": 0, "d": [509], "a": 1 }, + { "px": [888,264], "src": [24,0], "f": 0, "t": 1, "d": [510], "a": 1 }, + { "px": [912,264], "src": [48,0], "f": 0, "t": 2, "d": [511], "a": 1 }, + { "px": [936,264], "src": [72,0], "f": 0, "t": 3, "d": [512], "a": 1 }, + { "px": [960,264], "src": [0,0], "f": 0, "t": 0, "d": [513], "a": 1 }, + { "px": [984,264], "src": [24,0], "f": 0, "t": 1, "d": [514], "a": 1 }, + { "px": [1008,264], "src": [48,0], "f": 0, "t": 2, "d": [515], "a": 1 }, + { "px": [0,288], "src": [0,0], "f": 0, "t": 0, "d": [516], "a": 1 }, + { "px": [24,288], "src": [24,0], "f": 0, "t": 1, "d": [517], "a": 1 }, + { "px": [48,288], "src": [48,0], "f": 0, "t": 2, "d": [518], "a": 1 }, + { "px": [72,288], "src": [72,0], "f": 0, "t": 3, "d": [519], "a": 1 }, + { "px": [96,288], "src": [0,0], "f": 0, "t": 0, "d": [520], "a": 1 }, + { "px": [120,288], "src": [24,0], "f": 0, "t": 1, "d": [521], "a": 1 }, + { "px": [144,288], "src": [48,0], "f": 0, "t": 2, "d": [522], "a": 1 }, + { "px": [168,288], "src": [72,0], "f": 0, "t": 3, "d": [523], "a": 1 }, + { "px": [192,288], "src": [0,0], "f": 0, "t": 0, "d": [524], "a": 1 }, + { "px": [216,288], "src": [24,0], "f": 0, "t": 1, "d": [525], "a": 1 }, + { "px": [240,288], "src": [48,0], "f": 0, "t": 2, "d": [526], "a": 1 }, + { "px": [264,288], "src": [72,0], "f": 0, "t": 3, "d": [527], "a": 1 }, + { "px": [288,288], "src": [0,0], "f": 0, "t": 0, "d": [528], "a": 1 }, + { "px": [312,288], "src": [24,0], "f": 0, "t": 1, "d": [529], "a": 1 }, + { "px": [336,288], "src": [48,0], "f": 0, "t": 2, "d": [530], "a": 1 }, + { "px": [360,288], "src": [72,0], "f": 0, "t": 3, "d": [531], "a": 1 }, + { "px": [384,288], "src": [0,0], "f": 0, "t": 0, "d": [532], "a": 1 }, + { "px": [408,288], "src": [24,0], "f": 0, "t": 1, "d": [533], "a": 1 }, + { "px": [432,288], "src": [48,0], "f": 0, "t": 2, "d": [534], "a": 1 }, + { "px": [456,288], "src": [72,0], "f": 0, "t": 3, "d": [535], "a": 1 }, + { "px": [480,288], "src": [0,0], "f": 0, "t": 0, "d": [536], "a": 1 }, + { "px": [504,288], "src": [24,0], "f": 0, "t": 1, "d": [537], "a": 1 }, + { "px": [528,288], "src": [48,0], "f": 0, "t": 2, "d": [538], "a": 1 }, + { "px": [552,288], "src": [72,0], "f": 0, "t": 3, "d": [539], "a": 1 }, + { "px": [576,288], "src": [0,0], "f": 0, "t": 0, "d": [540], "a": 1 }, + { "px": [600,288], "src": [24,0], "f": 0, "t": 1, "d": [541], "a": 1 }, + { "px": [624,288], "src": [48,0], "f": 0, "t": 2, "d": [542], "a": 1 }, + { "px": [648,288], "src": [72,0], "f": 0, "t": 3, "d": [543], "a": 1 }, + { "px": [672,288], "src": [0,0], "f": 0, "t": 0, "d": [544], "a": 1 }, + { "px": [696,288], "src": [24,0], "f": 0, "t": 1, "d": [545], "a": 1 }, + { "px": [720,288], "src": [48,0], "f": 0, "t": 2, "d": [546], "a": 1 }, + { "px": [744,288], "src": [72,0], "f": 0, "t": 3, "d": [547], "a": 1 }, + { "px": [768,288], "src": [0,0], "f": 0, "t": 0, "d": [548], "a": 1 }, + { "px": [792,288], "src": [24,0], "f": 0, "t": 1, "d": [549], "a": 1 }, + { "px": [816,288], "src": [48,0], "f": 0, "t": 2, "d": [550], "a": 1 }, + { "px": [840,288], "src": [72,0], "f": 0, "t": 3, "d": [551], "a": 1 }, + { "px": [864,288], "src": [0,0], "f": 0, "t": 0, "d": [552], "a": 1 }, + { "px": [888,288], "src": [24,0], "f": 0, "t": 1, "d": [553], "a": 1 }, + { "px": [912,288], "src": [48,0], "f": 0, "t": 2, "d": [554], "a": 1 }, + { "px": [936,288], "src": [72,0], "f": 0, "t": 3, "d": [555], "a": 1 }, + { "px": [960,288], "src": [0,0], "f": 0, "t": 0, "d": [556], "a": 1 }, + { "px": [984,288], "src": [24,0], "f": 0, "t": 1, "d": [557], "a": 1 }, + { "px": [1008,288], "src": [48,0], "f": 0, "t": 2, "d": [558], "a": 1 }, + { "px": [0,312], "src": [0,0], "f": 0, "t": 0, "d": [559], "a": 1 }, + { "px": [24,312], "src": [24,0], "f": 0, "t": 1, "d": [560], "a": 1 }, + { "px": [48,312], "src": [48,0], "f": 0, "t": 2, "d": [561], "a": 1 }, + { "px": [72,312], "src": [72,0], "f": 0, "t": 3, "d": [562], "a": 1 }, + { "px": [96,312], "src": [0,0], "f": 0, "t": 0, "d": [563], "a": 1 }, + { "px": [120,312], "src": [24,0], "f": 0, "t": 1, "d": [564], "a": 1 }, + { "px": [144,312], "src": [48,0], "f": 0, "t": 2, "d": [565], "a": 1 }, + { "px": [168,312], "src": [72,0], "f": 0, "t": 3, "d": [566], "a": 1 }, + { "px": [192,312], "src": [0,0], "f": 0, "t": 0, "d": [567], "a": 1 }, + { "px": [216,312], "src": [24,0], "f": 0, "t": 1, "d": [568], "a": 1 }, + { "px": [240,312], "src": [48,0], "f": 0, "t": 2, "d": [569], "a": 1 }, + { "px": [264,312], "src": [72,0], "f": 0, "t": 3, "d": [570], "a": 1 }, + { "px": [288,312], "src": [0,0], "f": 0, "t": 0, "d": [571], "a": 1 }, + { "px": [312,312], "src": [24,0], "f": 0, "t": 1, "d": [572], "a": 1 }, + { "px": [336,312], "src": [48,0], "f": 0, "t": 2, "d": [573], "a": 1 }, + { "px": [360,312], "src": [72,0], "f": 0, "t": 3, "d": [574], "a": 1 }, + { "px": [384,312], "src": [0,0], "f": 0, "t": 0, "d": [575], "a": 1 }, + { "px": [408,312], "src": [24,0], "f": 0, "t": 1, "d": [576], "a": 1 }, + { "px": [432,312], "src": [48,0], "f": 0, "t": 2, "d": [577], "a": 1 }, + { "px": [456,312], "src": [72,0], "f": 0, "t": 3, "d": [578], "a": 1 }, + { "px": [480,312], "src": [0,0], "f": 0, "t": 0, "d": [579], "a": 1 }, + { "px": [504,312], "src": [24,0], "f": 0, "t": 1, "d": [580], "a": 1 }, + { "px": [528,312], "src": [48,0], "f": 0, "t": 2, "d": [581], "a": 1 }, + { "px": [552,312], "src": [72,0], "f": 0, "t": 3, "d": [582], "a": 1 }, + { "px": [576,312], "src": [0,0], "f": 0, "t": 0, "d": [583], "a": 1 }, + { "px": [600,312], "src": [24,0], "f": 0, "t": 1, "d": [584], "a": 1 }, + { "px": [624,312], "src": [48,0], "f": 0, "t": 2, "d": [585], "a": 1 }, + { "px": [648,312], "src": [72,0], "f": 0, "t": 3, "d": [586], "a": 1 }, + { "px": [672,312], "src": [0,0], "f": 0, "t": 0, "d": [587], "a": 1 }, + { "px": [696,312], "src": [24,0], "f": 0, "t": 1, "d": [588], "a": 1 }, + { "px": [720,312], "src": [48,0], "f": 0, "t": 2, "d": [589], "a": 1 }, + { "px": [744,312], "src": [72,0], "f": 0, "t": 3, "d": [590], "a": 1 }, + { "px": [768,312], "src": [0,0], "f": 0, "t": 0, "d": [591], "a": 1 }, + { "px": [792,312], "src": [24,0], "f": 0, "t": 1, "d": [592], "a": 1 }, + { "px": [816,312], "src": [48,0], "f": 0, "t": 2, "d": [593], "a": 1 }, + { "px": [840,312], "src": [72,0], "f": 0, "t": 3, "d": [594], "a": 1 }, + { "px": [864,312], "src": [0,0], "f": 0, "t": 0, "d": [595], "a": 1 }, + { "px": [888,312], "src": [24,0], "f": 0, "t": 1, "d": [596], "a": 1 }, + { "px": [912,312], "src": [48,0], "f": 0, "t": 2, "d": [597], "a": 1 }, + { "px": [936,312], "src": [72,0], "f": 0, "t": 3, "d": [598], "a": 1 }, + { "px": [960,312], "src": [0,0], "f": 0, "t": 0, "d": [599], "a": 1 }, + { "px": [984,312], "src": [24,0], "f": 0, "t": 1, "d": [600], "a": 1 }, + { "px": [1008,312], "src": [48,0], "f": 0, "t": 2, "d": [601], "a": 1 }, + { "px": [0,336], "src": [0,0], "f": 0, "t": 0, "d": [602], "a": 1 }, + { "px": [24,336], "src": [0,0], "f": 0, "t": 0, "d": [603], "a": 1 }, + { "px": [48,336], "src": [0,0], "f": 0, "t": 0, "d": [604], "a": 1 }, + { "px": [72,336], "src": [0,0], "f": 0, "t": 0, "d": [605], "a": 1 }, + { "px": [96,336], "src": [0,0], "f": 0, "t": 0, "d": [606], "a": 1 }, + { "px": [120,336], "src": [0,0], "f": 0, "t": 0, "d": [607], "a": 1 }, + { "px": [144,336], "src": [0,0], "f": 0, "t": 0, "d": [608], "a": 1 }, + { "px": [168,336], "src": [0,0], "f": 0, "t": 0, "d": [609], "a": 1 }, + { "px": [192,336], "src": [0,0], "f": 0, "t": 0, "d": [610], "a": 1 }, + { "px": [216,336], "src": [0,0], "f": 0, "t": 0, "d": [611], "a": 1 }, + { "px": [240,336], "src": [0,0], "f": 0, "t": 0, "d": [612], "a": 1 }, + { "px": [264,336], "src": [72,0], "f": 0, "t": 3, "d": [613], "a": 1 }, + { "px": [288,336], "src": [0,0], "f": 0, "t": 0, "d": [614], "a": 1 }, + { "px": [312,336], "src": [24,0], "f": 0, "t": 1, "d": [615], "a": 1 }, + { "px": [336,336], "src": [48,0], "f": 0, "t": 2, "d": [616], "a": 1 }, + { "px": [360,336], "src": [72,0], "f": 0, "t": 3, "d": [617], "a": 1 }, + { "px": [384,336], "src": [0,0], "f": 0, "t": 0, "d": [618], "a": 1 }, + { "px": [408,336], "src": [24,0], "f": 0, "t": 1, "d": [619], "a": 1 }, + { "px": [432,336], "src": [48,0], "f": 0, "t": 2, "d": [620], "a": 1 }, + { "px": [456,336], "src": [72,0], "f": 0, "t": 3, "d": [621], "a": 1 }, + { "px": [480,336], "src": [0,0], "f": 0, "t": 0, "d": [622], "a": 1 }, + { "px": [504,336], "src": [24,0], "f": 0, "t": 1, "d": [623], "a": 1 }, + { "px": [528,336], "src": [48,0], "f": 0, "t": 2, "d": [624], "a": 1 }, + { "px": [552,336], "src": [72,0], "f": 0, "t": 3, "d": [625], "a": 1 }, + { "px": [576,336], "src": [0,0], "f": 0, "t": 0, "d": [626], "a": 1 }, + { "px": [600,336], "src": [24,0], "f": 0, "t": 1, "d": [627], "a": 1 }, + { "px": [624,336], "src": [48,0], "f": 0, "t": 2, "d": [628], "a": 1 }, + { "px": [648,336], "src": [72,0], "f": 0, "t": 3, "d": [629], "a": 1 }, + { "px": [672,336], "src": [0,0], "f": 0, "t": 0, "d": [630], "a": 1 }, + { "px": [696,336], "src": [24,0], "f": 0, "t": 1, "d": [631], "a": 1 }, + { "px": [720,336], "src": [48,0], "f": 0, "t": 2, "d": [632], "a": 1 }, + { "px": [744,336], "src": [72,0], "f": 0, "t": 3, "d": [633], "a": 1 }, + { "px": [768,336], "src": [0,0], "f": 0, "t": 0, "d": [634], "a": 1 }, + { "px": [792,336], "src": [24,0], "f": 0, "t": 1, "d": [635], "a": 1 }, + { "px": [816,336], "src": [48,0], "f": 0, "t": 2, "d": [636], "a": 1 }, + { "px": [840,336], "src": [72,0], "f": 0, "t": 3, "d": [637], "a": 1 }, + { "px": [864,336], "src": [0,0], "f": 0, "t": 0, "d": [638], "a": 1 }, + { "px": [888,336], "src": [24,0], "f": 0, "t": 1, "d": [639], "a": 1 }, + { "px": [912,336], "src": [48,0], "f": 0, "t": 2, "d": [640], "a": 1 }, + { "px": [936,336], "src": [72,0], "f": 0, "t": 3, "d": [641], "a": 1 }, + { "px": [960,336], "src": [0,0], "f": 0, "t": 0, "d": [642], "a": 1 }, + { "px": [984,336], "src": [24,0], "f": 0, "t": 1, "d": [643], "a": 1 }, + { "px": [1008,336], "src": [48,0], "f": 0, "t": 2, "d": [644], "a": 1 }, + { "px": [0,360], "src": [0,0], "f": 0, "t": 0, "d": [645], "a": 1 }, + { "px": [24,360], "src": [0,0], "f": 0, "t": 0, "d": [646], "a": 1 }, + { "px": [48,360], "src": [0,0], "f": 0, "t": 0, "d": [647], "a": 1 }, + { "px": [72,360], "src": [0,0], "f": 0, "t": 0, "d": [648], "a": 1 }, + { "px": [96,360], "src": [0,0], "f": 0, "t": 0, "d": [649], "a": 1 }, + { "px": [120,360], "src": [0,0], "f": 0, "t": 0, "d": [650], "a": 1 }, + { "px": [144,360], "src": [0,0], "f": 0, "t": 0, "d": [651], "a": 1 }, + { "px": [168,360], "src": [0,0], "f": 0, "t": 0, "d": [652], "a": 1 }, + { "px": [192,360], "src": [0,0], "f": 0, "t": 0, "d": [653], "a": 1 }, + { "px": [216,360], "src": [0,0], "f": 0, "t": 0, "d": [654], "a": 1 }, + { "px": [240,360], "src": [0,0], "f": 0, "t": 0, "d": [655], "a": 1 }, + { "px": [264,360], "src": [0,0], "f": 0, "t": 0, "d": [656], "a": 1 }, + { "px": [288,360], "src": [0,0], "f": 0, "t": 0, "d": [657], "a": 1 }, + { "px": [312,360], "src": [0,0], "f": 0, "t": 0, "d": [658], "a": 1 }, + { "px": [336,360], "src": [0,0], "f": 0, "t": 0, "d": [659], "a": 1 }, + { "px": [360,360], "src": [0,0], "f": 0, "t": 0, "d": [660], "a": 1 }, + { "px": [384,360], "src": [0,0], "f": 0, "t": 0, "d": [661], "a": 1 }, + { "px": [408,360], "src": [0,0], "f": 0, "t": 0, "d": [662], "a": 1 }, + { "px": [432,360], "src": [0,0], "f": 0, "t": 0, "d": [663], "a": 1 }, + { "px": [456,360], "src": [0,0], "f": 0, "t": 0, "d": [664], "a": 1 }, + { "px": [480,360], "src": [0,0], "f": 0, "t": 0, "d": [665], "a": 1 }, + { "px": [504,360], "src": [0,0], "f": 0, "t": 0, "d": [666], "a": 1 }, + { "px": [528,360], "src": [0,0], "f": 0, "t": 0, "d": [667], "a": 1 }, + { "px": [552,360], "src": [0,0], "f": 0, "t": 0, "d": [668], "a": 1 }, + { "px": [576,360], "src": [0,0], "f": 0, "t": 0, "d": [669], "a": 1 }, + { "px": [600,360], "src": [0,0], "f": 0, "t": 0, "d": [670], "a": 1 }, + { "px": [624,360], "src": [0,0], "f": 0, "t": 0, "d": [671], "a": 1 }, + { "px": [648,360], "src": [0,0], "f": 0, "t": 0, "d": [672], "a": 1 }, + { "px": [672,360], "src": [0,0], "f": 0, "t": 0, "d": [673], "a": 1 }, + { "px": [696,360], "src": [0,0], "f": 0, "t": 0, "d": [674], "a": 1 }, + { "px": [720,360], "src": [0,0], "f": 0, "t": 0, "d": [675], "a": 1 }, + { "px": [744,360], "src": [0,0], "f": 0, "t": 0, "d": [676], "a": 1 }, + { "px": [768,360], "src": [0,0], "f": 0, "t": 0, "d": [677], "a": 1 }, + { "px": [792,360], "src": [0,0], "f": 0, "t": 0, "d": [678], "a": 1 }, + { "px": [816,360], "src": [0,0], "f": 0, "t": 0, "d": [679], "a": 1 }, + { "px": [840,360], "src": [0,0], "f": 0, "t": 0, "d": [680], "a": 1 }, + { "px": [864,360], "src": [0,0], "f": 0, "t": 0, "d": [681], "a": 1 }, + { "px": [888,360], "src": [0,0], "f": 0, "t": 0, "d": [682], "a": 1 }, + { "px": [912,360], "src": [0,0], "f": 0, "t": 0, "d": [683], "a": 1 }, + { "px": [936,360], "src": [0,0], "f": 0, "t": 0, "d": [684], "a": 1 }, + { "px": [960,360], "src": [0,0], "f": 0, "t": 0, "d": [685], "a": 1 }, + { "px": [984,360], "src": [0,0], "f": 0, "t": 0, "d": [686], "a": 1 }, + { "px": [1008,360], "src": [0,0], "f": 0, "t": 0, "d": [687], "a": 1 }, + { "px": [0,384], "src": [0,0], "f": 0, "t": 0, "d": [688], "a": 1 }, + { "px": [24,384], "src": [24,0], "f": 0, "t": 1, "d": [689], "a": 1 }, + { "px": [48,384], "src": [48,0], "f": 0, "t": 2, "d": [690], "a": 1 }, + { "px": [72,384], "src": [72,0], "f": 0, "t": 3, "d": [691], "a": 1 }, + { "px": [96,384], "src": [0,0], "f": 0, "t": 0, "d": [692], "a": 1 }, + { "px": [120,384], "src": [24,0], "f": 0, "t": 1, "d": [693], "a": 1 }, + { "px": [144,384], "src": [48,0], "f": 0, "t": 2, "d": [694], "a": 1 }, + { "px": [168,384], "src": [72,0], "f": 0, "t": 3, "d": [695], "a": 1 }, + { "px": [192,384], "src": [0,0], "f": 0, "t": 0, "d": [696], "a": 1 }, + { "px": [216,384], "src": [24,0], "f": 0, "t": 1, "d": [697], "a": 1 }, + { "px": [240,384], "src": [48,0], "f": 0, "t": 2, "d": [698], "a": 1 }, + { "px": [264,384], "src": [72,0], "f": 0, "t": 3, "d": [699], "a": 1 }, + { "px": [288,384], "src": [0,0], "f": 0, "t": 0, "d": [700], "a": 1 }, + { "px": [312,384], "src": [24,0], "f": 0, "t": 1, "d": [701], "a": 1 }, + { "px": [336,384], "src": [48,0], "f": 0, "t": 2, "d": [702], "a": 1 }, + { "px": [360,384], "src": [72,0], "f": 0, "t": 3, "d": [703], "a": 1 }, + { "px": [384,384], "src": [0,0], "f": 0, "t": 0, "d": [704], "a": 1 }, + { "px": [408,384], "src": [24,0], "f": 0, "t": 1, "d": [705], "a": 1 }, + { "px": [432,384], "src": [48,0], "f": 0, "t": 2, "d": [706], "a": 1 }, + { "px": [456,384], "src": [72,0], "f": 0, "t": 3, "d": [707], "a": 1 }, + { "px": [480,384], "src": [0,0], "f": 0, "t": 0, "d": [708], "a": 1 }, + { "px": [504,384], "src": [24,0], "f": 0, "t": 1, "d": [709], "a": 1 }, + { "px": [528,384], "src": [48,0], "f": 0, "t": 2, "d": [710], "a": 1 }, + { "px": [552,384], "src": [72,0], "f": 0, "t": 3, "d": [711], "a": 1 }, + { "px": [576,384], "src": [0,0], "f": 0, "t": 0, "d": [712], "a": 1 }, + { "px": [600,384], "src": [24,0], "f": 0, "t": 1, "d": [713], "a": 1 }, + { "px": [624,384], "src": [48,0], "f": 0, "t": 2, "d": [714], "a": 1 }, + { "px": [648,384], "src": [72,0], "f": 0, "t": 3, "d": [715], "a": 1 }, + { "px": [672,384], "src": [0,0], "f": 0, "t": 0, "d": [716], "a": 1 }, + { "px": [696,384], "src": [24,0], "f": 0, "t": 1, "d": [717], "a": 1 }, + { "px": [720,384], "src": [48,0], "f": 0, "t": 2, "d": [718], "a": 1 }, + { "px": [744,384], "src": [72,0], "f": 0, "t": 3, "d": [719], "a": 1 }, + { "px": [768,384], "src": [0,0], "f": 0, "t": 0, "d": [720], "a": 1 }, + { "px": [792,384], "src": [24,0], "f": 0, "t": 1, "d": [721], "a": 1 }, + { "px": [816,384], "src": [48,0], "f": 0, "t": 2, "d": [722], "a": 1 }, + { "px": [840,384], "src": [72,0], "f": 0, "t": 3, "d": [723], "a": 1 }, + { "px": [864,384], "src": [0,0], "f": 0, "t": 0, "d": [724], "a": 1 }, + { "px": [888,384], "src": [24,0], "f": 0, "t": 1, "d": [725], "a": 1 }, + { "px": [912,384], "src": [48,0], "f": 0, "t": 2, "d": [726], "a": 1 }, + { "px": [936,384], "src": [72,0], "f": 0, "t": 3, "d": [727], "a": 1 }, + { "px": [960,384], "src": [0,0], "f": 0, "t": 0, "d": [728], "a": 1 }, + { "px": [984,384], "src": [24,0], "f": 0, "t": 1, "d": [729], "a": 1 }, + { "px": [1008,384], "src": [48,0], "f": 0, "t": 2, "d": [730], "a": 1 }, + { "px": [0,408], "src": [0,0], "f": 0, "t": 0, "d": [731], "a": 1 }, + { "px": [24,408], "src": [24,0], "f": 0, "t": 1, "d": [732], "a": 1 }, + { "px": [48,408], "src": [48,0], "f": 0, "t": 2, "d": [733], "a": 1 }, + { "px": [72,408], "src": [72,0], "f": 0, "t": 3, "d": [734], "a": 1 }, + { "px": [96,408], "src": [0,0], "f": 0, "t": 0, "d": [735], "a": 1 }, + { "px": [120,408], "src": [24,0], "f": 0, "t": 1, "d": [736], "a": 1 }, + { "px": [144,408], "src": [48,0], "f": 0, "t": 2, "d": [737], "a": 1 }, + { "px": [168,408], "src": [72,0], "f": 0, "t": 3, "d": [738], "a": 1 }, + { "px": [192,408], "src": [0,0], "f": 0, "t": 0, "d": [739], "a": 1 }, + { "px": [216,408], "src": [24,0], "f": 0, "t": 1, "d": [740], "a": 1 }, + { "px": [240,408], "src": [48,0], "f": 0, "t": 2, "d": [741], "a": 1 }, + { "px": [264,408], "src": [72,0], "f": 0, "t": 3, "d": [742], "a": 1 }, + { "px": [288,408], "src": [0,0], "f": 0, "t": 0, "d": [743], "a": 1 }, + { "px": [312,408], "src": [24,0], "f": 0, "t": 1, "d": [744], "a": 1 }, + { "px": [336,408], "src": [48,0], "f": 0, "t": 2, "d": [745], "a": 1 }, + { "px": [360,408], "src": [72,0], "f": 0, "t": 3, "d": [746], "a": 1 }, + { "px": [384,408], "src": [0,0], "f": 0, "t": 0, "d": [747], "a": 1 }, + { "px": [408,408], "src": [24,0], "f": 0, "t": 1, "d": [748], "a": 1 }, + { "px": [432,408], "src": [48,0], "f": 0, "t": 2, "d": [749], "a": 1 }, + { "px": [456,408], "src": [72,0], "f": 0, "t": 3, "d": [750], "a": 1 }, + { "px": [480,408], "src": [0,0], "f": 0, "t": 0, "d": [751], "a": 1 }, + { "px": [504,408], "src": [24,0], "f": 0, "t": 1, "d": [752], "a": 1 }, + { "px": [528,408], "src": [48,0], "f": 0, "t": 2, "d": [753], "a": 1 }, + { "px": [552,408], "src": [72,0], "f": 0, "t": 3, "d": [754], "a": 1 }, + { "px": [576,408], "src": [0,0], "f": 0, "t": 0, "d": [755], "a": 1 }, + { "px": [600,408], "src": [24,0], "f": 0, "t": 1, "d": [756], "a": 1 }, + { "px": [624,408], "src": [48,0], "f": 0, "t": 2, "d": [757], "a": 1 }, + { "px": [648,408], "src": [72,0], "f": 0, "t": 3, "d": [758], "a": 1 }, + { "px": [672,408], "src": [0,0], "f": 0, "t": 0, "d": [759], "a": 1 }, + { "px": [696,408], "src": [24,0], "f": 0, "t": 1, "d": [760], "a": 1 }, + { "px": [720,408], "src": [48,0], "f": 0, "t": 2, "d": [761], "a": 1 }, + { "px": [744,408], "src": [72,0], "f": 0, "t": 3, "d": [762], "a": 1 }, + { "px": [768,408], "src": [0,0], "f": 0, "t": 0, "d": [763], "a": 1 }, + { "px": [792,408], "src": [24,0], "f": 0, "t": 1, "d": [764], "a": 1 }, + { "px": [816,408], "src": [48,0], "f": 0, "t": 2, "d": [765], "a": 1 }, + { "px": [840,408], "src": [72,0], "f": 0, "t": 3, "d": [766], "a": 1 }, + { "px": [864,408], "src": [0,0], "f": 0, "t": 0, "d": [767], "a": 1 }, + { "px": [888,408], "src": [24,0], "f": 0, "t": 1, "d": [768], "a": 1 }, + { "px": [912,408], "src": [48,0], "f": 0, "t": 2, "d": [769], "a": 1 }, + { "px": [936,408], "src": [72,0], "f": 0, "t": 3, "d": [770], "a": 1 }, + { "px": [960,408], "src": [0,0], "f": 0, "t": 0, "d": [771], "a": 1 }, + { "px": [984,408], "src": [24,0], "f": 0, "t": 1, "d": [772], "a": 1 }, + { "px": [1008,408], "src": [48,0], "f": 0, "t": 2, "d": [773], "a": 1 }, + { "px": [0,432], "src": [0,0], "f": 0, "t": 0, "d": [774], "a": 1 }, + { "px": [24,432], "src": [24,0], "f": 0, "t": 1, "d": [775], "a": 1 }, + { "px": [48,432], "src": [48,0], "f": 0, "t": 2, "d": [776], "a": 1 }, + { "px": [72,432], "src": [72,0], "f": 0, "t": 3, "d": [777], "a": 1 }, + { "px": [96,432], "src": [0,0], "f": 0, "t": 0, "d": [778], "a": 1 }, + { "px": [120,432], "src": [24,0], "f": 0, "t": 1, "d": [779], "a": 1 }, + { "px": [144,432], "src": [48,0], "f": 0, "t": 2, "d": [780], "a": 1 }, + { "px": [168,432], "src": [72,0], "f": 0, "t": 3, "d": [781], "a": 1 }, + { "px": [192,432], "src": [0,0], "f": 0, "t": 0, "d": [782], "a": 1 }, + { "px": [216,432], "src": [24,0], "f": 0, "t": 1, "d": [783], "a": 1 }, + { "px": [240,432], "src": [48,0], "f": 0, "t": 2, "d": [784], "a": 1 }, + { "px": [264,432], "src": [72,0], "f": 0, "t": 3, "d": [785], "a": 1 }, + { "px": [288,432], "src": [0,0], "f": 0, "t": 0, "d": [786], "a": 1 }, + { "px": [312,432], "src": [24,0], "f": 0, "t": 1, "d": [787], "a": 1 }, + { "px": [336,432], "src": [48,0], "f": 0, "t": 2, "d": [788], "a": 1 }, + { "px": [360,432], "src": [72,0], "f": 0, "t": 3, "d": [789], "a": 1 }, + { "px": [384,432], "src": [0,0], "f": 0, "t": 0, "d": [790], "a": 1 }, + { "px": [408,432], "src": [24,0], "f": 0, "t": 1, "d": [791], "a": 1 }, + { "px": [432,432], "src": [48,0], "f": 0, "t": 2, "d": [792], "a": 1 }, + { "px": [456,432], "src": [72,0], "f": 0, "t": 3, "d": [793], "a": 1 }, + { "px": [480,432], "src": [0,0], "f": 0, "t": 0, "d": [794], "a": 1 }, + { "px": [504,432], "src": [24,0], "f": 0, "t": 1, "d": [795], "a": 1 }, + { "px": [528,432], "src": [48,0], "f": 0, "t": 2, "d": [796], "a": 1 }, + { "px": [552,432], "src": [72,0], "f": 0, "t": 3, "d": [797], "a": 1 }, + { "px": [576,432], "src": [0,0], "f": 0, "t": 0, "d": [798], "a": 1 }, + { "px": [600,432], "src": [24,0], "f": 0, "t": 1, "d": [799], "a": 1 }, + { "px": [624,432], "src": [48,0], "f": 0, "t": 2, "d": [800], "a": 1 }, + { "px": [648,432], "src": [72,0], "f": 0, "t": 3, "d": [801], "a": 1 }, + { "px": [672,432], "src": [0,0], "f": 0, "t": 0, "d": [802], "a": 1 }, + { "px": [696,432], "src": [24,0], "f": 0, "t": 1, "d": [803], "a": 1 }, + { "px": [720,432], "src": [48,0], "f": 0, "t": 2, "d": [804], "a": 1 }, + { "px": [744,432], "src": [72,0], "f": 0, "t": 3, "d": [805], "a": 1 }, + { "px": [768,432], "src": [0,0], "f": 0, "t": 0, "d": [806], "a": 1 }, + { "px": [792,432], "src": [24,0], "f": 0, "t": 1, "d": [807], "a": 1 }, + { "px": [816,432], "src": [48,0], "f": 0, "t": 2, "d": [808], "a": 1 }, + { "px": [840,432], "src": [72,0], "f": 0, "t": 3, "d": [809], "a": 1 }, + { "px": [864,432], "src": [0,0], "f": 0, "t": 0, "d": [810], "a": 1 }, + { "px": [888,432], "src": [24,0], "f": 0, "t": 1, "d": [811], "a": 1 }, + { "px": [912,432], "src": [48,0], "f": 0, "t": 2, "d": [812], "a": 1 }, + { "px": [936,432], "src": [72,0], "f": 0, "t": 3, "d": [813], "a": 1 }, + { "px": [960,432], "src": [0,0], "f": 0, "t": 0, "d": [814], "a": 1 }, + { "px": [984,432], "src": [24,0], "f": 0, "t": 1, "d": [815], "a": 1 }, + { "px": [1008,432], "src": [48,0], "f": 0, "t": 2, "d": [816], "a": 1 }, + { "px": [0,456], "src": [0,0], "f": 0, "t": 0, "d": [817], "a": 1 }, + { "px": [24,456], "src": [24,0], "f": 0, "t": 1, "d": [818], "a": 1 }, + { "px": [48,456], "src": [48,0], "f": 0, "t": 2, "d": [819], "a": 1 }, + { "px": [72,456], "src": [72,0], "f": 0, "t": 3, "d": [820], "a": 1 }, + { "px": [96,456], "src": [0,0], "f": 0, "t": 0, "d": [821], "a": 1 }, + { "px": [120,456], "src": [24,0], "f": 0, "t": 1, "d": [822], "a": 1 }, + { "px": [144,456], "src": [48,0], "f": 0, "t": 2, "d": [823], "a": 1 }, + { "px": [168,456], "src": [72,0], "f": 0, "t": 3, "d": [824], "a": 1 }, + { "px": [192,456], "src": [0,0], "f": 0, "t": 0, "d": [825], "a": 1 }, + { "px": [216,456], "src": [24,0], "f": 0, "t": 1, "d": [826], "a": 1 }, + { "px": [240,456], "src": [48,0], "f": 0, "t": 2, "d": [827], "a": 1 }, + { "px": [264,456], "src": [72,0], "f": 0, "t": 3, "d": [828], "a": 1 }, + { "px": [288,456], "src": [0,0], "f": 0, "t": 0, "d": [829], "a": 1 }, + { "px": [312,456], "src": [24,0], "f": 0, "t": 1, "d": [830], "a": 1 }, + { "px": [336,456], "src": [48,0], "f": 0, "t": 2, "d": [831], "a": 1 }, + { "px": [360,456], "src": [72,0], "f": 0, "t": 3, "d": [832], "a": 1 }, + { "px": [384,456], "src": [0,0], "f": 0, "t": 0, "d": [833], "a": 1 }, + { "px": [408,456], "src": [24,0], "f": 0, "t": 1, "d": [834], "a": 1 }, + { "px": [432,456], "src": [48,0], "f": 0, "t": 2, "d": [835], "a": 1 }, + { "px": [456,456], "src": [72,0], "f": 0, "t": 3, "d": [836], "a": 1 }, + { "px": [480,456], "src": [0,0], "f": 0, "t": 0, "d": [837], "a": 1 }, + { "px": [504,456], "src": [24,0], "f": 0, "t": 1, "d": [838], "a": 1 }, + { "px": [528,456], "src": [48,0], "f": 0, "t": 2, "d": [839], "a": 1 }, + { "px": [552,456], "src": [72,0], "f": 0, "t": 3, "d": [840], "a": 1 }, + { "px": [576,456], "src": [0,0], "f": 0, "t": 0, "d": [841], "a": 1 }, + { "px": [600,456], "src": [24,0], "f": 0, "t": 1, "d": [842], "a": 1 }, + { "px": [624,456], "src": [48,0], "f": 0, "t": 2, "d": [843], "a": 1 }, + { "px": [648,456], "src": [72,0], "f": 0, "t": 3, "d": [844], "a": 1 }, + { "px": [672,456], "src": [0,0], "f": 0, "t": 0, "d": [845], "a": 1 }, + { "px": [696,456], "src": [24,0], "f": 0, "t": 1, "d": [846], "a": 1 }, + { "px": [720,456], "src": [48,0], "f": 0, "t": 2, "d": [847], "a": 1 }, + { "px": [744,456], "src": [72,0], "f": 0, "t": 3, "d": [848], "a": 1 }, + { "px": [768,456], "src": [0,0], "f": 0, "t": 0, "d": [849], "a": 1 }, + { "px": [792,456], "src": [24,0], "f": 0, "t": 1, "d": [850], "a": 1 }, + { "px": [816,456], "src": [48,0], "f": 0, "t": 2, "d": [851], "a": 1 }, + { "px": [840,456], "src": [72,0], "f": 0, "t": 3, "d": [852], "a": 1 }, + { "px": [864,456], "src": [0,0], "f": 0, "t": 0, "d": [853], "a": 1 }, + { "px": [888,456], "src": [24,0], "f": 0, "t": 1, "d": [854], "a": 1 }, + { "px": [912,456], "src": [48,0], "f": 0, "t": 2, "d": [855], "a": 1 }, + { "px": [936,456], "src": [72,0], "f": 0, "t": 3, "d": [856], "a": 1 }, + { "px": [960,456], "src": [0,0], "f": 0, "t": 0, "d": [857], "a": 1 }, + { "px": [984,456], "src": [24,0], "f": 0, "t": 1, "d": [858], "a": 1 }, + { "px": [1008,456], "src": [48,0], "f": 0, "t": 2, "d": [859], "a": 1 }, + { "px": [0,480], "src": [0,0], "f": 0, "t": 0, "d": [860], "a": 1 }, + { "px": [24,480], "src": [24,0], "f": 0, "t": 1, "d": [861], "a": 1 }, + { "px": [48,480], "src": [48,0], "f": 0, "t": 2, "d": [862], "a": 1 }, + { "px": [72,480], "src": [72,0], "f": 0, "t": 3, "d": [863], "a": 1 }, + { "px": [96,480], "src": [0,0], "f": 0, "t": 0, "d": [864], "a": 1 }, + { "px": [120,480], "src": [24,0], "f": 0, "t": 1, "d": [865], "a": 1 }, + { "px": [144,480], "src": [48,0], "f": 0, "t": 2, "d": [866], "a": 1 }, + { "px": [168,480], "src": [72,0], "f": 0, "t": 3, "d": [867], "a": 1 }, + { "px": [192,480], "src": [0,0], "f": 0, "t": 0, "d": [868], "a": 1 }, + { "px": [216,480], "src": [24,0], "f": 0, "t": 1, "d": [869], "a": 1 }, + { "px": [240,480], "src": [48,0], "f": 0, "t": 2, "d": [870], "a": 1 }, + { "px": [264,480], "src": [72,0], "f": 0, "t": 3, "d": [871], "a": 1 }, + { "px": [288,480], "src": [0,0], "f": 0, "t": 0, "d": [872], "a": 1 }, + { "px": [312,480], "src": [24,0], "f": 0, "t": 1, "d": [873], "a": 1 }, + { "px": [336,480], "src": [48,0], "f": 0, "t": 2, "d": [874], "a": 1 }, + { "px": [360,480], "src": [72,0], "f": 0, "t": 3, "d": [875], "a": 1 }, + { "px": [384,480], "src": [0,0], "f": 0, "t": 0, "d": [876], "a": 1 }, + { "px": [408,480], "src": [24,0], "f": 0, "t": 1, "d": [877], "a": 1 }, + { "px": [432,480], "src": [48,0], "f": 0, "t": 2, "d": [878], "a": 1 }, + { "px": [456,480], "src": [72,0], "f": 0, "t": 3, "d": [879], "a": 1 }, + { "px": [480,480], "src": [0,0], "f": 0, "t": 0, "d": [880], "a": 1 }, + { "px": [504,480], "src": [24,0], "f": 0, "t": 1, "d": [881], "a": 1 }, + { "px": [528,480], "src": [48,0], "f": 0, "t": 2, "d": [882], "a": 1 }, + { "px": [552,480], "src": [72,0], "f": 0, "t": 3, "d": [883], "a": 1 }, + { "px": [576,480], "src": [0,0], "f": 0, "t": 0, "d": [884], "a": 1 }, + { "px": [600,480], "src": [24,0], "f": 0, "t": 1, "d": [885], "a": 1 }, + { "px": [624,480], "src": [48,0], "f": 0, "t": 2, "d": [886], "a": 1 }, + { "px": [648,480], "src": [72,0], "f": 0, "t": 3, "d": [887], "a": 1 }, + { "px": [672,480], "src": [0,0], "f": 0, "t": 0, "d": [888], "a": 1 }, + { "px": [696,480], "src": [24,0], "f": 0, "t": 1, "d": [889], "a": 1 }, + { "px": [720,480], "src": [48,0], "f": 0, "t": 2, "d": [890], "a": 1 }, + { "px": [744,480], "src": [72,0], "f": 0, "t": 3, "d": [891], "a": 1 }, + { "px": [768,480], "src": [0,0], "f": 0, "t": 0, "d": [892], "a": 1 }, + { "px": [792,480], "src": [24,0], "f": 0, "t": 1, "d": [893], "a": 1 }, + { "px": [816,480], "src": [48,0], "f": 0, "t": 2, "d": [894], "a": 1 }, + { "px": [840,480], "src": [72,0], "f": 0, "t": 3, "d": [895], "a": 1 }, + { "px": [864,480], "src": [0,0], "f": 0, "t": 0, "d": [896], "a": 1 }, + { "px": [888,480], "src": [24,0], "f": 0, "t": 1, "d": [897], "a": 1 }, + { "px": [912,480], "src": [48,0], "f": 0, "t": 2, "d": [898], "a": 1 }, + { "px": [936,480], "src": [72,0], "f": 0, "t": 3, "d": [899], "a": 1 }, + { "px": [960,480], "src": [0,0], "f": 0, "t": 0, "d": [900], "a": 1 }, + { "px": [984,480], "src": [24,0], "f": 0, "t": 1, "d": [901], "a": 1 }, + { "px": [1008,480], "src": [48,0], "f": 0, "t": 2, "d": [902], "a": 1 }, + { "px": [0,504], "src": [0,0], "f": 0, "t": 0, "d": [903], "a": 1 }, + { "px": [24,504], "src": [24,0], "f": 0, "t": 1, "d": [904], "a": 1 }, + { "px": [48,504], "src": [48,0], "f": 0, "t": 2, "d": [905], "a": 1 }, + { "px": [72,504], "src": [72,0], "f": 0, "t": 3, "d": [906], "a": 1 }, + { "px": [96,504], "src": [0,0], "f": 0, "t": 0, "d": [907], "a": 1 }, + { "px": [120,504], "src": [24,0], "f": 0, "t": 1, "d": [908], "a": 1 }, + { "px": [144,504], "src": [48,0], "f": 0, "t": 2, "d": [909], "a": 1 }, + { "px": [168,504], "src": [72,0], "f": 0, "t": 3, "d": [910], "a": 1 }, + { "px": [192,504], "src": [0,0], "f": 0, "t": 0, "d": [911], "a": 1 }, + { "px": [216,504], "src": [24,0], "f": 0, "t": 1, "d": [912], "a": 1 }, + { "px": [240,504], "src": [48,0], "f": 0, "t": 2, "d": [913], "a": 1 }, + { "px": [264,504], "src": [72,0], "f": 0, "t": 3, "d": [914], "a": 1 }, + { "px": [288,504], "src": [0,0], "f": 0, "t": 0, "d": [915], "a": 1 }, + { "px": [312,504], "src": [24,0], "f": 0, "t": 1, "d": [916], "a": 1 }, + { "px": [336,504], "src": [48,0], "f": 0, "t": 2, "d": [917], "a": 1 }, + { "px": [360,504], "src": [72,0], "f": 0, "t": 3, "d": [918], "a": 1 }, + { "px": [384,504], "src": [0,0], "f": 0, "t": 0, "d": [919], "a": 1 }, + { "px": [408,504], "src": [24,0], "f": 0, "t": 1, "d": [920], "a": 1 }, + { "px": [432,504], "src": [48,0], "f": 0, "t": 2, "d": [921], "a": 1 }, + { "px": [456,504], "src": [72,0], "f": 0, "t": 3, "d": [922], "a": 1 }, + { "px": [480,504], "src": [0,0], "f": 0, "t": 0, "d": [923], "a": 1 }, + { "px": [504,504], "src": [24,0], "f": 0, "t": 1, "d": [924], "a": 1 }, + { "px": [528,504], "src": [48,0], "f": 0, "t": 2, "d": [925], "a": 1 }, + { "px": [552,504], "src": [72,0], "f": 0, "t": 3, "d": [926], "a": 1 }, + { "px": [576,504], "src": [0,0], "f": 0, "t": 0, "d": [927], "a": 1 }, + { "px": [600,504], "src": [24,0], "f": 0, "t": 1, "d": [928], "a": 1 }, + { "px": [624,504], "src": [48,0], "f": 0, "t": 2, "d": [929], "a": 1 }, + { "px": [648,504], "src": [72,0], "f": 0, "t": 3, "d": [930], "a": 1 }, + { "px": [672,504], "src": [0,0], "f": 0, "t": 0, "d": [931], "a": 1 }, + { "px": [696,504], "src": [24,0], "f": 0, "t": 1, "d": [932], "a": 1 }, + { "px": [720,504], "src": [48,0], "f": 0, "t": 2, "d": [933], "a": 1 }, + { "px": [744,504], "src": [72,0], "f": 0, "t": 3, "d": [934], "a": 1 }, + { "px": [768,504], "src": [0,0], "f": 0, "t": 0, "d": [935], "a": 1 }, + { "px": [792,504], "src": [24,0], "f": 0, "t": 1, "d": [936], "a": 1 }, + { "px": [816,504], "src": [48,0], "f": 0, "t": 2, "d": [937], "a": 1 }, + { "px": [840,504], "src": [72,0], "f": 0, "t": 3, "d": [938], "a": 1 }, + { "px": [864,504], "src": [0,0], "f": 0, "t": 0, "d": [939], "a": 1 }, + { "px": [888,504], "src": [24,0], "f": 0, "t": 1, "d": [940], "a": 1 }, + { "px": [912,504], "src": [48,0], "f": 0, "t": 2, "d": [941], "a": 1 }, + { "px": [936,504], "src": [72,0], "f": 0, "t": 3, "d": [942], "a": 1 }, + { "px": [960,504], "src": [0,0], "f": 0, "t": 0, "d": [943], "a": 1 }, + { "px": [984,504], "src": [24,0], "f": 0, "t": 1, "d": [944], "a": 1 }, + { "px": [1008,504], "src": [48,0], "f": 0, "t": 2, "d": [945], "a": 1 }, + { "px": [0,528], "src": [0,0], "f": 0, "t": 0, "d": [946], "a": 1 }, + { "px": [24,528], "src": [24,0], "f": 0, "t": 1, "d": [947], "a": 1 }, + { "px": [48,528], "src": [48,0], "f": 0, "t": 2, "d": [948], "a": 1 }, + { "px": [72,528], "src": [72,0], "f": 0, "t": 3, "d": [949], "a": 1 }, + { "px": [96,528], "src": [0,0], "f": 0, "t": 0, "d": [950], "a": 1 }, + { "px": [120,528], "src": [24,0], "f": 0, "t": 1, "d": [951], "a": 1 }, + { "px": [144,528], "src": [48,0], "f": 0, "t": 2, "d": [952], "a": 1 }, + { "px": [168,528], "src": [72,0], "f": 0, "t": 3, "d": [953], "a": 1 }, + { "px": [192,528], "src": [0,0], "f": 0, "t": 0, "d": [954], "a": 1 }, + { "px": [216,528], "src": [24,0], "f": 0, "t": 1, "d": [955], "a": 1 }, + { "px": [240,528], "src": [48,0], "f": 0, "t": 2, "d": [956], "a": 1 }, + { "px": [264,528], "src": [72,0], "f": 0, "t": 3, "d": [957], "a": 1 }, + { "px": [288,528], "src": [0,0], "f": 0, "t": 0, "d": [958], "a": 1 }, + { "px": [312,528], "src": [24,0], "f": 0, "t": 1, "d": [959], "a": 1 }, + { "px": [336,528], "src": [48,0], "f": 0, "t": 2, "d": [960], "a": 1 }, + { "px": [360,528], "src": [72,0], "f": 0, "t": 3, "d": [961], "a": 1 }, + { "px": [384,528], "src": [0,0], "f": 0, "t": 0, "d": [962], "a": 1 }, + { "px": [408,528], "src": [24,0], "f": 0, "t": 1, "d": [963], "a": 1 }, + { "px": [432,528], "src": [48,0], "f": 0, "t": 2, "d": [964], "a": 1 }, + { "px": [456,528], "src": [72,0], "f": 0, "t": 3, "d": [965], "a": 1 }, + { "px": [480,528], "src": [0,0], "f": 0, "t": 0, "d": [966], "a": 1 }, + { "px": [504,528], "src": [24,0], "f": 0, "t": 1, "d": [967], "a": 1 }, + { "px": [528,528], "src": [48,0], "f": 0, "t": 2, "d": [968], "a": 1 }, + { "px": [552,528], "src": [72,0], "f": 0, "t": 3, "d": [969], "a": 1 }, + { "px": [576,528], "src": [0,0], "f": 0, "t": 0, "d": [970], "a": 1 }, + { "px": [600,528], "src": [24,0], "f": 0, "t": 1, "d": [971], "a": 1 }, + { "px": [624,528], "src": [48,0], "f": 0, "t": 2, "d": [972], "a": 1 }, + { "px": [648,528], "src": [72,0], "f": 0, "t": 3, "d": [973], "a": 1 }, + { "px": [672,528], "src": [0,0], "f": 0, "t": 0, "d": [974], "a": 1 }, + { "px": [696,528], "src": [24,0], "f": 0, "t": 1, "d": [975], "a": 1 }, + { "px": [720,528], "src": [48,0], "f": 0, "t": 2, "d": [976], "a": 1 }, + { "px": [744,528], "src": [72,0], "f": 0, "t": 3, "d": [977], "a": 1 }, + { "px": [768,528], "src": [0,0], "f": 0, "t": 0, "d": [978], "a": 1 }, + { "px": [792,528], "src": [24,0], "f": 0, "t": 1, "d": [979], "a": 1 }, + { "px": [816,528], "src": [48,0], "f": 0, "t": 2, "d": [980], "a": 1 }, + { "px": [840,528], "src": [72,0], "f": 0, "t": 3, "d": [981], "a": 1 }, + { "px": [864,528], "src": [0,0], "f": 0, "t": 0, "d": [982], "a": 1 }, + { "px": [888,528], "src": [24,0], "f": 0, "t": 1, "d": [983], "a": 1 }, + { "px": [912,528], "src": [48,0], "f": 0, "t": 2, "d": [984], "a": 1 }, + { "px": [936,528], "src": [72,0], "f": 0, "t": 3, "d": [985], "a": 1 }, + { "px": [960,528], "src": [0,0], "f": 0, "t": 0, "d": [986], "a": 1 }, + { "px": [984,528], "src": [24,0], "f": 0, "t": 1, "d": [987], "a": 1 }, + { "px": [1008,528], "src": [48,0], "f": 0, "t": 2, "d": [988], "a": 1 }, + { "px": [0,552], "src": [0,0], "f": 0, "t": 0, "d": [989], "a": 1 }, + { "px": [24,552], "src": [24,0], "f": 0, "t": 1, "d": [990], "a": 1 }, + { "px": [48,552], "src": [48,0], "f": 0, "t": 2, "d": [991], "a": 1 }, + { "px": [72,552], "src": [72,0], "f": 0, "t": 3, "d": [992], "a": 1 }, + { "px": [96,552], "src": [0,0], "f": 0, "t": 0, "d": [993], "a": 1 }, + { "px": [120,552], "src": [24,0], "f": 0, "t": 1, "d": [994], "a": 1 }, + { "px": [144,552], "src": [48,0], "f": 0, "t": 2, "d": [995], "a": 1 }, + { "px": [168,552], "src": [72,0], "f": 0, "t": 3, "d": [996], "a": 1 }, + { "px": [192,552], "src": [0,0], "f": 0, "t": 0, "d": [997], "a": 1 }, + { "px": [216,552], "src": [24,0], "f": 0, "t": 1, "d": [998], "a": 1 }, + { "px": [240,552], "src": [48,0], "f": 0, "t": 2, "d": [999], "a": 1 }, + { "px": [264,552], "src": [72,0], "f": 0, "t": 3, "d": [1000], "a": 1 }, + { "px": [288,552], "src": [0,0], "f": 0, "t": 0, "d": [1001], "a": 1 }, + { "px": [312,552], "src": [24,0], "f": 0, "t": 1, "d": [1002], "a": 1 }, + { "px": [336,552], "src": [48,0], "f": 0, "t": 2, "d": [1003], "a": 1 }, + { "px": [360,552], "src": [72,0], "f": 0, "t": 3, "d": [1004], "a": 1 }, + { "px": [384,552], "src": [0,0], "f": 0, "t": 0, "d": [1005], "a": 1 }, + { "px": [408,552], "src": [24,0], "f": 0, "t": 1, "d": [1006], "a": 1 }, + { "px": [432,552], "src": [48,0], "f": 0, "t": 2, "d": [1007], "a": 1 }, + { "px": [456,552], "src": [72,0], "f": 0, "t": 3, "d": [1008], "a": 1 }, + { "px": [480,552], "src": [0,0], "f": 0, "t": 0, "d": [1009], "a": 1 }, + { "px": [504,552], "src": [24,0], "f": 0, "t": 1, "d": [1010], "a": 1 }, + { "px": [528,552], "src": [48,0], "f": 0, "t": 2, "d": [1011], "a": 1 }, + { "px": [552,552], "src": [72,0], "f": 0, "t": 3, "d": [1012], "a": 1 }, + { "px": [576,552], "src": [0,0], "f": 0, "t": 0, "d": [1013], "a": 1 }, + { "px": [600,552], "src": [24,0], "f": 0, "t": 1, "d": [1014], "a": 1 }, + { "px": [624,552], "src": [48,0], "f": 0, "t": 2, "d": [1015], "a": 1 }, + { "px": [648,552], "src": [72,0], "f": 0, "t": 3, "d": [1016], "a": 1 }, + { "px": [672,552], "src": [0,0], "f": 0, "t": 0, "d": [1017], "a": 1 }, + { "px": [696,552], "src": [24,0], "f": 0, "t": 1, "d": [1018], "a": 1 }, + { "px": [720,552], "src": [48,0], "f": 0, "t": 2, "d": [1019], "a": 1 }, + { "px": [744,552], "src": [72,0], "f": 0, "t": 3, "d": [1020], "a": 1 }, + { "px": [768,552], "src": [0,0], "f": 0, "t": 0, "d": [1021], "a": 1 }, + { "px": [792,552], "src": [24,0], "f": 0, "t": 1, "d": [1022], "a": 1 }, + { "px": [816,552], "src": [48,0], "f": 0, "t": 2, "d": [1023], "a": 1 }, + { "px": [840,552], "src": [72,0], "f": 0, "t": 3, "d": [1024], "a": 1 }, + { "px": [864,552], "src": [0,0], "f": 0, "t": 0, "d": [1025], "a": 1 }, + { "px": [888,552], "src": [24,0], "f": 0, "t": 1, "d": [1026], "a": 1 }, + { "px": [912,552], "src": [48,0], "f": 0, "t": 2, "d": [1027], "a": 1 }, + { "px": [936,552], "src": [72,0], "f": 0, "t": 3, "d": [1028], "a": 1 }, + { "px": [960,552], "src": [0,0], "f": 0, "t": 0, "d": [1029], "a": 1 }, + { "px": [984,552], "src": [24,0], "f": 0, "t": 1, "d": [1030], "a": 1 }, + { "px": [1008,552], "src": [48,0], "f": 0, "t": 2, "d": [1031], "a": 1 }, + { "px": [0,576], "src": [0,0], "f": 0, "t": 0, "d": [1032], "a": 1 }, + { "px": [24,576], "src": [24,0], "f": 0, "t": 1, "d": [1033], "a": 1 }, + { "px": [48,576], "src": [48,0], "f": 0, "t": 2, "d": [1034], "a": 1 }, + { "px": [72,576], "src": [72,0], "f": 0, "t": 3, "d": [1035], "a": 1 }, + { "px": [96,576], "src": [0,0], "f": 0, "t": 0, "d": [1036], "a": 1 }, + { "px": [120,576], "src": [24,0], "f": 0, "t": 1, "d": [1037], "a": 1 }, + { "px": [144,576], "src": [48,0], "f": 0, "t": 2, "d": [1038], "a": 1 }, + { "px": [168,576], "src": [72,0], "f": 0, "t": 3, "d": [1039], "a": 1 }, + { "px": [192,576], "src": [0,0], "f": 0, "t": 0, "d": [1040], "a": 1 }, + { "px": [216,576], "src": [24,0], "f": 0, "t": 1, "d": [1041], "a": 1 }, + { "px": [240,576], "src": [48,0], "f": 0, "t": 2, "d": [1042], "a": 1 }, + { "px": [264,576], "src": [72,0], "f": 0, "t": 3, "d": [1043], "a": 1 }, + { "px": [288,576], "src": [0,0], "f": 0, "t": 0, "d": [1044], "a": 1 }, + { "px": [312,576], "src": [24,0], "f": 0, "t": 1, "d": [1045], "a": 1 }, + { "px": [336,576], "src": [48,0], "f": 0, "t": 2, "d": [1046], "a": 1 }, + { "px": [360,576], "src": [72,0], "f": 0, "t": 3, "d": [1047], "a": 1 }, + { "px": [384,576], "src": [0,0], "f": 0, "t": 0, "d": [1048], "a": 1 }, + { "px": [408,576], "src": [24,0], "f": 0, "t": 1, "d": [1049], "a": 1 }, + { "px": [432,576], "src": [48,0], "f": 0, "t": 2, "d": [1050], "a": 1 }, + { "px": [456,576], "src": [72,0], "f": 0, "t": 3, "d": [1051], "a": 1 }, + { "px": [480,576], "src": [0,0], "f": 0, "t": 0, "d": [1052], "a": 1 }, + { "px": [504,576], "src": [24,0], "f": 0, "t": 1, "d": [1053], "a": 1 }, + { "px": [528,576], "src": [48,0], "f": 0, "t": 2, "d": [1054], "a": 1 }, + { "px": [552,576], "src": [72,0], "f": 0, "t": 3, "d": [1055], "a": 1 }, + { "px": [576,576], "src": [0,0], "f": 0, "t": 0, "d": [1056], "a": 1 }, + { "px": [600,576], "src": [24,0], "f": 0, "t": 1, "d": [1057], "a": 1 }, + { "px": [624,576], "src": [48,0], "f": 0, "t": 2, "d": [1058], "a": 1 }, + { "px": [648,576], "src": [72,0], "f": 0, "t": 3, "d": [1059], "a": 1 }, + { "px": [672,576], "src": [0,0], "f": 0, "t": 0, "d": [1060], "a": 1 }, + { "px": [696,576], "src": [24,0], "f": 0, "t": 1, "d": [1061], "a": 1 }, + { "px": [720,576], "src": [48,0], "f": 0, "t": 2, "d": [1062], "a": 1 }, + { "px": [744,576], "src": [72,0], "f": 0, "t": 3, "d": [1063], "a": 1 }, + { "px": [768,576], "src": [0,0], "f": 0, "t": 0, "d": [1064], "a": 1 }, + { "px": [792,576], "src": [24,0], "f": 0, "t": 1, "d": [1065], "a": 1 }, + { "px": [816,576], "src": [48,0], "f": 0, "t": 2, "d": [1066], "a": 1 }, + { "px": [840,576], "src": [72,0], "f": 0, "t": 3, "d": [1067], "a": 1 }, + { "px": [864,576], "src": [0,0], "f": 0, "t": 0, "d": [1068], "a": 1 }, + { "px": [888,576], "src": [24,0], "f": 0, "t": 1, "d": [1069], "a": 1 }, + { "px": [912,576], "src": [48,0], "f": 0, "t": 2, "d": [1070], "a": 1 }, + { "px": [936,576], "src": [72,0], "f": 0, "t": 3, "d": [1071], "a": 1 }, + { "px": [960,576], "src": [0,0], "f": 0, "t": 0, "d": [1072], "a": 1 }, + { "px": [984,576], "src": [24,0], "f": 0, "t": 1, "d": [1073], "a": 1 }, + { "px": [1008,576], "src": [48,0], "f": 0, "t": 2, "d": [1074], "a": 1 }, + { "px": [0,600], "src": [0,0], "f": 0, "t": 0, "d": [1075], "a": 1 }, + { "px": [24,600], "src": [24,0], "f": 0, "t": 1, "d": [1076], "a": 1 }, + { "px": [48,600], "src": [48,0], "f": 0, "t": 2, "d": [1077], "a": 1 }, + { "px": [72,600], "src": [72,0], "f": 0, "t": 3, "d": [1078], "a": 1 }, + { "px": [96,600], "src": [0,0], "f": 0, "t": 0, "d": [1079], "a": 1 }, + { "px": [120,600], "src": [24,0], "f": 0, "t": 1, "d": [1080], "a": 1 }, + { "px": [144,600], "src": [48,0], "f": 0, "t": 2, "d": [1081], "a": 1 }, + { "px": [168,600], "src": [72,0], "f": 0, "t": 3, "d": [1082], "a": 1 }, + { "px": [192,600], "src": [0,0], "f": 0, "t": 0, "d": [1083], "a": 1 }, + { "px": [216,600], "src": [24,0], "f": 0, "t": 1, "d": [1084], "a": 1 }, + { "px": [240,600], "src": [48,0], "f": 0, "t": 2, "d": [1085], "a": 1 }, + { "px": [264,600], "src": [72,0], "f": 0, "t": 3, "d": [1086], "a": 1 }, + { "px": [288,600], "src": [0,0], "f": 0, "t": 0, "d": [1087], "a": 1 }, + { "px": [312,600], "src": [24,0], "f": 0, "t": 1, "d": [1088], "a": 1 }, + { "px": [336,600], "src": [48,0], "f": 0, "t": 2, "d": [1089], "a": 1 }, + { "px": [360,600], "src": [72,0], "f": 0, "t": 3, "d": [1090], "a": 1 }, + { "px": [384,600], "src": [0,0], "f": 0, "t": 0, "d": [1091], "a": 1 }, + { "px": [408,600], "src": [24,0], "f": 0, "t": 1, "d": [1092], "a": 1 }, + { "px": [432,600], "src": [48,0], "f": 0, "t": 2, "d": [1093], "a": 1 }, + { "px": [456,600], "src": [72,0], "f": 0, "t": 3, "d": [1094], "a": 1 }, + { "px": [480,600], "src": [0,0], "f": 0, "t": 0, "d": [1095], "a": 1 }, + { "px": [504,600], "src": [24,0], "f": 0, "t": 1, "d": [1096], "a": 1 }, + { "px": [528,600], "src": [48,0], "f": 0, "t": 2, "d": [1097], "a": 1 }, + { "px": [552,600], "src": [72,0], "f": 0, "t": 3, "d": [1098], "a": 1 }, + { "px": [576,600], "src": [0,0], "f": 0, "t": 0, "d": [1099], "a": 1 }, + { "px": [600,600], "src": [24,0], "f": 0, "t": 1, "d": [1100], "a": 1 }, + { "px": [624,600], "src": [48,0], "f": 0, "t": 2, "d": [1101], "a": 1 }, + { "px": [648,600], "src": [72,0], "f": 0, "t": 3, "d": [1102], "a": 1 }, + { "px": [672,600], "src": [0,0], "f": 0, "t": 0, "d": [1103], "a": 1 }, + { "px": [696,600], "src": [24,0], "f": 0, "t": 1, "d": [1104], "a": 1 }, + { "px": [720,600], "src": [48,0], "f": 0, "t": 2, "d": [1105], "a": 1 }, + { "px": [744,600], "src": [72,0], "f": 0, "t": 3, "d": [1106], "a": 1 }, + { "px": [768,600], "src": [0,0], "f": 0, "t": 0, "d": [1107], "a": 1 }, + { "px": [792,600], "src": [24,0], "f": 0, "t": 1, "d": [1108], "a": 1 }, + { "px": [816,600], "src": [48,0], "f": 0, "t": 2, "d": [1109], "a": 1 }, + { "px": [840,600], "src": [72,0], "f": 0, "t": 3, "d": [1110], "a": 1 }, + { "px": [864,600], "src": [0,0], "f": 0, "t": 0, "d": [1111], "a": 1 }, + { "px": [888,600], "src": [24,0], "f": 0, "t": 1, "d": [1112], "a": 1 }, + { "px": [912,600], "src": [48,0], "f": 0, "t": 2, "d": [1113], "a": 1 }, + { "px": [936,600], "src": [72,0], "f": 0, "t": 3, "d": [1114], "a": 1 }, + { "px": [960,600], "src": [0,0], "f": 0, "t": 0, "d": [1115], "a": 1 }, + { "px": [984,600], "src": [24,0], "f": 0, "t": 1, "d": [1116], "a": 1 }, + { "px": [1008,600], "src": [48,0], "f": 0, "t": 2, "d": [1117], "a": 1 }, + { "px": [0,624], "src": [0,0], "f": 0, "t": 0, "d": [1118], "a": 1 }, + { "px": [24,624], "src": [24,0], "f": 0, "t": 1, "d": [1119], "a": 1 }, + { "px": [48,624], "src": [48,0], "f": 0, "t": 2, "d": [1120], "a": 1 }, + { "px": [72,624], "src": [72,0], "f": 0, "t": 3, "d": [1121], "a": 1 }, + { "px": [96,624], "src": [0,0], "f": 0, "t": 0, "d": [1122], "a": 1 }, + { "px": [120,624], "src": [24,0], "f": 0, "t": 1, "d": [1123], "a": 1 }, + { "px": [144,624], "src": [48,0], "f": 0, "t": 2, "d": [1124], "a": 1 }, + { "px": [168,624], "src": [72,0], "f": 0, "t": 3, "d": [1125], "a": 1 }, + { "px": [192,624], "src": [0,0], "f": 0, "t": 0, "d": [1126], "a": 1 }, + { "px": [216,624], "src": [24,0], "f": 0, "t": 1, "d": [1127], "a": 1 }, + { "px": [240,624], "src": [48,0], "f": 0, "t": 2, "d": [1128], "a": 1 }, + { "px": [264,624], "src": [72,0], "f": 0, "t": 3, "d": [1129], "a": 1 }, + { "px": [288,624], "src": [0,0], "f": 0, "t": 0, "d": [1130], "a": 1 }, + { "px": [312,624], "src": [24,0], "f": 0, "t": 1, "d": [1131], "a": 1 }, + { "px": [336,624], "src": [48,0], "f": 0, "t": 2, "d": [1132], "a": 1 }, + { "px": [360,624], "src": [72,0], "f": 0, "t": 3, "d": [1133], "a": 1 }, + { "px": [384,624], "src": [0,0], "f": 0, "t": 0, "d": [1134], "a": 1 }, + { "px": [408,624], "src": [24,0], "f": 0, "t": 1, "d": [1135], "a": 1 }, + { "px": [432,624], "src": [48,0], "f": 0, "t": 2, "d": [1136], "a": 1 }, + { "px": [456,624], "src": [72,0], "f": 0, "t": 3, "d": [1137], "a": 1 }, + { "px": [480,624], "src": [0,0], "f": 0, "t": 0, "d": [1138], "a": 1 }, + { "px": [504,624], "src": [24,0], "f": 0, "t": 1, "d": [1139], "a": 1 }, + { "px": [528,624], "src": [48,0], "f": 0, "t": 2, "d": [1140], "a": 1 }, + { "px": [552,624], "src": [72,0], "f": 0, "t": 3, "d": [1141], "a": 1 }, + { "px": [576,624], "src": [0,0], "f": 0, "t": 0, "d": [1142], "a": 1 }, + { "px": [600,624], "src": [24,0], "f": 0, "t": 1, "d": [1143], "a": 1 }, + { "px": [624,624], "src": [48,0], "f": 0, "t": 2, "d": [1144], "a": 1 }, + { "px": [648,624], "src": [72,0], "f": 0, "t": 3, "d": [1145], "a": 1 }, + { "px": [672,624], "src": [0,0], "f": 0, "t": 0, "d": [1146], "a": 1 }, + { "px": [696,624], "src": [24,0], "f": 0, "t": 1, "d": [1147], "a": 1 }, + { "px": [720,624], "src": [48,0], "f": 0, "t": 2, "d": [1148], "a": 1 }, + { "px": [744,624], "src": [72,0], "f": 0, "t": 3, "d": [1149], "a": 1 }, + { "px": [768,624], "src": [0,0], "f": 0, "t": 0, "d": [1150], "a": 1 }, + { "px": [792,624], "src": [24,0], "f": 0, "t": 1, "d": [1151], "a": 1 }, + { "px": [816,624], "src": [48,0], "f": 0, "t": 2, "d": [1152], "a": 1 }, + { "px": [840,624], "src": [72,0], "f": 0, "t": 3, "d": [1153], "a": 1 }, + { "px": [864,624], "src": [0,0], "f": 0, "t": 0, "d": [1154], "a": 1 }, + { "px": [888,624], "src": [24,0], "f": 0, "t": 1, "d": [1155], "a": 1 }, + { "px": [912,624], "src": [48,0], "f": 0, "t": 2, "d": [1156], "a": 1 }, + { "px": [936,624], "src": [72,0], "f": 0, "t": 3, "d": [1157], "a": 1 }, + { "px": [960,624], "src": [0,0], "f": 0, "t": 0, "d": [1158], "a": 1 }, + { "px": [984,624], "src": [24,0], "f": 0, "t": 1, "d": [1159], "a": 1 }, + { "px": [1008,624], "src": [48,0], "f": 0, "t": 2, "d": [1160], "a": 1 }, + { "px": [0,648], "src": [0,0], "f": 0, "t": 0, "d": [1161], "a": 1 }, + { "px": [24,648], "src": [24,0], "f": 0, "t": 1, "d": [1162], "a": 1 }, + { "px": [48,648], "src": [48,0], "f": 0, "t": 2, "d": [1163], "a": 1 }, + { "px": [72,648], "src": [72,0], "f": 0, "t": 3, "d": [1164], "a": 1 }, + { "px": [96,648], "src": [0,0], "f": 0, "t": 0, "d": [1165], "a": 1 }, + { "px": [120,648], "src": [24,0], "f": 0, "t": 1, "d": [1166], "a": 1 }, + { "px": [144,648], "src": [48,0], "f": 0, "t": 2, "d": [1167], "a": 1 }, + { "px": [168,648], "src": [72,0], "f": 0, "t": 3, "d": [1168], "a": 1 }, + { "px": [192,648], "src": [0,0], "f": 0, "t": 0, "d": [1169], "a": 1 }, + { "px": [216,648], "src": [24,0], "f": 0, "t": 1, "d": [1170], "a": 1 }, + { "px": [240,648], "src": [48,0], "f": 0, "t": 2, "d": [1171], "a": 1 }, + { "px": [264,648], "src": [72,0], "f": 0, "t": 3, "d": [1172], "a": 1 }, + { "px": [288,648], "src": [0,0], "f": 0, "t": 0, "d": [1173], "a": 1 }, + { "px": [312,648], "src": [24,0], "f": 0, "t": 1, "d": [1174], "a": 1 }, + { "px": [336,648], "src": [48,0], "f": 0, "t": 2, "d": [1175], "a": 1 }, + { "px": [360,648], "src": [72,0], "f": 0, "t": 3, "d": [1176], "a": 1 }, + { "px": [384,648], "src": [0,0], "f": 0, "t": 0, "d": [1177], "a": 1 }, + { "px": [408,648], "src": [24,0], "f": 0, "t": 1, "d": [1178], "a": 1 }, + { "px": [432,648], "src": [48,0], "f": 0, "t": 2, "d": [1179], "a": 1 }, + { "px": [456,648], "src": [72,0], "f": 0, "t": 3, "d": [1180], "a": 1 }, + { "px": [480,648], "src": [0,0], "f": 0, "t": 0, "d": [1181], "a": 1 }, + { "px": [504,648], "src": [24,0], "f": 0, "t": 1, "d": [1182], "a": 1 }, + { "px": [528,648], "src": [48,0], "f": 0, "t": 2, "d": [1183], "a": 1 }, + { "px": [552,648], "src": [72,0], "f": 0, "t": 3, "d": [1184], "a": 1 }, + { "px": [576,648], "src": [0,0], "f": 0, "t": 0, "d": [1185], "a": 1 }, + { "px": [600,648], "src": [24,0], "f": 0, "t": 1, "d": [1186], "a": 1 }, + { "px": [624,648], "src": [48,0], "f": 0, "t": 2, "d": [1187], "a": 1 }, + { "px": [648,648], "src": [72,0], "f": 0, "t": 3, "d": [1188], "a": 1 }, + { "px": [672,648], "src": [0,0], "f": 0, "t": 0, "d": [1189], "a": 1 }, + { "px": [696,648], "src": [24,0], "f": 0, "t": 1, "d": [1190], "a": 1 }, + { "px": [720,648], "src": [48,0], "f": 0, "t": 2, "d": [1191], "a": 1 }, + { "px": [744,648], "src": [72,0], "f": 0, "t": 3, "d": [1192], "a": 1 }, + { "px": [768,648], "src": [0,0], "f": 0, "t": 0, "d": [1193], "a": 1 }, + { "px": [792,648], "src": [24,0], "f": 0, "t": 1, "d": [1194], "a": 1 }, + { "px": [816,648], "src": [48,0], "f": 0, "t": 2, "d": [1195], "a": 1 }, + { "px": [840,648], "src": [72,0], "f": 0, "t": 3, "d": [1196], "a": 1 }, + { "px": [864,648], "src": [0,0], "f": 0, "t": 0, "d": [1197], "a": 1 }, + { "px": [888,648], "src": [24,0], "f": 0, "t": 1, "d": [1198], "a": 1 }, + { "px": [912,648], "src": [48,0], "f": 0, "t": 2, "d": [1199], "a": 1 }, + { "px": [936,648], "src": [72,0], "f": 0, "t": 3, "d": [1200], "a": 1 }, + { "px": [960,648], "src": [0,0], "f": 0, "t": 0, "d": [1201], "a": 1 }, + { "px": [984,648], "src": [24,0], "f": 0, "t": 1, "d": [1202], "a": 1 }, + { "px": [1008,648], "src": [48,0], "f": 0, "t": 2, "d": [1203], "a": 1 }, + { "px": [0,672], "src": [0,0], "f": 0, "t": 0, "d": [1204], "a": 1 }, + { "px": [24,672], "src": [24,0], "f": 0, "t": 1, "d": [1205], "a": 1 }, + { "px": [48,672], "src": [48,0], "f": 0, "t": 2, "d": [1206], "a": 1 }, + { "px": [72,672], "src": [72,0], "f": 0, "t": 3, "d": [1207], "a": 1 }, + { "px": [96,672], "src": [0,0], "f": 0, "t": 0, "d": [1208], "a": 1 }, + { "px": [120,672], "src": [24,0], "f": 0, "t": 1, "d": [1209], "a": 1 }, + { "px": [144,672], "src": [48,0], "f": 0, "t": 2, "d": [1210], "a": 1 }, + { "px": [168,672], "src": [72,0], "f": 0, "t": 3, "d": [1211], "a": 1 }, + { "px": [192,672], "src": [0,0], "f": 0, "t": 0, "d": [1212], "a": 1 }, + { "px": [216,672], "src": [24,0], "f": 0, "t": 1, "d": [1213], "a": 1 }, + { "px": [240,672], "src": [48,0], "f": 0, "t": 2, "d": [1214], "a": 1 }, + { "px": [264,672], "src": [72,0], "f": 0, "t": 3, "d": [1215], "a": 1 }, + { "px": [288,672], "src": [0,0], "f": 0, "t": 0, "d": [1216], "a": 1 }, + { "px": [312,672], "src": [24,0], "f": 0, "t": 1, "d": [1217], "a": 1 }, + { "px": [336,672], "src": [48,0], "f": 0, "t": 2, "d": [1218], "a": 1 }, + { "px": [360,672], "src": [72,0], "f": 0, "t": 3, "d": [1219], "a": 1 }, + { "px": [384,672], "src": [0,0], "f": 0, "t": 0, "d": [1220], "a": 1 }, + { "px": [408,672], "src": [24,0], "f": 0, "t": 1, "d": [1221], "a": 1 }, + { "px": [432,672], "src": [48,0], "f": 0, "t": 2, "d": [1222], "a": 1 }, + { "px": [456,672], "src": [72,0], "f": 0, "t": 3, "d": [1223], "a": 1 }, + { "px": [480,672], "src": [0,0], "f": 0, "t": 0, "d": [1224], "a": 1 }, + { "px": [504,672], "src": [24,0], "f": 0, "t": 1, "d": [1225], "a": 1 }, + { "px": [528,672], "src": [48,0], "f": 0, "t": 2, "d": [1226], "a": 1 }, + { "px": [552,672], "src": [72,0], "f": 0, "t": 3, "d": [1227], "a": 1 }, + { "px": [576,672], "src": [0,0], "f": 0, "t": 0, "d": [1228], "a": 1 }, + { "px": [600,672], "src": [24,0], "f": 0, "t": 1, "d": [1229], "a": 1 }, + { "px": [624,672], "src": [48,0], "f": 0, "t": 2, "d": [1230], "a": 1 }, + { "px": [648,672], "src": [72,0], "f": 0, "t": 3, "d": [1231], "a": 1 }, + { "px": [672,672], "src": [0,0], "f": 0, "t": 0, "d": [1232], "a": 1 }, + { "px": [696,672], "src": [24,0], "f": 0, "t": 1, "d": [1233], "a": 1 }, + { "px": [720,672], "src": [48,0], "f": 0, "t": 2, "d": [1234], "a": 1 }, + { "px": [744,672], "src": [72,0], "f": 0, "t": 3, "d": [1235], "a": 1 }, + { "px": [768,672], "src": [0,0], "f": 0, "t": 0, "d": [1236], "a": 1 }, + { "px": [792,672], "src": [24,0], "f": 0, "t": 1, "d": [1237], "a": 1 }, + { "px": [816,672], "src": [48,0], "f": 0, "t": 2, "d": [1238], "a": 1 }, + { "px": [840,672], "src": [72,0], "f": 0, "t": 3, "d": [1239], "a": 1 }, + { "px": [864,672], "src": [0,0], "f": 0, "t": 0, "d": [1240], "a": 1 }, + { "px": [888,672], "src": [24,0], "f": 0, "t": 1, "d": [1241], "a": 1 }, + { "px": [912,672], "src": [48,0], "f": 0, "t": 2, "d": [1242], "a": 1 }, + { "px": [936,672], "src": [72,0], "f": 0, "t": 3, "d": [1243], "a": 1 }, + { "px": [960,672], "src": [0,0], "f": 0, "t": 0, "d": [1244], "a": 1 }, + { "px": [984,672], "src": [24,0], "f": 0, "t": 1, "d": [1245], "a": 1 }, + { "px": [1008,672], "src": [48,0], "f": 0, "t": 2, "d": [1246], "a": 1 }, + { "px": [0,696], "src": [0,0], "f": 0, "t": 0, "d": [1247], "a": 1 }, + { "px": [24,696], "src": [24,0], "f": 0, "t": 1, "d": [1248], "a": 1 }, + { "px": [48,696], "src": [48,0], "f": 0, "t": 2, "d": [1249], "a": 1 }, + { "px": [72,696], "src": [72,0], "f": 0, "t": 3, "d": [1250], "a": 1 }, + { "px": [96,696], "src": [0,0], "f": 0, "t": 0, "d": [1251], "a": 1 }, + { "px": [120,696], "src": [24,0], "f": 0, "t": 1, "d": [1252], "a": 1 }, + { "px": [144,696], "src": [48,0], "f": 0, "t": 2, "d": [1253], "a": 1 }, + { "px": [168,696], "src": [72,0], "f": 0, "t": 3, "d": [1254], "a": 1 }, + { "px": [192,696], "src": [0,0], "f": 0, "t": 0, "d": [1255], "a": 1 }, + { "px": [216,696], "src": [24,0], "f": 0, "t": 1, "d": [1256], "a": 1 }, + { "px": [240,696], "src": [48,0], "f": 0, "t": 2, "d": [1257], "a": 1 }, + { "px": [264,696], "src": [72,0], "f": 0, "t": 3, "d": [1258], "a": 1 }, + { "px": [288,696], "src": [0,0], "f": 0, "t": 0, "d": [1259], "a": 1 }, + { "px": [312,696], "src": [24,0], "f": 0, "t": 1, "d": [1260], "a": 1 }, + { "px": [336,696], "src": [48,0], "f": 0, "t": 2, "d": [1261], "a": 1 }, + { "px": [360,696], "src": [72,0], "f": 0, "t": 3, "d": [1262], "a": 1 }, + { "px": [384,696], "src": [0,0], "f": 0, "t": 0, "d": [1263], "a": 1 }, + { "px": [408,696], "src": [24,0], "f": 0, "t": 1, "d": [1264], "a": 1 }, + { "px": [432,696], "src": [48,0], "f": 0, "t": 2, "d": [1265], "a": 1 }, + { "px": [456,696], "src": [72,0], "f": 0, "t": 3, "d": [1266], "a": 1 }, + { "px": [480,696], "src": [0,0], "f": 0, "t": 0, "d": [1267], "a": 1 }, + { "px": [504,696], "src": [24,0], "f": 0, "t": 1, "d": [1268], "a": 1 }, + { "px": [528,696], "src": [48,0], "f": 0, "t": 2, "d": [1269], "a": 1 }, + { "px": [552,696], "src": [72,0], "f": 0, "t": 3, "d": [1270], "a": 1 }, + { "px": [576,696], "src": [0,0], "f": 0, "t": 0, "d": [1271], "a": 1 }, + { "px": [600,696], "src": [24,0], "f": 0, "t": 1, "d": [1272], "a": 1 }, + { "px": [624,696], "src": [48,0], "f": 0, "t": 2, "d": [1273], "a": 1 }, + { "px": [648,696], "src": [72,0], "f": 0, "t": 3, "d": [1274], "a": 1 }, + { "px": [672,696], "src": [0,0], "f": 0, "t": 0, "d": [1275], "a": 1 }, + { "px": [696,696], "src": [24,0], "f": 0, "t": 1, "d": [1276], "a": 1 }, + { "px": [720,696], "src": [48,0], "f": 0, "t": 2, "d": [1277], "a": 1 }, + { "px": [744,696], "src": [72,0], "f": 0, "t": 3, "d": [1278], "a": 1 }, + { "px": [768,696], "src": [0,0], "f": 0, "t": 0, "d": [1279], "a": 1 }, + { "px": [792,696], "src": [24,0], "f": 0, "t": 1, "d": [1280], "a": 1 }, + { "px": [816,696], "src": [48,0], "f": 0, "t": 2, "d": [1281], "a": 1 }, + { "px": [840,696], "src": [72,0], "f": 0, "t": 3, "d": [1282], "a": 1 }, + { "px": [864,696], "src": [0,0], "f": 0, "t": 0, "d": [1283], "a": 1 }, + { "px": [888,696], "src": [24,0], "f": 0, "t": 1, "d": [1284], "a": 1 }, + { "px": [912,696], "src": [48,0], "f": 0, "t": 2, "d": [1285], "a": 1 }, + { "px": [936,696], "src": [72,0], "f": 0, "t": 3, "d": [1286], "a": 1 }, + { "px": [960,696], "src": [0,0], "f": 0, "t": 0, "d": [1287], "a": 1 }, + { "px": [984,696], "src": [24,0], "f": 0, "t": 1, "d": [1288], "a": 1 }, + { "px": [1008,696], "src": [48,0], "f": 0, "t": 2, "d": [1289], "a": 1 }, + { "px": [0,720], "src": [0,0], "f": 0, "t": 0, "d": [1290], "a": 1 }, + { "px": [24,720], "src": [24,0], "f": 0, "t": 1, "d": [1291], "a": 1 }, + { "px": [48,720], "src": [48,0], "f": 0, "t": 2, "d": [1292], "a": 1 }, + { "px": [72,720], "src": [72,0], "f": 0, "t": 3, "d": [1293], "a": 1 }, + { "px": [96,720], "src": [0,0], "f": 0, "t": 0, "d": [1294], "a": 1 }, + { "px": [120,720], "src": [24,0], "f": 0, "t": 1, "d": [1295], "a": 1 }, + { "px": [144,720], "src": [48,0], "f": 0, "t": 2, "d": [1296], "a": 1 }, + { "px": [168,720], "src": [72,0], "f": 0, "t": 3, "d": [1297], "a": 1 }, + { "px": [192,720], "src": [0,0], "f": 0, "t": 0, "d": [1298], "a": 1 }, + { "px": [216,720], "src": [24,0], "f": 0, "t": 1, "d": [1299], "a": 1 }, + { "px": [240,720], "src": [48,0], "f": 0, "t": 2, "d": [1300], "a": 1 }, + { "px": [264,720], "src": [72,0], "f": 0, "t": 3, "d": [1301], "a": 1 }, + { "px": [288,720], "src": [0,0], "f": 0, "t": 0, "d": [1302], "a": 1 }, + { "px": [312,720], "src": [24,0], "f": 0, "t": 1, "d": [1303], "a": 1 }, + { "px": [336,720], "src": [48,0], "f": 0, "t": 2, "d": [1304], "a": 1 }, + { "px": [360,720], "src": [72,0], "f": 0, "t": 3, "d": [1305], "a": 1 }, + { "px": [384,720], "src": [0,0], "f": 0, "t": 0, "d": [1306], "a": 1 }, + { "px": [408,720], "src": [24,0], "f": 0, "t": 1, "d": [1307], "a": 1 }, + { "px": [432,720], "src": [48,0], "f": 0, "t": 2, "d": [1308], "a": 1 }, + { "px": [456,720], "src": [72,0], "f": 0, "t": 3, "d": [1309], "a": 1 }, + { "px": [480,720], "src": [0,0], "f": 0, "t": 0, "d": [1310], "a": 1 }, + { "px": [504,720], "src": [24,0], "f": 0, "t": 1, "d": [1311], "a": 1 }, + { "px": [528,720], "src": [48,0], "f": 0, "t": 2, "d": [1312], "a": 1 }, + { "px": [552,720], "src": [72,0], "f": 0, "t": 3, "d": [1313], "a": 1 }, + { "px": [576,720], "src": [0,0], "f": 0, "t": 0, "d": [1314], "a": 1 }, + { "px": [600,720], "src": [24,0], "f": 0, "t": 1, "d": [1315], "a": 1 }, + { "px": [624,720], "src": [48,0], "f": 0, "t": 2, "d": [1316], "a": 1 }, + { "px": [648,720], "src": [72,0], "f": 0, "t": 3, "d": [1317], "a": 1 }, + { "px": [672,720], "src": [0,0], "f": 0, "t": 0, "d": [1318], "a": 1 }, + { "px": [696,720], "src": [24,0], "f": 0, "t": 1, "d": [1319], "a": 1 }, + { "px": [720,720], "src": [48,0], "f": 0, "t": 2, "d": [1320], "a": 1 }, + { "px": [744,720], "src": [72,0], "f": 0, "t": 3, "d": [1321], "a": 1 }, + { "px": [768,720], "src": [0,0], "f": 0, "t": 0, "d": [1322], "a": 1 }, + { "px": [792,720], "src": [24,0], "f": 0, "t": 1, "d": [1323], "a": 1 }, + { "px": [816,720], "src": [48,0], "f": 0, "t": 2, "d": [1324], "a": 1 }, + { "px": [840,720], "src": [72,0], "f": 0, "t": 3, "d": [1325], "a": 1 }, + { "px": [864,720], "src": [0,0], "f": 0, "t": 0, "d": [1326], "a": 1 }, + { "px": [888,720], "src": [24,0], "f": 0, "t": 1, "d": [1327], "a": 1 }, + { "px": [912,720], "src": [48,0], "f": 0, "t": 2, "d": [1328], "a": 1 }, + { "px": [936,720], "src": [72,0], "f": 0, "t": 3, "d": [1329], "a": 1 }, + { "px": [960,720], "src": [0,0], "f": 0, "t": 0, "d": [1330], "a": 1 }, + { "px": [984,720], "src": [24,0], "f": 0, "t": 1, "d": [1331], "a": 1 }, + { "px": [1008,720], "src": [48,0], "f": 0, "t": 2, "d": [1332], "a": 1 }, + { "px": [0,744], "src": [0,0], "f": 0, "t": 0, "d": [1333], "a": 1 }, + { "px": [24,744], "src": [24,0], "f": 0, "t": 1, "d": [1334], "a": 1 }, + { "px": [48,744], "src": [48,0], "f": 0, "t": 2, "d": [1335], "a": 1 }, + { "px": [72,744], "src": [72,0], "f": 0, "t": 3, "d": [1336], "a": 1 }, + { "px": [96,744], "src": [0,0], "f": 0, "t": 0, "d": [1337], "a": 1 }, + { "px": [120,744], "src": [24,0], "f": 0, "t": 1, "d": [1338], "a": 1 }, + { "px": [144,744], "src": [48,0], "f": 0, "t": 2, "d": [1339], "a": 1 }, + { "px": [168,744], "src": [72,0], "f": 0, "t": 3, "d": [1340], "a": 1 }, + { "px": [192,744], "src": [0,0], "f": 0, "t": 0, "d": [1341], "a": 1 }, + { "px": [216,744], "src": [24,0], "f": 0, "t": 1, "d": [1342], "a": 1 }, + { "px": [240,744], "src": [48,0], "f": 0, "t": 2, "d": [1343], "a": 1 }, + { "px": [264,744], "src": [72,0], "f": 0, "t": 3, "d": [1344], "a": 1 }, + { "px": [288,744], "src": [0,0], "f": 0, "t": 0, "d": [1345], "a": 1 }, + { "px": [312,744], "src": [24,0], "f": 0, "t": 1, "d": [1346], "a": 1 }, + { "px": [336,744], "src": [48,0], "f": 0, "t": 2, "d": [1347], "a": 1 }, + { "px": [360,744], "src": [72,0], "f": 0, "t": 3, "d": [1348], "a": 1 }, + { "px": [384,744], "src": [0,0], "f": 0, "t": 0, "d": [1349], "a": 1 }, + { "px": [408,744], "src": [24,0], "f": 0, "t": 1, "d": [1350], "a": 1 }, + { "px": [432,744], "src": [48,0], "f": 0, "t": 2, "d": [1351], "a": 1 }, + { "px": [456,744], "src": [72,0], "f": 0, "t": 3, "d": [1352], "a": 1 }, + { "px": [480,744], "src": [0,0], "f": 0, "t": 0, "d": [1353], "a": 1 }, + { "px": [504,744], "src": [24,0], "f": 0, "t": 1, "d": [1354], "a": 1 }, + { "px": [528,744], "src": [48,0], "f": 0, "t": 2, "d": [1355], "a": 1 }, + { "px": [552,744], "src": [72,0], "f": 0, "t": 3, "d": [1356], "a": 1 }, + { "px": [576,744], "src": [0,0], "f": 0, "t": 0, "d": [1357], "a": 1 }, + { "px": [600,744], "src": [24,0], "f": 0, "t": 1, "d": [1358], "a": 1 }, + { "px": [624,744], "src": [48,0], "f": 0, "t": 2, "d": [1359], "a": 1 }, + { "px": [648,744], "src": [72,0], "f": 0, "t": 3, "d": [1360], "a": 1 }, + { "px": [672,744], "src": [0,0], "f": 0, "t": 0, "d": [1361], "a": 1 }, + { "px": [696,744], "src": [24,0], "f": 0, "t": 1, "d": [1362], "a": 1 }, + { "px": [720,744], "src": [48,0], "f": 0, "t": 2, "d": [1363], "a": 1 }, + { "px": [744,744], "src": [72,0], "f": 0, "t": 3, "d": [1364], "a": 1 }, + { "px": [768,744], "src": [0,0], "f": 0, "t": 0, "d": [1365], "a": 1 }, + { "px": [792,744], "src": [24,0], "f": 0, "t": 1, "d": [1366], "a": 1 }, + { "px": [816,744], "src": [48,0], "f": 0, "t": 2, "d": [1367], "a": 1 }, + { "px": [840,744], "src": [72,0], "f": 0, "t": 3, "d": [1368], "a": 1 }, + { "px": [864,744], "src": [0,0], "f": 0, "t": 0, "d": [1369], "a": 1 }, + { "px": [888,744], "src": [24,0], "f": 0, "t": 1, "d": [1370], "a": 1 }, + { "px": [912,744], "src": [48,0], "f": 0, "t": 2, "d": [1371], "a": 1 }, + { "px": [936,744], "src": [72,0], "f": 0, "t": 3, "d": [1372], "a": 1 }, + { "px": [960,744], "src": [0,0], "f": 0, "t": 0, "d": [1373], "a": 1 }, + { "px": [984,744], "src": [24,0], "f": 0, "t": 1, "d": [1374], "a": 1 }, + { "px": [1008,744], "src": [48,0], "f": 0, "t": 2, "d": [1375], "a": 1 }, + { "px": [0,768], "src": [0,0], "f": 0, "t": 0, "d": [1376], "a": 1 }, + { "px": [24,768], "src": [24,0], "f": 0, "t": 1, "d": [1377], "a": 1 }, + { "px": [48,768], "src": [48,0], "f": 0, "t": 2, "d": [1378], "a": 1 }, + { "px": [72,768], "src": [72,0], "f": 0, "t": 3, "d": [1379], "a": 1 }, + { "px": [96,768], "src": [0,0], "f": 0, "t": 0, "d": [1380], "a": 1 }, + { "px": [120,768], "src": [24,0], "f": 0, "t": 1, "d": [1381], "a": 1 }, + { "px": [144,768], "src": [48,0], "f": 0, "t": 2, "d": [1382], "a": 1 }, + { "px": [168,768], "src": [72,0], "f": 0, "t": 3, "d": [1383], "a": 1 }, + { "px": [192,768], "src": [0,0], "f": 0, "t": 0, "d": [1384], "a": 1 }, + { "px": [216,768], "src": [24,0], "f": 0, "t": 1, "d": [1385], "a": 1 }, + { "px": [240,768], "src": [48,0], "f": 0, "t": 2, "d": [1386], "a": 1 }, + { "px": [264,768], "src": [72,0], "f": 0, "t": 3, "d": [1387], "a": 1 }, + { "px": [288,768], "src": [0,0], "f": 0, "t": 0, "d": [1388], "a": 1 }, + { "px": [312,768], "src": [24,0], "f": 0, "t": 1, "d": [1389], "a": 1 }, + { "px": [336,768], "src": [48,0], "f": 0, "t": 2, "d": [1390], "a": 1 }, + { "px": [360,768], "src": [72,0], "f": 0, "t": 3, "d": [1391], "a": 1 }, + { "px": [384,768], "src": [0,0], "f": 0, "t": 0, "d": [1392], "a": 1 }, + { "px": [408,768], "src": [24,0], "f": 0, "t": 1, "d": [1393], "a": 1 }, + { "px": [432,768], "src": [48,0], "f": 0, "t": 2, "d": [1394], "a": 1 }, + { "px": [456,768], "src": [72,0], "f": 0, "t": 3, "d": [1395], "a": 1 }, + { "px": [480,768], "src": [0,0], "f": 0, "t": 0, "d": [1396], "a": 1 }, + { "px": [504,768], "src": [24,0], "f": 0, "t": 1, "d": [1397], "a": 1 }, + { "px": [528,768], "src": [48,0], "f": 0, "t": 2, "d": [1398], "a": 1 }, + { "px": [552,768], "src": [72,0], "f": 0, "t": 3, "d": [1399], "a": 1 }, + { "px": [576,768], "src": [0,0], "f": 0, "t": 0, "d": [1400], "a": 1 }, + { "px": [600,768], "src": [24,0], "f": 0, "t": 1, "d": [1401], "a": 1 }, + { "px": [624,768], "src": [48,0], "f": 0, "t": 2, "d": [1402], "a": 1 }, + { "px": [648,768], "src": [72,0], "f": 0, "t": 3, "d": [1403], "a": 1 }, + { "px": [672,768], "src": [0,0], "f": 0, "t": 0, "d": [1404], "a": 1 }, + { "px": [696,768], "src": [24,0], "f": 0, "t": 1, "d": [1405], "a": 1 }, + { "px": [720,768], "src": [48,0], "f": 0, "t": 2, "d": [1406], "a": 1 }, + { "px": [744,768], "src": [72,0], "f": 0, "t": 3, "d": [1407], "a": 1 }, + { "px": [768,768], "src": [0,0], "f": 0, "t": 0, "d": [1408], "a": 1 }, + { "px": [792,768], "src": [24,0], "f": 0, "t": 1, "d": [1409], "a": 1 }, + { "px": [816,768], "src": [48,0], "f": 0, "t": 2, "d": [1410], "a": 1 }, + { "px": [840,768], "src": [72,0], "f": 0, "t": 3, "d": [1411], "a": 1 }, + { "px": [864,768], "src": [0,0], "f": 0, "t": 0, "d": [1412], "a": 1 }, + { "px": [888,768], "src": [24,0], "f": 0, "t": 1, "d": [1413], "a": 1 }, + { "px": [912,768], "src": [48,0], "f": 0, "t": 2, "d": [1414], "a": 1 }, + { "px": [936,768], "src": [72,0], "f": 0, "t": 3, "d": [1415], "a": 1 }, + { "px": [960,768], "src": [0,0], "f": 0, "t": 0, "d": [1416], "a": 1 }, + { "px": [984,768], "src": [24,0], "f": 0, "t": 1, "d": [1417], "a": 1 }, + { "px": [1008,768], "src": [48,0], "f": 0, "t": 2, "d": [1418], "a": 1 }, + { "px": [0,792], "src": [0,0], "f": 0, "t": 0, "d": [1419], "a": 1 }, + { "px": [24,792], "src": [24,0], "f": 0, "t": 1, "d": [1420], "a": 1 }, + { "px": [48,792], "src": [48,0], "f": 0, "t": 2, "d": [1421], "a": 1 }, + { "px": [72,792], "src": [72,0], "f": 0, "t": 3, "d": [1422], "a": 1 }, + { "px": [96,792], "src": [0,0], "f": 0, "t": 0, "d": [1423], "a": 1 }, + { "px": [120,792], "src": [24,0], "f": 0, "t": 1, "d": [1424], "a": 1 }, + { "px": [144,792], "src": [48,0], "f": 0, "t": 2, "d": [1425], "a": 1 }, + { "px": [168,792], "src": [72,0], "f": 0, "t": 3, "d": [1426], "a": 1 }, + { "px": [192,792], "src": [0,0], "f": 0, "t": 0, "d": [1427], "a": 1 }, + { "px": [216,792], "src": [24,0], "f": 0, "t": 1, "d": [1428], "a": 1 }, + { "px": [240,792], "src": [48,0], "f": 0, "t": 2, "d": [1429], "a": 1 }, + { "px": [264,792], "src": [72,0], "f": 0, "t": 3, "d": [1430], "a": 1 }, + { "px": [288,792], "src": [0,0], "f": 0, "t": 0, "d": [1431], "a": 1 }, + { "px": [312,792], "src": [24,0], "f": 0, "t": 1, "d": [1432], "a": 1 }, + { "px": [336,792], "src": [48,0], "f": 0, "t": 2, "d": [1433], "a": 1 }, + { "px": [360,792], "src": [72,0], "f": 0, "t": 3, "d": [1434], "a": 1 }, + { "px": [384,792], "src": [0,0], "f": 0, "t": 0, "d": [1435], "a": 1 }, + { "px": [408,792], "src": [24,0], "f": 0, "t": 1, "d": [1436], "a": 1 }, + { "px": [432,792], "src": [48,0], "f": 0, "t": 2, "d": [1437], "a": 1 }, + { "px": [456,792], "src": [72,0], "f": 0, "t": 3, "d": [1438], "a": 1 }, + { "px": [480,792], "src": [0,0], "f": 0, "t": 0, "d": [1439], "a": 1 }, + { "px": [504,792], "src": [24,0], "f": 0, "t": 1, "d": [1440], "a": 1 }, + { "px": [528,792], "src": [48,0], "f": 0, "t": 2, "d": [1441], "a": 1 }, + { "px": [552,792], "src": [72,0], "f": 0, "t": 3, "d": [1442], "a": 1 }, + { "px": [576,792], "src": [0,0], "f": 0, "t": 0, "d": [1443], "a": 1 }, + { "px": [600,792], "src": [24,0], "f": 0, "t": 1, "d": [1444], "a": 1 }, + { "px": [624,792], "src": [48,0], "f": 0, "t": 2, "d": [1445], "a": 1 }, + { "px": [648,792], "src": [72,0], "f": 0, "t": 3, "d": [1446], "a": 1 }, + { "px": [672,792], "src": [0,0], "f": 0, "t": 0, "d": [1447], "a": 1 }, + { "px": [696,792], "src": [24,0], "f": 0, "t": 1, "d": [1448], "a": 1 }, + { "px": [720,792], "src": [48,0], "f": 0, "t": 2, "d": [1449], "a": 1 }, + { "px": [744,792], "src": [72,0], "f": 0, "t": 3, "d": [1450], "a": 1 }, + { "px": [768,792], "src": [0,0], "f": 0, "t": 0, "d": [1451], "a": 1 }, + { "px": [792,792], "src": [24,0], "f": 0, "t": 1, "d": [1452], "a": 1 }, + { "px": [816,792], "src": [48,0], "f": 0, "t": 2, "d": [1453], "a": 1 }, + { "px": [840,792], "src": [72,0], "f": 0, "t": 3, "d": [1454], "a": 1 }, + { "px": [864,792], "src": [0,0], "f": 0, "t": 0, "d": [1455], "a": 1 }, + { "px": [888,792], "src": [24,0], "f": 0, "t": 1, "d": [1456], "a": 1 }, + { "px": [912,792], "src": [48,0], "f": 0, "t": 2, "d": [1457], "a": 1 }, + { "px": [936,792], "src": [72,0], "f": 0, "t": 3, "d": [1458], "a": 1 }, + { "px": [960,792], "src": [0,0], "f": 0, "t": 0, "d": [1459], "a": 1 }, + { "px": [984,792], "src": [24,0], "f": 0, "t": 1, "d": [1460], "a": 1 }, + { "px": [1008,792], "src": [48,0], "f": 0, "t": 2, "d": [1461], "a": 1 }, + { "px": [0,816], "src": [0,0], "f": 0, "t": 0, "d": [1462], "a": 1 }, + { "px": [24,816], "src": [24,0], "f": 0, "t": 1, "d": [1463], "a": 1 }, + { "px": [48,816], "src": [48,0], "f": 0, "t": 2, "d": [1464], "a": 1 }, + { "px": [72,816], "src": [72,0], "f": 0, "t": 3, "d": [1465], "a": 1 }, + { "px": [96,816], "src": [0,0], "f": 0, "t": 0, "d": [1466], "a": 1 }, + { "px": [120,816], "src": [24,0], "f": 0, "t": 1, "d": [1467], "a": 1 }, + { "px": [144,816], "src": [48,0], "f": 0, "t": 2, "d": [1468], "a": 1 }, + { "px": [168,816], "src": [72,0], "f": 0, "t": 3, "d": [1469], "a": 1 }, + { "px": [192,816], "src": [0,0], "f": 0, "t": 0, "d": [1470], "a": 1 }, + { "px": [216,816], "src": [24,0], "f": 0, "t": 1, "d": [1471], "a": 1 }, + { "px": [240,816], "src": [48,0], "f": 0, "t": 2, "d": [1472], "a": 1 }, + { "px": [264,816], "src": [72,0], "f": 0, "t": 3, "d": [1473], "a": 1 }, + { "px": [288,816], "src": [0,0], "f": 0, "t": 0, "d": [1474], "a": 1 }, + { "px": [312,816], "src": [24,0], "f": 0, "t": 1, "d": [1475], "a": 1 }, + { "px": [336,816], "src": [48,0], "f": 0, "t": 2, "d": [1476], "a": 1 }, + { "px": [360,816], "src": [72,0], "f": 0, "t": 3, "d": [1477], "a": 1 }, + { "px": [384,816], "src": [0,0], "f": 0, "t": 0, "d": [1478], "a": 1 }, + { "px": [408,816], "src": [24,0], "f": 0, "t": 1, "d": [1479], "a": 1 }, + { "px": [432,816], "src": [48,0], "f": 0, "t": 2, "d": [1480], "a": 1 }, + { "px": [456,816], "src": [72,0], "f": 0, "t": 3, "d": [1481], "a": 1 }, + { "px": [480,816], "src": [0,0], "f": 0, "t": 0, "d": [1482], "a": 1 }, + { "px": [504,816], "src": [24,0], "f": 0, "t": 1, "d": [1483], "a": 1 }, + { "px": [528,816], "src": [48,0], "f": 0, "t": 2, "d": [1484], "a": 1 }, + { "px": [552,816], "src": [72,0], "f": 0, "t": 3, "d": [1485], "a": 1 }, + { "px": [576,816], "src": [0,0], "f": 0, "t": 0, "d": [1486], "a": 1 }, + { "px": [600,816], "src": [24,0], "f": 0, "t": 1, "d": [1487], "a": 1 }, + { "px": [624,816], "src": [48,0], "f": 0, "t": 2, "d": [1488], "a": 1 }, + { "px": [648,816], "src": [72,0], "f": 0, "t": 3, "d": [1489], "a": 1 }, + { "px": [672,816], "src": [0,0], "f": 0, "t": 0, "d": [1490], "a": 1 }, + { "px": [696,816], "src": [24,0], "f": 0, "t": 1, "d": [1491], "a": 1 }, + { "px": [720,816], "src": [48,0], "f": 0, "t": 2, "d": [1492], "a": 1 }, + { "px": [744,816], "src": [72,0], "f": 0, "t": 3, "d": [1493], "a": 1 }, + { "px": [768,816], "src": [0,0], "f": 0, "t": 0, "d": [1494], "a": 1 }, + { "px": [792,816], "src": [24,0], "f": 0, "t": 1, "d": [1495], "a": 1 }, + { "px": [816,816], "src": [48,0], "f": 0, "t": 2, "d": [1496], "a": 1 }, + { "px": [840,816], "src": [72,0], "f": 0, "t": 3, "d": [1497], "a": 1 }, + { "px": [864,816], "src": [0,0], "f": 0, "t": 0, "d": [1498], "a": 1 }, + { "px": [888,816], "src": [24,0], "f": 0, "t": 1, "d": [1499], "a": 1 }, + { "px": [912,816], "src": [48,0], "f": 0, "t": 2, "d": [1500], "a": 1 }, + { "px": [936,816], "src": [72,0], "f": 0, "t": 3, "d": [1501], "a": 1 }, + { "px": [960,816], "src": [0,0], "f": 0, "t": 0, "d": [1502], "a": 1 }, + { "px": [984,816], "src": [24,0], "f": 0, "t": 1, "d": [1503], "a": 1 }, + { "px": [1008,816], "src": [48,0], "f": 0, "t": 2, "d": [1504], "a": 1 }, + { "px": [0,840], "src": [0,24], "f": 0, "t": 8, "d": [1505], "a": 1 }, + { "px": [24,840], "src": [24,24], "f": 0, "t": 9, "d": [1506], "a": 1 }, + { "px": [48,840], "src": [48,24], "f": 0, "t": 10, "d": [1507], "a": 1 }, + { "px": [72,840], "src": [72,24], "f": 0, "t": 11, "d": [1508], "a": 1 }, + { "px": [96,840], "src": [0,24], "f": 0, "t": 8, "d": [1509], "a": 1 }, + { "px": [120,840], "src": [24,24], "f": 0, "t": 9, "d": [1510], "a": 1 }, + { "px": [144,840], "src": [48,24], "f": 0, "t": 10, "d": [1511], "a": 1 }, + { "px": [168,840], "src": [72,24], "f": 0, "t": 11, "d": [1512], "a": 1 }, + { "px": [192,840], "src": [0,24], "f": 0, "t": 8, "d": [1513], "a": 1 }, + { "px": [216,840], "src": [24,24], "f": 0, "t": 9, "d": [1514], "a": 1 }, + { "px": [240,840], "src": [48,24], "f": 0, "t": 10, "d": [1515], "a": 1 }, + { "px": [264,840], "src": [72,24], "f": 0, "t": 11, "d": [1516], "a": 1 }, + { "px": [288,840], "src": [0,24], "f": 0, "t": 8, "d": [1517], "a": 1 }, + { "px": [312,840], "src": [24,24], "f": 0, "t": 9, "d": [1518], "a": 1 }, + { "px": [336,840], "src": [48,24], "f": 0, "t": 10, "d": [1519], "a": 1 }, + { "px": [360,840], "src": [72,24], "f": 0, "t": 11, "d": [1520], "a": 1 }, + { "px": [384,840], "src": [0,24], "f": 0, "t": 8, "d": [1521], "a": 1 }, + { "px": [408,840], "src": [24,24], "f": 0, "t": 9, "d": [1522], "a": 1 }, + { "px": [432,840], "src": [48,24], "f": 0, "t": 10, "d": [1523], "a": 1 }, + { "px": [456,840], "src": [72,24], "f": 0, "t": 11, "d": [1524], "a": 1 }, + { "px": [480,840], "src": [0,24], "f": 0, "t": 8, "d": [1525], "a": 1 }, + { "px": [504,840], "src": [24,24], "f": 0, "t": 9, "d": [1526], "a": 1 }, + { "px": [528,840], "src": [48,24], "f": 0, "t": 10, "d": [1527], "a": 1 }, + { "px": [552,840], "src": [72,24], "f": 0, "t": 11, "d": [1528], "a": 1 }, + { "px": [576,840], "src": [0,24], "f": 0, "t": 8, "d": [1529], "a": 1 }, + { "px": [600,840], "src": [24,24], "f": 0, "t": 9, "d": [1530], "a": 1 }, + { "px": [624,840], "src": [48,24], "f": 0, "t": 10, "d": [1531], "a": 1 }, + { "px": [648,840], "src": [72,24], "f": 0, "t": 11, "d": [1532], "a": 1 }, + { "px": [672,840], "src": [0,24], "f": 0, "t": 8, "d": [1533], "a": 1 }, + { "px": [696,840], "src": [24,24], "f": 0, "t": 9, "d": [1534], "a": 1 }, + { "px": [720,840], "src": [48,24], "f": 0, "t": 10, "d": [1535], "a": 1 }, + { "px": [744,840], "src": [72,24], "f": 0, "t": 11, "d": [1536], "a": 1 }, + { "px": [768,840], "src": [0,24], "f": 0, "t": 8, "d": [1537], "a": 1 }, + { "px": [792,840], "src": [24,24], "f": 0, "t": 9, "d": [1538], "a": 1 }, + { "px": [816,840], "src": [48,24], "f": 0, "t": 10, "d": [1539], "a": 1 }, + { "px": [840,840], "src": [72,24], "f": 0, "t": 11, "d": [1540], "a": 1 }, + { "px": [864,840], "src": [0,24], "f": 0, "t": 8, "d": [1541], "a": 1 }, + { "px": [888,840], "src": [24,24], "f": 0, "t": 9, "d": [1542], "a": 1 }, + { "px": [912,840], "src": [48,24], "f": 0, "t": 10, "d": [1543], "a": 1 }, + { "px": [936,840], "src": [72,24], "f": 0, "t": 11, "d": [1544], "a": 1 }, + { "px": [960,840], "src": [0,24], "f": 0, "t": 8, "d": [1545], "a": 1 }, + { "px": [984,840], "src": [24,24], "f": 0, "t": 9, "d": [1546], "a": 1 }, + { "px": [1008,840], "src": [48,24], "f": 0, "t": 10, "d": [1547], "a": 1 }, + { "px": [0,864], "src": [0,48], "f": 0, "t": 16, "d": [1548], "a": 1 }, + { "px": [24,864], "src": [24,48], "f": 0, "t": 17, "d": [1549], "a": 1 }, + { "px": [48,864], "src": [48,48], "f": 0, "t": 18, "d": [1550], "a": 1 }, + { "px": [72,864], "src": [72,48], "f": 0, "t": 19, "d": [1551], "a": 1 }, + { "px": [96,864], "src": [72,48], "f": 0, "t": 19, "d": [1552], "a": 1 }, + { "px": [120,864], "src": [72,48], "f": 0, "t": 19, "d": [1553], "a": 1 }, + { "px": [144,864], "src": [72,48], "f": 0, "t": 19, "d": [1554], "a": 1 }, + { "px": [168,864], "src": [72,48], "f": 0, "t": 19, "d": [1555], "a": 1 }, + { "px": [192,864], "src": [72,48], "f": 0, "t": 19, "d": [1556], "a": 1 }, + { "px": [216,864], "src": [72,48], "f": 0, "t": 19, "d": [1557], "a": 1 }, + { "px": [240,864], "src": [72,48], "f": 0, "t": 19, "d": [1558], "a": 1 }, + { "px": [264,864], "src": [72,48], "f": 0, "t": 19, "d": [1559], "a": 1 }, + { "px": [288,864], "src": [72,48], "f": 0, "t": 19, "d": [1560], "a": 1 }, + { "px": [312,864], "src": [72,48], "f": 0, "t": 19, "d": [1561], "a": 1 }, + { "px": [336,864], "src": [72,48], "f": 0, "t": 19, "d": [1562], "a": 1 }, + { "px": [360,864], "src": [72,48], "f": 0, "t": 19, "d": [1563], "a": 1 }, + { "px": [384,864], "src": [72,48], "f": 0, "t": 19, "d": [1564], "a": 1 }, + { "px": [408,864], "src": [72,48], "f": 0, "t": 19, "d": [1565], "a": 1 }, + { "px": [432,864], "src": [72,48], "f": 0, "t": 19, "d": [1566], "a": 1 }, + { "px": [456,864], "src": [72,48], "f": 0, "t": 19, "d": [1567], "a": 1 }, + { "px": [480,864], "src": [72,48], "f": 0, "t": 19, "d": [1568], "a": 1 }, + { "px": [504,864], "src": [72,48], "f": 0, "t": 19, "d": [1569], "a": 1 }, + { "px": [528,864], "src": [72,48], "f": 0, "t": 19, "d": [1570], "a": 1 }, + { "px": [552,864], "src": [72,48], "f": 0, "t": 19, "d": [1571], "a": 1 }, + { "px": [576,864], "src": [72,48], "f": 0, "t": 19, "d": [1572], "a": 1 }, + { "px": [600,864], "src": [72,48], "f": 0, "t": 19, "d": [1573], "a": 1 }, + { "px": [624,864], "src": [72,48], "f": 0, "t": 19, "d": [1574], "a": 1 }, + { "px": [648,864], "src": [72,48], "f": 0, "t": 19, "d": [1575], "a": 1 }, + { "px": [672,864], "src": [72,48], "f": 0, "t": 19, "d": [1576], "a": 1 }, + { "px": [696,864], "src": [72,48], "f": 0, "t": 19, "d": [1577], "a": 1 }, + { "px": [720,864], "src": [72,48], "f": 0, "t": 19, "d": [1578], "a": 1 }, + { "px": [744,864], "src": [72,48], "f": 0, "t": 19, "d": [1579], "a": 1 }, + { "px": [768,864], "src": [72,48], "f": 0, "t": 19, "d": [1580], "a": 1 }, + { "px": [792,864], "src": [72,48], "f": 0, "t": 19, "d": [1581], "a": 1 }, + { "px": [816,864], "src": [72,48], "f": 0, "t": 19, "d": [1582], "a": 1 }, + { "px": [840,864], "src": [72,48], "f": 0, "t": 19, "d": [1583], "a": 1 }, + { "px": [864,864], "src": [72,48], "f": 0, "t": 19, "d": [1584], "a": 1 }, + { "px": [888,864], "src": [72,48], "f": 0, "t": 19, "d": [1585], "a": 1 }, + { "px": [912,864], "src": [72,48], "f": 0, "t": 19, "d": [1586], "a": 1 }, + { "px": [936,864], "src": [72,48], "f": 0, "t": 19, "d": [1587], "a": 1 }, + { "px": [960,864], "src": [72,48], "f": 0, "t": 19, "d": [1588], "a": 1 }, + { "px": [984,864], "src": [72,48], "f": 0, "t": 19, "d": [1589], "a": 1 }, + { "px": [1008,864], "src": [72,48], "f": 0, "t": 19, "d": [1590], "a": 1 }, + { "px": [0,888], "src": [0,48], "f": 0, "t": 16, "d": [1591], "a": 1 }, + { "px": [24,888], "src": [24,48], "f": 0, "t": 17, "d": [1592], "a": 1 }, + { "px": [48,888], "src": [48,48], "f": 0, "t": 18, "d": [1593], "a": 1 }, + { "px": [72,888], "src": [72,48], "f": 0, "t": 19, "d": [1594], "a": 1 }, + { "px": [96,888], "src": [72,48], "f": 0, "t": 19, "d": [1595], "a": 1 }, + { "px": [120,888], "src": [72,48], "f": 0, "t": 19, "d": [1596], "a": 1 }, + { "px": [144,888], "src": [72,48], "f": 0, "t": 19, "d": [1597], "a": 1 }, + { "px": [168,888], "src": [72,48], "f": 0, "t": 19, "d": [1598], "a": 1 }, + { "px": [192,888], "src": [72,48], "f": 0, "t": 19, "d": [1599], "a": 1 }, + { "px": [216,888], "src": [72,48], "f": 0, "t": 19, "d": [1600], "a": 1 }, + { "px": [240,888], "src": [72,48], "f": 0, "t": 19, "d": [1601], "a": 1 }, + { "px": [264,888], "src": [72,48], "f": 0, "t": 19, "d": [1602], "a": 1 }, + { "px": [288,888], "src": [72,48], "f": 0, "t": 19, "d": [1603], "a": 1 }, + { "px": [312,888], "src": [72,48], "f": 0, "t": 19, "d": [1604], "a": 1 }, + { "px": [336,888], "src": [72,48], "f": 0, "t": 19, "d": [1605], "a": 1 }, + { "px": [360,888], "src": [72,48], "f": 0, "t": 19, "d": [1606], "a": 1 }, + { "px": [384,888], "src": [0,48], "f": 0, "t": 16, "d": [1607], "a": 1 }, + { "px": [408,888], "src": [0,48], "f": 0, "t": 16, "d": [1608], "a": 1 }, + { "px": [432,888], "src": [24,48], "f": 0, "t": 17, "d": [1609], "a": 1 }, + { "px": [456,888], "src": [48,48], "f": 0, "t": 18, "d": [1610], "a": 1 }, + { "px": [480,888], "src": [72,48], "f": 0, "t": 19, "d": [1611], "a": 1 }, + { "px": [504,888], "src": [72,48], "f": 0, "t": 19, "d": [1612], "a": 1 }, + { "px": [528,888], "src": [72,48], "f": 0, "t": 19, "d": [1613], "a": 1 }, + { "px": [552,888], "src": [72,48], "f": 0, "t": 19, "d": [1614], "a": 1 }, + { "px": [576,888], "src": [72,48], "f": 0, "t": 19, "d": [1615], "a": 1 }, + { "px": [600,888], "src": [72,48], "f": 0, "t": 19, "d": [1616], "a": 1 }, + { "px": [624,888], "src": [0,48], "f": 0, "t": 16, "d": [1617], "a": 1 }, + { "px": [648,888], "src": [0,48], "f": 0, "t": 16, "d": [1618], "a": 1 }, + { "px": [672,888], "src": [0,48], "f": 0, "t": 16, "d": [1619], "a": 1 }, + { "px": [696,888], "src": [0,48], "f": 0, "t": 16, "d": [1620], "a": 1 }, + { "px": [720,888], "src": [0,48], "f": 0, "t": 16, "d": [1621], "a": 1 }, + { "px": [744,888], "src": [0,48], "f": 0, "t": 16, "d": [1622], "a": 1 }, + { "px": [768,888], "src": [0,48], "f": 0, "t": 16, "d": [1623], "a": 1 }, + { "px": [792,888], "src": [0,48], "f": 0, "t": 16, "d": [1624], "a": 1 }, + { "px": [816,888], "src": [0,48], "f": 0, "t": 16, "d": [1625], "a": 1 }, + { "px": [840,888], "src": [0,48], "f": 0, "t": 16, "d": [1626], "a": 1 }, + { "px": [864,888], "src": [0,48], "f": 0, "t": 16, "d": [1627], "a": 1 }, + { "px": [888,888], "src": [24,48], "f": 0, "t": 17, "d": [1628], "a": 1 }, + { "px": [912,888], "src": [48,48], "f": 0, "t": 18, "d": [1629], "a": 1 }, + { "px": [936,888], "src": [0,48], "f": 0, "t": 16, "d": [1630], "a": 1 }, + { "px": [960,888], "src": [24,48], "f": 0, "t": 17, "d": [1631], "a": 1 }, + { "px": [984,888], "src": [48,48], "f": 0, "t": 18, "d": [1632], "a": 1 }, + { "px": [1008,888], "src": [72,48], "f": 0, "t": 19, "d": [1633], "a": 1 }, + { "px": [0,912], "src": [0,48], "f": 0, "t": 16, "d": [1634], "a": 1 }, + { "px": [24,912], "src": [0,48], "f": 0, "t": 16, "d": [1635], "a": 1 }, + { "px": [48,912], "src": [24,48], "f": 0, "t": 17, "d": [1636], "a": 1 }, + { "px": [72,912], "src": [48,48], "f": 0, "t": 18, "d": [1637], "a": 1 }, + { "px": [96,912], "src": [72,48], "f": 0, "t": 19, "d": [1638], "a": 1 }, + { "px": [120,912], "src": [0,48], "f": 0, "t": 16, "d": [1639], "a": 1 }, + { "px": [144,912], "src": [0,48], "f": 0, "t": 16, "d": [1640], "a": 1 }, + { "px": [168,912], "src": [0,48], "f": 0, "t": 16, "d": [1641], "a": 1 }, + { "px": [192,912], "src": [24,48], "f": 0, "t": 17, "d": [1642], "a": 1 }, + { "px": [216,912], "src": [48,48], "f": 0, "t": 18, "d": [1643], "a": 1 }, + { "px": [240,912], "src": [72,48], "f": 0, "t": 19, "d": [1644], "a": 1 }, + { "px": [264,912], "src": [72,48], "f": 0, "t": 19, "d": [1645], "a": 1 }, + { "px": [288,912], "src": [72,48], "f": 0, "t": 19, "d": [1646], "a": 1 }, + { "px": [312,912], "src": [0,48], "f": 0, "t": 16, "d": [1647], "a": 1 }, + { "px": [336,912], "src": [24,48], "f": 0, "t": 17, "d": [1648], "a": 1 }, + { "px": [360,912], "src": [48,48], "f": 0, "t": 18, "d": [1649], "a": 1 }, + { "px": [384,912], "src": [72,48], "f": 0, "t": 19, "d": [1650], "a": 1 }, + { "px": [408,912], "src": [72,48], "f": 0, "t": 19, "d": [1651], "a": 1 }, + { "px": [432,912], "src": [72,48], "f": 0, "t": 19, "d": [1652], "a": 1 }, + { "px": [456,912], "src": [72,48], "f": 0, "t": 19, "d": [1653], "a": 1 }, + { "px": [480,912], "src": [72,48], "f": 0, "t": 19, "d": [1654], "a": 1 }, + { "px": [504,912], "src": [72,48], "f": 0, "t": 19, "d": [1655], "a": 1 }, + { "px": [528,912], "src": [72,48], "f": 0, "t": 19, "d": [1656], "a": 1 }, + { "px": [552,912], "src": [72,48], "f": 0, "t": 19, "d": [1657], "a": 1 }, + { "px": [576,912], "src": [72,48], "f": 0, "t": 19, "d": [1658], "a": 1 }, + { "px": [600,912], "src": [72,48], "f": 0, "t": 19, "d": [1659], "a": 1 }, + { "px": [624,912], "src": [72,48], "f": 0, "t": 19, "d": [1660], "a": 1 }, + { "px": [648,912], "src": [72,48], "f": 0, "t": 19, "d": [1661], "a": 1 }, + { "px": [672,912], "src": [72,48], "f": 0, "t": 19, "d": [1662], "a": 1 }, + { "px": [696,912], "src": [72,48], "f": 0, "t": 19, "d": [1663], "a": 1 }, + { "px": [720,912], "src": [72,48], "f": 0, "t": 19, "d": [1664], "a": 1 }, + { "px": [744,912], "src": [72,48], "f": 0, "t": 19, "d": [1665], "a": 1 }, + { "px": [768,912], "src": [72,48], "f": 0, "t": 19, "d": [1666], "a": 1 }, + { "px": [792,912], "src": [72,48], "f": 0, "t": 19, "d": [1667], "a": 1 }, + { "px": [816,912], "src": [72,48], "f": 0, "t": 19, "d": [1668], "a": 1 }, + { "px": [840,912], "src": [72,48], "f": 0, "t": 19, "d": [1669], "a": 1 }, + { "px": [864,912], "src": [72,48], "f": 0, "t": 19, "d": [1670], "a": 1 }, + { "px": [888,912], "src": [72,48], "f": 0, "t": 19, "d": [1671], "a": 1 }, + { "px": [912,912], "src": [72,48], "f": 0, "t": 19, "d": [1672], "a": 1 }, + { "px": [936,912], "src": [0,48], "f": 0, "t": 16, "d": [1673], "a": 1 }, + { "px": [960,912], "src": [24,48], "f": 0, "t": 17, "d": [1674], "a": 1 }, + { "px": [984,912], "src": [48,48], "f": 0, "t": 18, "d": [1675], "a": 1 }, + { "px": [1008,912], "src": [72,48], "f": 0, "t": 19, "d": [1676], "a": 1 }, + { "px": [0,936], "src": [0,48], "f": 0, "t": 16, "d": [1677], "a": 1 }, + { "px": [24,936], "src": [24,48], "f": 0, "t": 17, "d": [1678], "a": 1 }, + { "px": [48,936], "src": [48,48], "f": 0, "t": 18, "d": [1679], "a": 1 }, + { "px": [72,936], "src": [72,48], "f": 0, "t": 19, "d": [1680], "a": 1 }, + { "px": [96,936], "src": [72,48], "f": 0, "t": 19, "d": [1681], "a": 1 }, + { "px": [120,936], "src": [24,48], "f": 0, "t": 17, "d": [1682], "a": 1 }, + { "px": [144,936], "src": [48,48], "f": 0, "t": 18, "d": [1683], "a": 1 }, + { "px": [168,936], "src": [72,48], "f": 0, "t": 19, "d": [1684], "a": 1 }, + { "px": [192,936], "src": [0,48], "f": 0, "t": 16, "d": [1685], "a": 1 }, + { "px": [216,936], "src": [0,48], "f": 0, "t": 16, "d": [1686], "a": 1 }, + { "px": [240,936], "src": [0,48], "f": 0, "t": 16, "d": [1687], "a": 1 }, + { "px": [264,936], "src": [24,48], "f": 0, "t": 17, "d": [1688], "a": 1 }, + { "px": [288,936], "src": [0,48], "f": 0, "t": 16, "d": [1689], "a": 1 }, + { "px": [312,936], "src": [24,48], "f": 0, "t": 17, "d": [1690], "a": 1 }, + { "px": [336,936], "src": [48,48], "f": 0, "t": 18, "d": [1691], "a": 1 }, + { "px": [360,936], "src": [72,48], "f": 0, "t": 19, "d": [1692], "a": 1 }, + { "px": [384,936], "src": [0,48], "f": 0, "t": 16, "d": [1693], "a": 1 }, + { "px": [408,936], "src": [24,48], "f": 0, "t": 17, "d": [1694], "a": 1 }, + { "px": [432,936], "src": [48,48], "f": 0, "t": 18, "d": [1695], "a": 1 }, + { "px": [456,936], "src": [72,48], "f": 0, "t": 19, "d": [1696], "a": 1 }, + { "px": [480,936], "src": [72,48], "f": 0, "t": 19, "d": [1697], "a": 1 }, + { "px": [504,936], "src": [72,48], "f": 0, "t": 19, "d": [1698], "a": 1 }, + { "px": [528,936], "src": [72,48], "f": 0, "t": 19, "d": [1699], "a": 1 }, + { "px": [552,936], "src": [72,48], "f": 0, "t": 19, "d": [1700], "a": 1 }, + { "px": [576,936], "src": [72,48], "f": 0, "t": 19, "d": [1701], "a": 1 }, + { "px": [600,936], "src": [72,48], "f": 0, "t": 19, "d": [1702], "a": 1 }, + { "px": [624,936], "src": [72,48], "f": 0, "t": 19, "d": [1703], "a": 1 }, + { "px": [648,936], "src": [72,48], "f": 0, "t": 19, "d": [1704], "a": 1 }, + { "px": [672,936], "src": [72,48], "f": 0, "t": 19, "d": [1705], "a": 1 }, + { "px": [696,936], "src": [0,48], "f": 0, "t": 16, "d": [1706], "a": 1 }, + { "px": [720,936], "src": [0,48], "f": 0, "t": 16, "d": [1707], "a": 1 }, + { "px": [744,936], "src": [0,48], "f": 0, "t": 16, "d": [1708], "a": 1 }, + { "px": [768,936], "src": [0,48], "f": 0, "t": 16, "d": [1709], "a": 1 }, + { "px": [792,936], "src": [0,48], "f": 0, "t": 16, "d": [1710], "a": 1 }, + { "px": [816,936], "src": [0,48], "f": 0, "t": 16, "d": [1711], "a": 1 }, + { "px": [840,936], "src": [0,48], "f": 0, "t": 16, "d": [1712], "a": 1 }, + { "px": [864,936], "src": [0,48], "f": 0, "t": 16, "d": [1713], "a": 1 }, + { "px": [888,936], "src": [24,48], "f": 0, "t": 17, "d": [1714], "a": 1 }, + { "px": [912,936], "src": [48,48], "f": 0, "t": 18, "d": [1715], "a": 1 }, + { "px": [936,936], "src": [0,48], "f": 0, "t": 16, "d": [1716], "a": 1 }, + { "px": [960,936], "src": [24,48], "f": 0, "t": 17, "d": [1717], "a": 1 }, + { "px": [984,936], "src": [48,48], "f": 0, "t": 18, "d": [1718], "a": 1 }, + { "px": [1008,936], "src": [72,48], "f": 0, "t": 19, "d": [1719], "a": 1 }, + { "px": [0,960], "src": [0,48], "f": 0, "t": 16, "d": [1720], "a": 1 }, + { "px": [24,960], "src": [24,48], "f": 0, "t": 17, "d": [1721], "a": 1 }, + { "px": [48,960], "src": [48,48], "f": 0, "t": 18, "d": [1722], "a": 1 }, + { "px": [72,960], "src": [72,48], "f": 0, "t": 19, "d": [1723], "a": 1 }, + { "px": [96,960], "src": [0,48], "f": 0, "t": 16, "d": [1724], "a": 1 }, + { "px": [120,960], "src": [0,48], "f": 0, "t": 16, "d": [1725], "a": 1 }, + { "px": [144,960], "src": [0,48], "f": 0, "t": 16, "d": [1726], "a": 1 }, + { "px": [168,960], "src": [24,48], "f": 0, "t": 17, "d": [1727], "a": 1 }, + { "px": [192,960], "src": [48,48], "f": 0, "t": 18, "d": [1728], "a": 1 }, + { "px": [216,960], "src": [72,48], "f": 0, "t": 19, "d": [1729], "a": 1 }, + { "px": [240,960], "src": [72,48], "f": 0, "t": 19, "d": [1730], "a": 1 }, + { "px": [264,960], "src": [72,48], "f": 0, "t": 19, "d": [1731], "a": 1 }, + { "px": [288,960], "src": [72,48], "f": 0, "t": 19, "d": [1732], "a": 1 }, + { "px": [312,960], "src": [72,48], "f": 0, "t": 19, "d": [1733], "a": 1 }, + { "px": [336,960], "src": [72,48], "f": 0, "t": 19, "d": [1734], "a": 1 }, + { "px": [360,960], "src": [72,48], "f": 0, "t": 19, "d": [1735], "a": 1 }, + { "px": [384,960], "src": [72,48], "f": 0, "t": 19, "d": [1736], "a": 1 }, + { "px": [408,960], "src": [72,48], "f": 0, "t": 19, "d": [1737], "a": 1 }, + { "px": [432,960], "src": [72,48], "f": 0, "t": 19, "d": [1738], "a": 1 }, + { "px": [456,960], "src": [72,48], "f": 0, "t": 19, "d": [1739], "a": 1 }, + { "px": [480,960], "src": [72,48], "f": 0, "t": 19, "d": [1740], "a": 1 }, + { "px": [504,960], "src": [72,48], "f": 0, "t": 19, "d": [1741], "a": 1 }, + { "px": [528,960], "src": [72,48], "f": 0, "t": 19, "d": [1742], "a": 1 }, + { "px": [552,960], "src": [72,48], "f": 0, "t": 19, "d": [1743], "a": 1 }, + { "px": [576,960], "src": [0,48], "f": 0, "t": 16, "d": [1744], "a": 1 }, + { "px": [600,960], "src": [24,48], "f": 0, "t": 17, "d": [1745], "a": 1 }, + { "px": [624,960], "src": [0,48], "f": 0, "t": 16, "d": [1746], "a": 1 }, + { "px": [648,960], "src": [24,48], "f": 0, "t": 17, "d": [1747], "a": 1 }, + { "px": [672,960], "src": [48,48], "f": 0, "t": 18, "d": [1748], "a": 1 }, + { "px": [696,960], "src": [72,48], "f": 0, "t": 19, "d": [1749], "a": 1 }, + { "px": [720,960], "src": [72,48], "f": 0, "t": 19, "d": [1750], "a": 1 }, + { "px": [744,960], "src": [72,48], "f": 0, "t": 19, "d": [1751], "a": 1 }, + { "px": [768,960], "src": [72,48], "f": 0, "t": 19, "d": [1752], "a": 1 }, + { "px": [792,960], "src": [72,48], "f": 0, "t": 19, "d": [1753], "a": 1 }, + { "px": [816,960], "src": [72,48], "f": 0, "t": 19, "d": [1754], "a": 1 }, + { "px": [840,960], "src": [72,48], "f": 0, "t": 19, "d": [1755], "a": 1 }, + { "px": [864,960], "src": [72,48], "f": 0, "t": 19, "d": [1756], "a": 1 }, + { "px": [888,960], "src": [72,48], "f": 0, "t": 19, "d": [1757], "a": 1 }, + { "px": [912,960], "src": [72,48], "f": 0, "t": 19, "d": [1758], "a": 1 }, + { "px": [936,960], "src": [0,48], "f": 0, "t": 16, "d": [1759], "a": 1 }, + { "px": [960,960], "src": [24,48], "f": 0, "t": 17, "d": [1760], "a": 1 }, + { "px": [984,960], "src": [48,48], "f": 0, "t": 18, "d": [1761], "a": 1 }, + { "px": [1008,960], "src": [72,48], "f": 0, "t": 19, "d": [1762], "a": 1 }, + { "px": [0,984], "src": [0,48], "f": 0, "t": 16, "d": [1763], "a": 1 }, + { "px": [24,984], "src": [0,48], "f": 0, "t": 16, "d": [1764], "a": 1 }, + { "px": [48,984], "src": [0,48], "f": 0, "t": 16, "d": [1765], "a": 1 }, + { "px": [72,984], "src": [0,48], "f": 0, "t": 16, "d": [1766], "a": 1 }, + { "px": [96,984], "src": [0,48], "f": 0, "t": 16, "d": [1767], "a": 1 }, + { "px": [120,984], "src": [0,48], "f": 0, "t": 16, "d": [1768], "a": 1 }, + { "px": [144,984], "src": [0,48], "f": 0, "t": 16, "d": [1769], "a": 1 }, + { "px": [168,984], "src": [0,48], "f": 0, "t": 16, "d": [1770], "a": 1 }, + { "px": [192,984], "src": [0,48], "f": 0, "t": 16, "d": [1771], "a": 1 }, + { "px": [216,984], "src": [0,48], "f": 0, "t": 16, "d": [1772], "a": 1 }, + { "px": [240,984], "src": [0,48], "f": 0, "t": 16, "d": [1773], "a": 1 }, + { "px": [264,984], "src": [0,48], "f": 0, "t": 16, "d": [1774], "a": 1 }, + { "px": [288,984], "src": [0,48], "f": 0, "t": 16, "d": [1775], "a": 1 }, + { "px": [312,984], "src": [24,48], "f": 0, "t": 17, "d": [1776], "a": 1 }, + { "px": [336,984], "src": [0,48], "f": 0, "t": 16, "d": [1777], "a": 1 }, + { "px": [360,984], "src": [0,48], "f": 0, "t": 16, "d": [1778], "a": 1 }, + { "px": [384,984], "src": [24,48], "f": 0, "t": 17, "d": [1779], "a": 1 }, + { "px": [408,984], "src": [48,48], "f": 0, "t": 18, "d": [1780], "a": 1 }, + { "px": [432,984], "src": [72,48], "f": 0, "t": 19, "d": [1781], "a": 1 }, + { "px": [456,984], "src": [0,48], "f": 0, "t": 16, "d": [1782], "a": 1 }, + { "px": [480,984], "src": [0,48], "f": 0, "t": 16, "d": [1783], "a": 1 }, + { "px": [504,984], "src": [0,48], "f": 0, "t": 16, "d": [1784], "a": 1 }, + { "px": [528,984], "src": [0,48], "f": 0, "t": 16, "d": [1785], "a": 1 }, + { "px": [552,984], "src": [0,48], "f": 0, "t": 16, "d": [1786], "a": 1 }, + { "px": [576,984], "src": [24,48], "f": 0, "t": 17, "d": [1787], "a": 1 }, + { "px": [600,984], "src": [48,48], "f": 0, "t": 18, "d": [1788], "a": 1 }, + { "px": [624,984], "src": [72,48], "f": 0, "t": 19, "d": [1789], "a": 1 }, + { "px": [648,984], "src": [48,48], "f": 0, "t": 18, "d": [1790], "a": 1 }, + { "px": [672,984], "src": [72,48], "f": 0, "t": 19, "d": [1791], "a": 1 }, + { "px": [696,984], "src": [72,48], "f": 0, "t": 19, "d": [1792], "a": 1 }, + { "px": [720,984], "src": [72,48], "f": 0, "t": 19, "d": [1793], "a": 1 }, + { "px": [744,984], "src": [72,48], "f": 0, "t": 19, "d": [1794], "a": 1 }, + { "px": [768,984], "src": [72,48], "f": 0, "t": 19, "d": [1795], "a": 1 }, + { "px": [792,984], "src": [72,48], "f": 0, "t": 19, "d": [1796], "a": 1 }, + { "px": [816,984], "src": [72,48], "f": 0, "t": 19, "d": [1797], "a": 1 }, + { "px": [840,984], "src": [72,48], "f": 0, "t": 19, "d": [1798], "a": 1 }, + { "px": [864,984], "src": [72,48], "f": 0, "t": 19, "d": [1799], "a": 1 }, + { "px": [888,984], "src": [72,48], "f": 0, "t": 19, "d": [1800], "a": 1 }, + { "px": [912,984], "src": [72,48], "f": 0, "t": 19, "d": [1801], "a": 1 }, + { "px": [936,984], "src": [0,48], "f": 0, "t": 16, "d": [1802], "a": 1 }, + { "px": [960,984], "src": [24,48], "f": 0, "t": 17, "d": [1803], "a": 1 }, + { "px": [984,984], "src": [48,48], "f": 0, "t": 18, "d": [1804], "a": 1 }, + { "px": [1008,984], "src": [72,48], "f": 0, "t": 19, "d": [1805], "a": 1 }, + { "px": [0,1008], "src": [0,48], "f": 0, "t": 16, "d": [1806], "a": 1 }, + { "px": [24,1008], "src": [0,48], "f": 0, "t": 16, "d": [1807], "a": 1 }, + { "px": [48,1008], "src": [24,48], "f": 0, "t": 17, "d": [1808], "a": 1 }, + { "px": [72,1008], "src": [48,48], "f": 0, "t": 18, "d": [1809], "a": 1 }, + { "px": [96,1008], "src": [72,48], "f": 0, "t": 19, "d": [1810], "a": 1 }, + { "px": [120,1008], "src": [72,48], "f": 0, "t": 19, "d": [1811], "a": 1 }, + { "px": [144,1008], "src": [72,48], "f": 0, "t": 19, "d": [1812], "a": 1 }, + { "px": [168,1008], "src": [72,48], "f": 0, "t": 19, "d": [1813], "a": 1 }, + { "px": [192,1008], "src": [72,48], "f": 0, "t": 19, "d": [1814], "a": 1 }, + { "px": [216,1008], "src": [72,48], "f": 0, "t": 19, "d": [1815], "a": 1 }, + { "px": [240,1008], "src": [72,48], "f": 0, "t": 19, "d": [1816], "a": 1 }, + { "px": [264,1008], "src": [72,48], "f": 0, "t": 19, "d": [1817], "a": 1 }, + { "px": [288,1008], "src": [72,48], "f": 0, "t": 19, "d": [1818], "a": 1 }, + { "px": [312,1008], "src": [72,48], "f": 0, "t": 19, "d": [1819], "a": 1 }, + { "px": [336,1008], "src": [72,48], "f": 0, "t": 19, "d": [1820], "a": 1 }, + { "px": [360,1008], "src": [72,48], "f": 0, "t": 19, "d": [1821], "a": 1 }, + { "px": [384,1008], "src": [0,48], "f": 0, "t": 16, "d": [1822], "a": 1 }, + { "px": [408,1008], "src": [0,48], "f": 0, "t": 16, "d": [1823], "a": 1 }, + { "px": [432,1008], "src": [0,48], "f": 0, "t": 16, "d": [1824], "a": 1 }, + { "px": [456,1008], "src": [0,48], "f": 0, "t": 16, "d": [1825], "a": 1 }, + { "px": [480,1008], "src": [0,48], "f": 0, "t": 16, "d": [1826], "a": 1 }, + { "px": [504,1008], "src": [0,48], "f": 0, "t": 16, "d": [1827], "a": 1 }, + { "px": [528,1008], "src": [0,48], "f": 0, "t": 16, "d": [1828], "a": 1 }, + { "px": [552,1008], "src": [0,48], "f": 0, "t": 16, "d": [1829], "a": 1 }, + { "px": [576,1008], "src": [0,48], "f": 0, "t": 16, "d": [1830], "a": 1 }, + { "px": [600,1008], "src": [0,48], "f": 0, "t": 16, "d": [1831], "a": 1 }, + { "px": [624,1008], "src": [0,48], "f": 0, "t": 16, "d": [1832], "a": 1 }, + { "px": [648,1008], "src": [0,48], "f": 0, "t": 16, "d": [1833], "a": 1 }, + { "px": [672,1008], "src": [0,48], "f": 0, "t": 16, "d": [1834], "a": 1 }, + { "px": [696,1008], "src": [0,48], "f": 0, "t": 16, "d": [1835], "a": 1 }, + { "px": [720,1008], "src": [0,48], "f": 0, "t": 16, "d": [1836], "a": 1 }, + { "px": [744,1008], "src": [0,48], "f": 0, "t": 16, "d": [1837], "a": 1 }, + { "px": [768,1008], "src": [0,48], "f": 0, "t": 16, "d": [1838], "a": 1 }, + { "px": [792,1008], "src": [0,48], "f": 0, "t": 16, "d": [1839], "a": 1 }, + { "px": [816,1008], "src": [0,48], "f": 0, "t": 16, "d": [1840], "a": 1 }, + { "px": [840,1008], "src": [0,48], "f": 0, "t": 16, "d": [1841], "a": 1 }, + { "px": [864,1008], "src": [0,48], "f": 0, "t": 16, "d": [1842], "a": 1 }, + { "px": [888,1008], "src": [0,48], "f": 0, "t": 16, "d": [1843], "a": 1 }, + { "px": [912,1008], "src": [0,48], "f": 0, "t": 16, "d": [1844], "a": 1 }, + { "px": [936,1008], "src": [0,48], "f": 0, "t": 16, "d": [1845], "a": 1 }, + { "px": [960,1008], "src": [24,48], "f": 0, "t": 17, "d": [1846], "a": 1 }, + { "px": [984,1008], "src": [48,48], "f": 0, "t": 18, "d": [1847], "a": 1 }, + { "px": [1008,1008], "src": [72,48], "f": 0, "t": 19, "d": [1848], "a": 1 } + ], + "entityInstances": [] + } + ], + "__neighbours": [] + } + ], + "worlds": [], + "dummyWorldIid": "d73f6090-d380-11f0-87cf-3b8d37e1b2e8" +} \ No newline at end of file diff --git a/py/assets/levels/fighting.ldtk b/py/assets/levels/fighting.ldtk new file mode 100644 index 0000000..3925af0 --- /dev/null +++ b/py/assets/levels/fighting.ldtk @@ -0,0 +1,1622 @@ +{ + "__header__": { + "fileType": "LDtk Project JSON", + "app": "LDtk", + "doc": "https://ldtk.io/json", + "schema": "https://ldtk.io/files/JSON_SCHEMA.json", + "appAuthor": "Sebastien 'deepnight' Benard", + "appVersion": "1.5.3", + "url": "https://ldtk.io" + }, + "iid": "a48de660-d380-11f0-a69c-f18cbbf0556b", + "jsonVersion": "1.5.3", + "appBuildId": 473703, + "nextUid": 109, + "identifierStyle": "Capitalize", + "toc": [], + "worldLayout": "Free", + "worldGridWidth": 256, + "worldGridHeight": 256, + "defaultLevelWidth": 256, + "defaultLevelHeight": 256, + "defaultPivotX": 0, + "defaultPivotY": 0, + "defaultGridSize": 16, + "defaultEntityWidth": 16, + "defaultEntityHeight": 16, + "bgColor": "#40465B", + "defaultLevelBgColor": "#696A79", + "minifyJson": false, + "externalLevels": false, + "exportTiled": false, + "simplifiedExport": false, + "imageExportMode": "None", + "exportLevelBg": true, + "pngFilePattern": null, + "backupOnSave": false, + "backupLimit": 10, + "backupRelPath": null, + "levelNamePattern": "Level_%idx", + "tutorialDesc": null, + "customCommands": [], + "flags": [], + "defs": { "layers": [ + { + "__type": "Entities", + "identifier": "Entities", + "type": "Entities", + "uid": 93, + "doc": null, + "uiColor": null, + "gridSize": 16, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 0.6, + "hideInList": false, + "hideFieldsWhenInactive": true, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [], + "intGridValuesGroups": [], + "autoRuleGroups": [], + "autoSourceLayerDefUid": null, + "tilesetDefUid": null, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + }, + { + "__type": "IntGrid", + "identifier": "IntGrid", + "type": "IntGrid", + "uid": 2, + "doc": null, + "uiColor": null, + "gridSize": 16, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 1, + "hideInList": false, + "hideFieldsWhenInactive": false, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [ + { "value": 1, "identifier": "walls", "color": "#C28569", "tile": null, "groupUid": 0 }, + { "value": 2, "identifier": "platforms", "color": "#BE4A2F", "tile": null, "groupUid": 0 } + ], + "intGridValuesGroups": [], + "autoRuleGroups": [ + { + "uid": 88, + "name": "platforms", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 89, + "active": true, + "size": 3, + "tileRectsIds": [[365]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-2,0,-2,2,0,0,-2,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 2, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 7012128, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 90, + "active": true, + "size": 3, + "tileRectsIds": [[369]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-2,0,0,2,-2,0,-2,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 2, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 5815173, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 91, + "active": true, + "size": 3, + "tileRectsIds": [[367]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-2,0,0,2,0,0,-2,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 2, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 8201440, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": true, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 40, + "name": "walls", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 77, + "active": true, + "size": 3, + "tileRectsIds": [[26]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3759126, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 78, + "active": true, + "size": 3, + "tileRectsIds": [[30]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,-1,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2791386, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 79, + "active": true, + "size": 3, + "tileRectsIds": [[130]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,1,-1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4294934, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 80, + "active": true, + "size": 3, + "tileRectsIds": [[126]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-1,1,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6333830, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 81, + "active": true, + "size": 3, + "tileRectsIds": [[28]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 7873880, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 82, + "active": true, + "size": 3, + "tileRectsIds": [[80]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,1,-1,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4660485, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 83, + "active": true, + "size": 3, + "tileRectsIds": [[128]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,1,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9006622, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 84, + "active": true, + "size": 3, + "tileRectsIds": [[76]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-1,1,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1488742, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 85, + "active": true, + "size": 1, + "tileRectsIds": [[78]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6147733, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": true, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 21, + "name": "plants", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 87, + "active": true, + "size": 3, + "tileRectsIds": [[186]], + "alpha": 1, + "chance": 0.2, + "breakOnMatch": true, + "pattern": [0,0,0,0,0,1,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 765260, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 86, + "active": true, + "size": 3, + "tileRectsIds": [[184]], + "alpha": 1, + "chance": 0.2, + "breakOnMatch": true, + "pattern": [0,0,0,1,0,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6199610, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 22, + "active": true, + "size": 3, + "tileRectsIds": [ [176], [178] ], + "alpha": 1, + "chance": 0.3, + "breakOnMatch": true, + "pattern": [0,0,0,0,0,0,0,1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6681065, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": false, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + } + ], + "autoSourceLayerDefUid": null, + "tilesetDefUid": 1, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + }, + { + "__type": "Tiles", + "identifier": "Background", + "type": "Tiles", + "uid": 108, + "doc": null, + "uiColor": null, + "gridSize": 16, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 1, + "hideInList": false, + "hideFieldsWhenInactive": false, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [], + "intGridValuesGroups": [], + "autoRuleGroups": [], + "autoSourceLayerDefUid": null, + "tilesetDefUid": 107, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + } + ], "entities": [ + { + "identifier": "One_way_platform", + "uid": 92, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 16, + "height": 16, + "resizableX": true, + "resizableY": true, + "minWidth": 16, + "maxWidth": null, + "minHeight": 4, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 1, + "lineOpacity": 1, + "hollow": false, + "color": "#BE4A2F", + "renderMode": "Rectangle", + "showName": true, + "tilesetId": null, + "tileRenderMode": "FitInside", + "tileRect": null, + "uiTileRect": null, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0, + "pivotY": 0, + "fieldDefs": [] + }, + { + "identifier": "Start", + "uid": 94, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 16, + "height": 16, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 1, + "lineOpacity": 1, + "hollow": false, + "color": "#6543D7", + "renderMode": "Rectangle", + "showName": true, + "tilesetId": null, + "tileRenderMode": "FitInside", + "tileRect": null, + "uiTileRect": null, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0, + "pivotY": 0, + "fieldDefs": [] + } + ], "tilesets": [ + { + "__cWid": 25, + "__cHei": 23, + "identifier": "Sunnyland", + "uid": 1, + "relPath": "../sunnyland/tileset.png", + "embedAtlas": null, + "pxWid": 400, + "pxHei": 368, + "tileGridSize": 16, + "spacing": 0, + "padding": 0, + "tags": [], + "tagsSourceEnumUid": null, + "enumTags": [], + "customData": [], + "savedSelections": [], + "cachedPixelData": { + "opaqueTiles": "00000000000000000000000000101010100010110110000000000000000000011011011011001010101000100000000000000000000000000010100000000010101010000001010001010000000000000000000000000000000010100000001010100000000000000000000000000000000000000000000010101000000010100100000000000000000000000000000000101010000000000000000000000000000000000000101010100000000000000000010101000001000000000101000010000000000000000010100000010011011100000001010000001001100000000001101100001110110101010000000000000000000000000000010110000111011101000000000011000011101110000000000000000000000000000000000", + "averageColors": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9850000f9850000f9850000fa65000069557a65f8450000f644f9650000f965f644000049b5c9950000c99549b500000000000000000000000000000000000000000000000000000000f955f7450000f745f9550000f865f7450000f745f86500000000f9550000f6450000f9550000f845695500006955f845000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8550000f85500000000000079a5000079a5000000000000f9550000f8550000f9550000f8457a6569550000000000000000f8550000f855000000000000f7550000f755000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077a5000078b50000f8450000f7450000947400009474000000000000fa650000f9550000fa65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9550000f6450000f955000000000000000000000000a955f8450000f845a9550000f85500000000ca65b965000000000000000000000000000000000000000000000000000000000000a9550000a9550000000000000000000000000000000000000000fa650000f9550000fa650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7450000f8550000f8550000f855000000000000000000000000000000000000000000000000000000000000000000000000f3440000f3450000f534000000000000e9950000f9950000e995000000000000000000000000b855f5340000f534b855000000000000f33400000000000000000000000000000000000000000000000000000000000000000000f7440000f744000000000000000000000000f43500000000f435f4350000f334f436f335000000000000000000000000b955f5340000f534b95500000000000000000000f34500000000f335f3350000000000000000000000000000000000000000f744f3340000f334f7440000000000000000f344f345f3440000f335f3350000f5340000f4350000f33400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa650000f955f9550000000000000000f334f335f3450000f345f335f3340000f7550000000000000000000000000000000000000000f955f9550000000000000000f335f344f3440000f344f344f3350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "__cWid": 24, + "__cHei": 15, + "identifier": "Back", + "uid": 107, + "relPath": "../sunnyland/back.png", + "embedAtlas": null, + "pxWid": 384, + "pxHei": 240, + "tileGridSize": 16, + "spacing": 0, + "padding": 0, + "tags": [], + "tagsSourceEnumUid": null, + "enumTags": [], + "customData": [], + "savedSelections": [], + "cachedPixelData": { + "opaqueTiles": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", + "averageColors": "f4eff4eff4eff4eff5eff7eff5eff5eff5eff6eff6eff6eff6eff5eff6eff6eff6eff6eff6eff7eff7eff6eff5eff4eff5eff7eff7eff6eff6eff7eff8eff7eff5eff6eff7eff7eff5eff6eff7eff7eff6eff7eff9eff7eff7eff7eff5eff4eff5eff8eff9eff9eff8eff7eff6eff8eff9eff7eff6eff9eff8eff8eff8effceffbeff8eff6eff8eff9eff9eff7eff4eff6eff8eff8eff8eff7eff8eff8eff9eff9eff7eff8eff7eff8effaeffceffceffceffceff9eff8eff7eff8eff6eff4eff5eff8effbeffbeff8eff7effceffceffceffbeff9effaeffbeffceffceffceffceffbeffbeffceffbeffceff9eff4eff8effceffceffceffceffbeffceffceffceffceffceffceffceffdeffceffbeffbeffceffceffceffbeffbeffbeff6effbeffceffceffceffbeffceffceffbeffceffbeffceffceffceffbeffbeffbeffbeffbeffbeffbeffbeffbeffbeffbeff6eef6eef6eef5eef6eef6eef6eef5eef6eef6eef6eef5eef6eef6eef6eef5eef6eef6eef6eef5eef6eef6eef6eef5eef3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3cff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bff3bf" + } + } + ], "enums": [], "externalEnums": [], "levelFields": [] }, + "levels": [ + { + "identifier": "Stage", + "iid": "a48ed0c0-d380-11f0-a69c-6511375700bf", + "uid": 0, + "worldX": 0, + "worldY": 0, + "worldDepth": 0, + "pxWid": 512, + "pxHei": 256, + "__bgColor": "#696A79", + "bgColor": null, + "useAutoIdentifier": false, + "bgRelPath": null, + "bgPos": null, + "bgPivotX": 0.5, + "bgPivotY": 0.5, + "__smartColor": "#ADADB5", + "__bgPos": null, + "externalRelPath": null, + "fieldInstances": [], + "layerInstances": [ + { + "__identifier": "Entities", + "__type": "Entities", + "__cWid": 32, + "__cHei": 16, + "__gridSize": 16, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": null, + "__tilesetRelPath": null, + "iid": "d12b1320-d380-11f0-a69c-459639b72f2e", + "levelId": 0, + "layerDefUid": 93, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [], + "autoLayerTiles": [], + "seed": 2696159, + "overrideTilesetUid": null, + "gridTiles": [], + "entityInstances": [ + { + "__identifier": "One_way_platform", + "__grid": [5,8], + "__pivot": [0,0], + "__tags": [], + "__tile": null, + "__smartColor": "#BE4A2F", + "iid": "dc0257e0-d380-11f0-a69c-f3c92a38b57d", + "width": 64, + "height": 4, + "defUid": 92, + "px": [80,128], + "fieldInstances": [], + "__worldX": 80, + "__worldY": 128 + }, + { + "__identifier": "One_way_platform", + "__grid": [13,5], + "__pivot": [0,0], + "__tags": [], + "__tile": null, + "__smartColor": "#BE4A2F", + "iid": "e68cb520-d380-11f0-a69c-a57b52b096e9", + "width": 80, + "height": 4, + "defUid": 92, + "px": [208,80], + "fieldInstances": [], + "__worldX": 208, + "__worldY": 80 + }, + { + "__identifier": "One_way_platform", + "__grid": [22,8], + "__pivot": [0,0], + "__tags": [], + "__tile": null, + "__smartColor": "#BE4A2F", + "iid": "e8d14df0-d380-11f0-a69c-834d5fa3ce5c", + "width": 64, + "height": 4, + "defUid": 92, + "px": [352,128], + "fieldInstances": [], + "__worldX": 352, + "__worldY": 128 + }, + { + "__identifier": "Start", + "__grid": [6,6], + "__pivot": [0,0], + "__tags": [], + "__tile": null, + "__smartColor": "#6543D7", + "iid": "10f18570-d380-11f0-a69c-13ebff49b291", + "width": 16, + "height": 16, + "defUid": 94, + "px": [96,96], + "fieldInstances": [], + "__worldX": 96, + "__worldY": 96 + }, + { + "__identifier": "Start", + "__grid": [24,6], + "__pivot": [0,0], + "__tags": [], + "__tile": null, + "__smartColor": "#6543D7", + "iid": "119343b0-d380-11f0-a69c-5573405ca8e2", + "width": 16, + "height": 16, + "defUid": 94, + "px": [384,96], + "fieldInstances": [], + "__worldX": 384, + "__worldY": 96 + }, + { + "__identifier": "Start", + "__grid": [15,3], + "__pivot": [0,0], + "__tags": [], + "__tile": null, + "__smartColor": "#6543D7", + "iid": "12817440-d380-11f0-a69c-43651210f778", + "width": 16, + "height": 16, + "defUid": 94, + "px": [240,48], + "fieldInstances": [], + "__worldX": 240, + "__worldY": 48 + }, + { + "__identifier": "Start", + "__grid": [15,10], + "__pivot": [0,0], + "__tags": [], + "__tile": null, + "__smartColor": "#6543D7", + "iid": "133f4600-d380-11f0-a69c-0fe2575c3095", + "width": 16, + "height": 16, + "defUid": 94, + "px": [240,160], + "fieldInstances": [], + "__worldX": 240, + "__worldY": 160 + } + ] + }, + { + "__identifier": "IntGrid", + "__type": "IntGrid", + "__cWid": 32, + "__cHei": 16, + "__gridSize": 16, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": 1, + "__tilesetRelPath": "../sunnyland/tileset.png", + "iid": "c461a2b0-d380-11f0-a69c-bd8e7588af77", + "levelId": 0, + "layerDefUid": 2, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2, + 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2, + 2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 + ], + "autoLayerTiles": [ + { "px": [128,176], "src": [48,112], "f": 0, "t": 178, "d": [22,360], "a": 1 }, + { "px": [192,176], "src": [48,112], "f": 0, "t": 178, "d": [22,364], "a": 1 }, + { "px": [240,176], "src": [16,112], "f": 0, "t": 176, "d": [22,367], "a": 1 }, + { "px": [288,176], "src": [16,112], "f": 0, "t": 176, "d": [22,370], "a": 1 }, + { "px": [304,176], "src": [16,112], "f": 0, "t": 176, "d": [22,371], "a": 1 }, + { "px": [320,176], "src": [16,112], "f": 0, "t": 176, "d": [22,372], "a": 1 }, + { "px": [368,176], "src": [16,112], "f": 0, "t": 176, "d": [22,375], "a": 1 }, + { "px": [384,224], "src": [144,112], "f": 0, "t": 184, "d": [86,472], "a": 1 }, + { "px": [112,208], "src": [176,112], "f": 0, "t": 186, "d": [87,423], "a": 1 }, + { "px": [112,240], "src": [176,112], "f": 0, "t": 186, "d": [87,487], "a": 1 }, + { "px": [144,208], "src": [48,48], "f": 0, "t": 78, "d": [85,425], "a": 1 }, + { "px": [160,208], "src": [48,48], "f": 0, "t": 78, "d": [85,426], "a": 1 }, + { "px": [176,208], "src": [48,48], "f": 0, "t": 78, "d": [85,427], "a": 1 }, + { "px": [192,208], "src": [48,48], "f": 0, "t": 78, "d": [85,428], "a": 1 }, + { "px": [208,208], "src": [48,48], "f": 0, "t": 78, "d": [85,429], "a": 1 }, + { "px": [224,208], "src": [48,48], "f": 0, "t": 78, "d": [85,430], "a": 1 }, + { "px": [240,208], "src": [48,48], "f": 0, "t": 78, "d": [85,431], "a": 1 }, + { "px": [256,208], "src": [48,48], "f": 0, "t": 78, "d": [85,432], "a": 1 }, + { "px": [272,208], "src": [48,48], "f": 0, "t": 78, "d": [85,433], "a": 1 }, + { "px": [288,208], "src": [48,48], "f": 0, "t": 78, "d": [85,434], "a": 1 }, + { "px": [304,208], "src": [48,48], "f": 0, "t": 78, "d": [85,435], "a": 1 }, + { "px": [320,208], "src": [48,48], "f": 0, "t": 78, "d": [85,436], "a": 1 }, + { "px": [336,208], "src": [48,48], "f": 0, "t": 78, "d": [85,437], "a": 1 }, + { "px": [352,208], "src": [48,48], "f": 0, "t": 78, "d": [85,438], "a": 1 }, + { "px": [144,224], "src": [48,48], "f": 0, "t": 78, "d": [85,457], "a": 1 }, + { "px": [160,224], "src": [48,48], "f": 0, "t": 78, "d": [85,458], "a": 1 }, + { "px": [176,224], "src": [48,48], "f": 0, "t": 78, "d": [85,459], "a": 1 }, + { "px": [192,224], "src": [48,48], "f": 0, "t": 78, "d": [85,460], "a": 1 }, + { "px": [208,224], "src": [48,48], "f": 0, "t": 78, "d": [85,461], "a": 1 }, + { "px": [224,224], "src": [48,48], "f": 0, "t": 78, "d": [85,462], "a": 1 }, + { "px": [240,224], "src": [48,48], "f": 0, "t": 78, "d": [85,463], "a": 1 }, + { "px": [256,224], "src": [48,48], "f": 0, "t": 78, "d": [85,464], "a": 1 }, + { "px": [272,224], "src": [48,48], "f": 0, "t": 78, "d": [85,465], "a": 1 }, + { "px": [288,224], "src": [48,48], "f": 0, "t": 78, "d": [85,466], "a": 1 }, + { "px": [304,224], "src": [48,48], "f": 0, "t": 78, "d": [85,467], "a": 1 }, + { "px": [320,224], "src": [48,48], "f": 0, "t": 78, "d": [85,468], "a": 1 }, + { "px": [336,224], "src": [48,48], "f": 0, "t": 78, "d": [85,469], "a": 1 }, + { "px": [352,224], "src": [48,48], "f": 0, "t": 78, "d": [85,470], "a": 1 }, + { "px": [144,240], "src": [48,48], "f": 0, "t": 78, "d": [85,489], "a": 1 }, + { "px": [160,240], "src": [48,48], "f": 0, "t": 78, "d": [85,490], "a": 1 }, + { "px": [176,240], "src": [48,48], "f": 0, "t": 78, "d": [85,491], "a": 1 }, + { "px": [192,240], "src": [48,48], "f": 0, "t": 78, "d": [85,492], "a": 1 }, + { "px": [208,240], "src": [48,48], "f": 0, "t": 78, "d": [85,493], "a": 1 }, + { "px": [224,240], "src": [48,48], "f": 0, "t": 78, "d": [85,494], "a": 1 }, + { "px": [240,240], "src": [48,48], "f": 0, "t": 78, "d": [85,495], "a": 1 }, + { "px": [256,240], "src": [48,48], "f": 0, "t": 78, "d": [85,496], "a": 1 }, + { "px": [272,240], "src": [48,48], "f": 0, "t": 78, "d": [85,497], "a": 1 }, + { "px": [288,240], "src": [48,48], "f": 0, "t": 78, "d": [85,498], "a": 1 }, + { "px": [304,240], "src": [48,48], "f": 0, "t": 78, "d": [85,499], "a": 1 }, + { "px": [320,240], "src": [48,48], "f": 0, "t": 78, "d": [85,500], "a": 1 }, + { "px": [336,240], "src": [48,48], "f": 0, "t": 78, "d": [85,501], "a": 1 }, + { "px": [352,240], "src": [48,48], "f": 0, "t": 78, "d": [85,502], "a": 1 }, + { "px": [128,208], "src": [16,48], "f": 0, "t": 76, "d": [84,424], "a": 1 }, + { "px": [128,224], "src": [16,48], "f": 0, "t": 76, "d": [84,456], "a": 1 }, + { "px": [128,240], "src": [16,48], "f": 0, "t": 76, "d": [84,488], "a": 1 }, + { "px": [368,208], "src": [80,48], "f": 0, "t": 80, "d": [82,439], "a": 1 }, + { "px": [368,224], "src": [80,48], "f": 0, "t": 80, "d": [82,471], "a": 1 }, + { "px": [368,240], "src": [80,48], "f": 0, "t": 80, "d": [82,503], "a": 1 }, + { "px": [144,192], "src": [48,16], "f": 0, "t": 28, "d": [81,393], "a": 1 }, + { "px": [160,192], "src": [48,16], "f": 0, "t": 28, "d": [81,394], "a": 1 }, + { "px": [176,192], "src": [48,16], "f": 0, "t": 28, "d": [81,395], "a": 1 }, + { "px": [192,192], "src": [48,16], "f": 0, "t": 28, "d": [81,396], "a": 1 }, + { "px": [208,192], "src": [48,16], "f": 0, "t": 28, "d": [81,397], "a": 1 }, + { "px": [224,192], "src": [48,16], "f": 0, "t": 28, "d": [81,398], "a": 1 }, + { "px": [240,192], "src": [48,16], "f": 0, "t": 28, "d": [81,399], "a": 1 }, + { "px": [256,192], "src": [48,16], "f": 0, "t": 28, "d": [81,400], "a": 1 }, + { "px": [272,192], "src": [48,16], "f": 0, "t": 28, "d": [81,401], "a": 1 }, + { "px": [288,192], "src": [48,16], "f": 0, "t": 28, "d": [81,402], "a": 1 }, + { "px": [304,192], "src": [48,16], "f": 0, "t": 28, "d": [81,403], "a": 1 }, + { "px": [320,192], "src": [48,16], "f": 0, "t": 28, "d": [81,404], "a": 1 }, + { "px": [336,192], "src": [48,16], "f": 0, "t": 28, "d": [81,405], "a": 1 }, + { "px": [352,192], "src": [48,16], "f": 0, "t": 28, "d": [81,406], "a": 1 }, + { "px": [368,192], "src": [80,16], "f": 0, "t": 30, "d": [78,407], "a": 1 }, + { "px": [128,192], "src": [16,16], "f": 0, "t": 26, "d": [77,392], "a": 1 }, + { "px": [224,80], "src": [272,224], "f": 0, "t": 367, "d": [91,174], "a": 1 }, + { "px": [240,80], "src": [272,224], "f": 0, "t": 367, "d": [91,175], "a": 1 }, + { "px": [256,80], "src": [272,224], "f": 0, "t": 367, "d": [91,176], "a": 1 }, + { "px": [96,128], "src": [272,224], "f": 0, "t": 367, "d": [91,262], "a": 1 }, + { "px": [112,128], "src": [272,224], "f": 0, "t": 367, "d": [91,263], "a": 1 }, + { "px": [368,128], "src": [272,224], "f": 0, "t": 367, "d": [91,279], "a": 1 }, + { "px": [384,128], "src": [272,224], "f": 0, "t": 367, "d": [91,280], "a": 1 }, + { "px": [272,80], "src": [304,224], "f": 0, "t": 369, "d": [90,177], "a": 1 }, + { "px": [128,128], "src": [304,224], "f": 0, "t": 369, "d": [90,264], "a": 1 }, + { "px": [400,128], "src": [304,224], "f": 0, "t": 369, "d": [90,281], "a": 1 }, + { "px": [208,80], "src": [240,224], "f": 0, "t": 365, "d": [89,173], "a": 1 }, + { "px": [80,128], "src": [240,224], "f": 0, "t": 365, "d": [89,261], "a": 1 }, + { "px": [352,128], "src": [240,224], "f": 0, "t": 365, "d": [89,278], "a": 1 } + ], + "seed": 7598100, + "overrideTilesetUid": null, + "gridTiles": [], + "entityInstances": [] + }, + { + "__identifier": "Background", + "__type": "Tiles", + "__cWid": 32, + "__cHei": 16, + "__gridSize": 16, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": 107, + "__tilesetRelPath": "../sunnyland/back.png", + "iid": "40fafac0-d380-11f0-a69c-b185e3ad3620", + "levelId": 0, + "layerDefUid": 108, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [], + "autoLayerTiles": [], + "seed": 8728425, + "overrideTilesetUid": null, + "gridTiles": [ + { "px": [0,0], "src": [0,0], "f": 0, "t": 0, "d": [0], "a": 1 }, + { "px": [16,0], "src": [16,0], "f": 0, "t": 1, "d": [1], "a": 1 }, + { "px": [32,0], "src": [32,0], "f": 0, "t": 2, "d": [2], "a": 1 }, + { "px": [48,0], "src": [48,0], "f": 0, "t": 3, "d": [3], "a": 1 }, + { "px": [64,0], "src": [64,0], "f": 0, "t": 4, "d": [4], "a": 1 }, + { "px": [80,0], "src": [80,0], "f": 0, "t": 5, "d": [5], "a": 1 }, + { "px": [96,0], "src": [96,0], "f": 0, "t": 6, "d": [6], "a": 1 }, + { "px": [112,0], "src": [112,0], "f": 0, "t": 7, "d": [7], "a": 1 }, + { "px": [128,0], "src": [128,0], "f": 0, "t": 8, "d": [8], "a": 1 }, + { "px": [144,0], "src": [144,0], "f": 0, "t": 9, "d": [9], "a": 1 }, + { "px": [160,0], "src": [160,0], "f": 0, "t": 10, "d": [10], "a": 1 }, + { "px": [176,0], "src": [176,0], "f": 0, "t": 11, "d": [11], "a": 1 }, + { "px": [192,0], "src": [192,0], "f": 0, "t": 12, "d": [12], "a": 1 }, + { "px": [208,0], "src": [208,0], "f": 0, "t": 13, "d": [13], "a": 1 }, + { "px": [224,0], "src": [224,0], "f": 0, "t": 14, "d": [14], "a": 1 }, + { "px": [240,0], "src": [240,0], "f": 0, "t": 15, "d": [15], "a": 1 }, + { "px": [256,0], "src": [256,0], "f": 0, "t": 16, "d": [16], "a": 1 }, + { "px": [272,0], "src": [272,0], "f": 0, "t": 17, "d": [17], "a": 1 }, + { "px": [288,0], "src": [288,0], "f": 0, "t": 18, "d": [18], "a": 1 }, + { "px": [304,0], "src": [304,0], "f": 0, "t": 19, "d": [19], "a": 1 }, + { "px": [320,0], "src": [320,0], "f": 0, "t": 20, "d": [20], "a": 1 }, + { "px": [336,0], "src": [336,0], "f": 0, "t": 21, "d": [21], "a": 1 }, + { "px": [352,0], "src": [352,0], "f": 0, "t": 22, "d": [22], "a": 1 }, + { "px": [368,0], "src": [368,0], "f": 0, "t": 23, "d": [23], "a": 1 }, + { "px": [384,0], "src": [0,0], "f": 0, "t": 0, "d": [24], "a": 1 }, + { "px": [400,0], "src": [16,0], "f": 0, "t": 1, "d": [25], "a": 1 }, + { "px": [416,0], "src": [32,0], "f": 0, "t": 2, "d": [26], "a": 1 }, + { "px": [432,0], "src": [48,0], "f": 0, "t": 3, "d": [27], "a": 1 }, + { "px": [448,0], "src": [64,0], "f": 0, "t": 4, "d": [28], "a": 1 }, + { "px": [464,0], "src": [80,0], "f": 0, "t": 5, "d": [29], "a": 1 }, + { "px": [480,0], "src": [96,0], "f": 0, "t": 6, "d": [30], "a": 1 }, + { "px": [496,0], "src": [112,0], "f": 0, "t": 7, "d": [31], "a": 1 }, + { "px": [0,16], "src": [0,16], "f": 0, "t": 24, "d": [32], "a": 1 }, + { "px": [16,16], "src": [16,16], "f": 0, "t": 25, "d": [33], "a": 1 }, + { "px": [32,16], "src": [32,16], "f": 0, "t": 26, "d": [34], "a": 1 }, + { "px": [48,16], "src": [48,16], "f": 0, "t": 27, "d": [35], "a": 1 }, + { "px": [64,16], "src": [64,16], "f": 0, "t": 28, "d": [36], "a": 1 }, + { "px": [80,16], "src": [80,16], "f": 0, "t": 29, "d": [37], "a": 1 }, + { "px": [96,16], "src": [96,16], "f": 0, "t": 30, "d": [38], "a": 1 }, + { "px": [112,16], "src": [112,16], "f": 0, "t": 31, "d": [39], "a": 1 }, + { "px": [128,16], "src": [128,16], "f": 0, "t": 32, "d": [40], "a": 1 }, + { "px": [144,16], "src": [144,16], "f": 0, "t": 33, "d": [41], "a": 1 }, + { "px": [160,16], "src": [160,16], "f": 0, "t": 34, "d": [42], "a": 1 }, + { "px": [176,16], "src": [176,16], "f": 0, "t": 35, "d": [43], "a": 1 }, + { "px": [192,16], "src": [192,16], "f": 0, "t": 36, "d": [44], "a": 1 }, + { "px": [208,16], "src": [208,16], "f": 0, "t": 37, "d": [45], "a": 1 }, + { "px": [224,16], "src": [224,16], "f": 0, "t": 38, "d": [46], "a": 1 }, + { "px": [240,16], "src": [240,16], "f": 0, "t": 39, "d": [47], "a": 1 }, + { "px": [256,16], "src": [256,16], "f": 0, "t": 40, "d": [48], "a": 1 }, + { "px": [272,16], "src": [272,16], "f": 0, "t": 41, "d": [49], "a": 1 }, + { "px": [288,16], "src": [288,16], "f": 0, "t": 42, "d": [50], "a": 1 }, + { "px": [304,16], "src": [304,16], "f": 0, "t": 43, "d": [51], "a": 1 }, + { "px": [320,16], "src": [320,16], "f": 0, "t": 44, "d": [52], "a": 1 }, + { "px": [336,16], "src": [336,16], "f": 0, "t": 45, "d": [53], "a": 1 }, + { "px": [352,16], "src": [352,16], "f": 0, "t": 46, "d": [54], "a": 1 }, + { "px": [368,16], "src": [368,16], "f": 0, "t": 47, "d": [55], "a": 1 }, + { "px": [384,16], "src": [0,16], "f": 0, "t": 24, "d": [56], "a": 1 }, + { "px": [400,16], "src": [16,16], "f": 0, "t": 25, "d": [57], "a": 1 }, + { "px": [416,16], "src": [32,16], "f": 0, "t": 26, "d": [58], "a": 1 }, + { "px": [432,16], "src": [48,16], "f": 0, "t": 27, "d": [59], "a": 1 }, + { "px": [448,16], "src": [64,16], "f": 0, "t": 28, "d": [60], "a": 1 }, + { "px": [464,16], "src": [80,16], "f": 0, "t": 29, "d": [61], "a": 1 }, + { "px": [480,16], "src": [96,16], "f": 0, "t": 30, "d": [62], "a": 1 }, + { "px": [496,16], "src": [112,16], "f": 0, "t": 31, "d": [63], "a": 1 }, + { "px": [0,32], "src": [0,32], "f": 0, "t": 48, "d": [64], "a": 1 }, + { "px": [16,32], "src": [16,32], "f": 0, "t": 49, "d": [65], "a": 1 }, + { "px": [32,32], "src": [32,32], "f": 0, "t": 50, "d": [66], "a": 1 }, + { "px": [48,32], "src": [48,32], "f": 0, "t": 51, "d": [67], "a": 1 }, + { "px": [64,32], "src": [64,32], "f": 0, "t": 52, "d": [68], "a": 1 }, + { "px": [80,32], "src": [80,32], "f": 0, "t": 53, "d": [69], "a": 1 }, + { "px": [96,32], "src": [96,32], "f": 0, "t": 54, "d": [70], "a": 1 }, + { "px": [112,32], "src": [112,32], "f": 0, "t": 55, "d": [71], "a": 1 }, + { "px": [128,32], "src": [128,32], "f": 0, "t": 56, "d": [72], "a": 1 }, + { "px": [144,32], "src": [144,32], "f": 0, "t": 57, "d": [73], "a": 1 }, + { "px": [160,32], "src": [160,32], "f": 0, "t": 58, "d": [74], "a": 1 }, + { "px": [176,32], "src": [176,32], "f": 0, "t": 59, "d": [75], "a": 1 }, + { "px": [192,32], "src": [192,32], "f": 0, "t": 60, "d": [76], "a": 1 }, + { "px": [208,32], "src": [208,32], "f": 0, "t": 61, "d": [77], "a": 1 }, + { "px": [224,32], "src": [224,32], "f": 0, "t": 62, "d": [78], "a": 1 }, + { "px": [240,32], "src": [240,32], "f": 0, "t": 63, "d": [79], "a": 1 }, + { "px": [256,32], "src": [256,32], "f": 0, "t": 64, "d": [80], "a": 1 }, + { "px": [272,32], "src": [272,32], "f": 0, "t": 65, "d": [81], "a": 1 }, + { "px": [288,32], "src": [288,32], "f": 0, "t": 66, "d": [82], "a": 1 }, + { "px": [304,32], "src": [304,32], "f": 0, "t": 67, "d": [83], "a": 1 }, + { "px": [320,32], "src": [320,32], "f": 0, "t": 68, "d": [84], "a": 1 }, + { "px": [336,32], "src": [336,32], "f": 0, "t": 69, "d": [85], "a": 1 }, + { "px": [352,32], "src": [352,32], "f": 0, "t": 70, "d": [86], "a": 1 }, + { "px": [368,32], "src": [368,32], "f": 0, "t": 71, "d": [87], "a": 1 }, + { "px": [384,32], "src": [0,32], "f": 0, "t": 48, "d": [88], "a": 1 }, + { "px": [400,32], "src": [16,32], "f": 0, "t": 49, "d": [89], "a": 1 }, + { "px": [416,32], "src": [32,32], "f": 0, "t": 50, "d": [90], "a": 1 }, + { "px": [432,32], "src": [48,32], "f": 0, "t": 51, "d": [91], "a": 1 }, + { "px": [448,32], "src": [64,32], "f": 0, "t": 52, "d": [92], "a": 1 }, + { "px": [464,32], "src": [80,32], "f": 0, "t": 53, "d": [93], "a": 1 }, + { "px": [480,32], "src": [96,32], "f": 0, "t": 54, "d": [94], "a": 1 }, + { "px": [496,32], "src": [112,32], "f": 0, "t": 55, "d": [95], "a": 1 }, + { "px": [0,48], "src": [0,48], "f": 0, "t": 72, "d": [96], "a": 1 }, + { "px": [16,48], "src": [16,48], "f": 0, "t": 73, "d": [97], "a": 1 }, + { "px": [32,48], "src": [32,48], "f": 0, "t": 74, "d": [98], "a": 1 }, + { "px": [48,48], "src": [48,48], "f": 0, "t": 75, "d": [99], "a": 1 }, + { "px": [64,48], "src": [64,48], "f": 0, "t": 76, "d": [100], "a": 1 }, + { "px": [80,48], "src": [80,48], "f": 0, "t": 77, "d": [101], "a": 1 }, + { "px": [96,48], "src": [96,48], "f": 0, "t": 78, "d": [102], "a": 1 }, + { "px": [112,48], "src": [112,48], "f": 0, "t": 79, "d": [103], "a": 1 }, + { "px": [128,48], "src": [128,48], "f": 0, "t": 80, "d": [104], "a": 1 }, + { "px": [144,48], "src": [144,48], "f": 0, "t": 81, "d": [105], "a": 1 }, + { "px": [160,48], "src": [160,48], "f": 0, "t": 82, "d": [106], "a": 1 }, + { "px": [176,48], "src": [176,48], "f": 0, "t": 83, "d": [107], "a": 1 }, + { "px": [192,48], "src": [192,48], "f": 0, "t": 84, "d": [108], "a": 1 }, + { "px": [208,48], "src": [208,48], "f": 0, "t": 85, "d": [109], "a": 1 }, + { "px": [224,48], "src": [224,48], "f": 0, "t": 86, "d": [110], "a": 1 }, + { "px": [240,48], "src": [240,48], "f": 0, "t": 87, "d": [111], "a": 1 }, + { "px": [256,48], "src": [256,48], "f": 0, "t": 88, "d": [112], "a": 1 }, + { "px": [272,48], "src": [272,48], "f": 0, "t": 89, "d": [113], "a": 1 }, + { "px": [288,48], "src": [288,48], "f": 0, "t": 90, "d": [114], "a": 1 }, + { "px": [304,48], "src": [304,48], "f": 0, "t": 91, "d": [115], "a": 1 }, + { "px": [320,48], "src": [320,48], "f": 0, "t": 92, "d": [116], "a": 1 }, + { "px": [336,48], "src": [336,48], "f": 0, "t": 93, "d": [117], "a": 1 }, + { "px": [352,48], "src": [352,48], "f": 0, "t": 94, "d": [118], "a": 1 }, + { "px": [368,48], "src": [368,48], "f": 0, "t": 95, "d": [119], "a": 1 }, + { "px": [384,48], "src": [0,48], "f": 0, "t": 72, "d": [120], "a": 1 }, + { "px": [400,48], "src": [16,48], "f": 0, "t": 73, "d": [121], "a": 1 }, + { "px": [416,48], "src": [32,48], "f": 0, "t": 74, "d": [122], "a": 1 }, + { "px": [432,48], "src": [48,48], "f": 0, "t": 75, "d": [123], "a": 1 }, + { "px": [448,48], "src": [64,48], "f": 0, "t": 76, "d": [124], "a": 1 }, + { "px": [464,48], "src": [80,48], "f": 0, "t": 77, "d": [125], "a": 1 }, + { "px": [480,48], "src": [96,48], "f": 0, "t": 78, "d": [126], "a": 1 }, + { "px": [496,48], "src": [112,48], "f": 0, "t": 79, "d": [127], "a": 1 }, + { "px": [0,64], "src": [0,64], "f": 0, "t": 96, "d": [128], "a": 1 }, + { "px": [16,64], "src": [16,64], "f": 0, "t": 97, "d": [129], "a": 1 }, + { "px": [32,64], "src": [32,64], "f": 0, "t": 98, "d": [130], "a": 1 }, + { "px": [48,64], "src": [48,64], "f": 0, "t": 99, "d": [131], "a": 1 }, + { "px": [64,64], "src": [64,64], "f": 0, "t": 100, "d": [132], "a": 1 }, + { "px": [80,64], "src": [80,64], "f": 0, "t": 101, "d": [133], "a": 1 }, + { "px": [96,64], "src": [96,64], "f": 0, "t": 102, "d": [134], "a": 1 }, + { "px": [112,64], "src": [112,64], "f": 0, "t": 103, "d": [135], "a": 1 }, + { "px": [128,64], "src": [128,64], "f": 0, "t": 104, "d": [136], "a": 1 }, + { "px": [144,64], "src": [144,64], "f": 0, "t": 105, "d": [137], "a": 1 }, + { "px": [160,64], "src": [160,64], "f": 0, "t": 106, "d": [138], "a": 1 }, + { "px": [176,64], "src": [176,64], "f": 0, "t": 107, "d": [139], "a": 1 }, + { "px": [192,64], "src": [192,64], "f": 0, "t": 108, "d": [140], "a": 1 }, + { "px": [208,64], "src": [208,64], "f": 0, "t": 109, "d": [141], "a": 1 }, + { "px": [224,64], "src": [224,64], "f": 0, "t": 110, "d": [142], "a": 1 }, + { "px": [240,64], "src": [240,64], "f": 0, "t": 111, "d": [143], "a": 1 }, + { "px": [256,64], "src": [256,64], "f": 0, "t": 112, "d": [144], "a": 1 }, + { "px": [272,64], "src": [272,64], "f": 0, "t": 113, "d": [145], "a": 1 }, + { "px": [288,64], "src": [288,64], "f": 0, "t": 114, "d": [146], "a": 1 }, + { "px": [304,64], "src": [304,64], "f": 0, "t": 115, "d": [147], "a": 1 }, + { "px": [320,64], "src": [320,64], "f": 0, "t": 116, "d": [148], "a": 1 }, + { "px": [336,64], "src": [336,64], "f": 0, "t": 117, "d": [149], "a": 1 }, + { "px": [352,64], "src": [352,64], "f": 0, "t": 118, "d": [150], "a": 1 }, + { "px": [368,64], "src": [368,64], "f": 0, "t": 119, "d": [151], "a": 1 }, + { "px": [384,64], "src": [0,64], "f": 0, "t": 96, "d": [152], "a": 1 }, + { "px": [400,64], "src": [16,64], "f": 0, "t": 97, "d": [153], "a": 1 }, + { "px": [416,64], "src": [32,64], "f": 0, "t": 98, "d": [154], "a": 1 }, + { "px": [432,64], "src": [48,64], "f": 0, "t": 99, "d": [155], "a": 1 }, + { "px": [448,64], "src": [64,64], "f": 0, "t": 100, "d": [156], "a": 1 }, + { "px": [464,64], "src": [80,64], "f": 0, "t": 101, "d": [157], "a": 1 }, + { "px": [480,64], "src": [96,64], "f": 0, "t": 102, "d": [158], "a": 1 }, + { "px": [496,64], "src": [112,64], "f": 0, "t": 103, "d": [159], "a": 1 }, + { "px": [0,80], "src": [0,80], "f": 0, "t": 120, "d": [160], "a": 1 }, + { "px": [16,80], "src": [16,80], "f": 0, "t": 121, "d": [161], "a": 1 }, + { "px": [32,80], "src": [32,80], "f": 0, "t": 122, "d": [162], "a": 1 }, + { "px": [48,80], "src": [48,80], "f": 0, "t": 123, "d": [163], "a": 1 }, + { "px": [64,80], "src": [64,80], "f": 0, "t": 124, "d": [164], "a": 1 }, + { "px": [80,80], "src": [80,80], "f": 0, "t": 125, "d": [165], "a": 1 }, + { "px": [96,80], "src": [96,80], "f": 0, "t": 126, "d": [166], "a": 1 }, + { "px": [112,80], "src": [112,80], "f": 0, "t": 127, "d": [167], "a": 1 }, + { "px": [128,80], "src": [128,80], "f": 0, "t": 128, "d": [168], "a": 1 }, + { "px": [144,80], "src": [144,80], "f": 0, "t": 129, "d": [169], "a": 1 }, + { "px": [160,80], "src": [160,80], "f": 0, "t": 130, "d": [170], "a": 1 }, + { "px": [176,80], "src": [176,80], "f": 0, "t": 131, "d": [171], "a": 1 }, + { "px": [192,80], "src": [192,80], "f": 0, "t": 132, "d": [172], "a": 1 }, + { "px": [208,80], "src": [208,80], "f": 0, "t": 133, "d": [173], "a": 1 }, + { "px": [224,80], "src": [224,80], "f": 0, "t": 134, "d": [174], "a": 1 }, + { "px": [240,80], "src": [240,80], "f": 0, "t": 135, "d": [175], "a": 1 }, + { "px": [256,80], "src": [256,80], "f": 0, "t": 136, "d": [176], "a": 1 }, + { "px": [272,80], "src": [272,80], "f": 0, "t": 137, "d": [177], "a": 1 }, + { "px": [288,80], "src": [288,80], "f": 0, "t": 138, "d": [178], "a": 1 }, + { "px": [304,80], "src": [304,80], "f": 0, "t": 139, "d": [179], "a": 1 }, + { "px": [320,80], "src": [320,80], "f": 0, "t": 140, "d": [180], "a": 1 }, + { "px": [336,80], "src": [336,80], "f": 0, "t": 141, "d": [181], "a": 1 }, + { "px": [352,80], "src": [352,80], "f": 0, "t": 142, "d": [182], "a": 1 }, + { "px": [368,80], "src": [368,80], "f": 0, "t": 143, "d": [183], "a": 1 }, + { "px": [384,80], "src": [0,80], "f": 0, "t": 120, "d": [184], "a": 1 }, + { "px": [400,80], "src": [16,80], "f": 0, "t": 121, "d": [185], "a": 1 }, + { "px": [416,80], "src": [32,80], "f": 0, "t": 122, "d": [186], "a": 1 }, + { "px": [432,80], "src": [48,80], "f": 0, "t": 123, "d": [187], "a": 1 }, + { "px": [448,80], "src": [64,80], "f": 0, "t": 124, "d": [188], "a": 1 }, + { "px": [464,80], "src": [80,80], "f": 0, "t": 125, "d": [189], "a": 1 }, + { "px": [480,80], "src": [96,80], "f": 0, "t": 126, "d": [190], "a": 1 }, + { "px": [496,80], "src": [112,80], "f": 0, "t": 127, "d": [191], "a": 1 }, + { "px": [0,96], "src": [0,96], "f": 0, "t": 144, "d": [192], "a": 1 }, + { "px": [16,96], "src": [16,96], "f": 0, "t": 145, "d": [193], "a": 1 }, + { "px": [32,96], "src": [32,96], "f": 0, "t": 146, "d": [194], "a": 1 }, + { "px": [48,96], "src": [48,96], "f": 0, "t": 147, "d": [195], "a": 1 }, + { "px": [64,96], "src": [64,96], "f": 0, "t": 148, "d": [196], "a": 1 }, + { "px": [80,96], "src": [80,96], "f": 0, "t": 149, "d": [197], "a": 1 }, + { "px": [96,96], "src": [96,96], "f": 0, "t": 150, "d": [198], "a": 1 }, + { "px": [112,96], "src": [112,96], "f": 0, "t": 151, "d": [199], "a": 1 }, + { "px": [128,96], "src": [128,96], "f": 0, "t": 152, "d": [200], "a": 1 }, + { "px": [144,96], "src": [144,96], "f": 0, "t": 153, "d": [201], "a": 1 }, + { "px": [160,96], "src": [160,96], "f": 0, "t": 154, "d": [202], "a": 1 }, + { "px": [176,96], "src": [176,96], "f": 0, "t": 155, "d": [203], "a": 1 }, + { "px": [192,96], "src": [192,96], "f": 0, "t": 156, "d": [204], "a": 1 }, + { "px": [208,96], "src": [208,96], "f": 0, "t": 157, "d": [205], "a": 1 }, + { "px": [224,96], "src": [224,96], "f": 0, "t": 158, "d": [206], "a": 1 }, + { "px": [240,96], "src": [240,96], "f": 0, "t": 159, "d": [207], "a": 1 }, + { "px": [256,96], "src": [256,96], "f": 0, "t": 160, "d": [208], "a": 1 }, + { "px": [272,96], "src": [272,96], "f": 0, "t": 161, "d": [209], "a": 1 }, + { "px": [288,96], "src": [288,96], "f": 0, "t": 162, "d": [210], "a": 1 }, + { "px": [304,96], "src": [304,96], "f": 0, "t": 163, "d": [211], "a": 1 }, + { "px": [320,96], "src": [320,96], "f": 0, "t": 164, "d": [212], "a": 1 }, + { "px": [336,96], "src": [336,96], "f": 0, "t": 165, "d": [213], "a": 1 }, + { "px": [352,96], "src": [352,96], "f": 0, "t": 166, "d": [214], "a": 1 }, + { "px": [368,96], "src": [368,96], "f": 0, "t": 167, "d": [215], "a": 1 }, + { "px": [384,96], "src": [0,96], "f": 0, "t": 144, "d": [216], "a": 1 }, + { "px": [400,96], "src": [16,96], "f": 0, "t": 145, "d": [217], "a": 1 }, + { "px": [416,96], "src": [32,96], "f": 0, "t": 146, "d": [218], "a": 1 }, + { "px": [432,96], "src": [48,96], "f": 0, "t": 147, "d": [219], "a": 1 }, + { "px": [448,96], "src": [64,96], "f": 0, "t": 148, "d": [220], "a": 1 }, + { "px": [464,96], "src": [80,96], "f": 0, "t": 149, "d": [221], "a": 1 }, + { "px": [480,96], "src": [96,96], "f": 0, "t": 150, "d": [222], "a": 1 }, + { "px": [496,96], "src": [112,96], "f": 0, "t": 151, "d": [223], "a": 1 }, + { "px": [0,112], "src": [0,112], "f": 0, "t": 168, "d": [224], "a": 1 }, + { "px": [16,112], "src": [16,112], "f": 0, "t": 169, "d": [225], "a": 1 }, + { "px": [32,112], "src": [32,112], "f": 0, "t": 170, "d": [226], "a": 1 }, + { "px": [48,112], "src": [48,112], "f": 0, "t": 171, "d": [227], "a": 1 }, + { "px": [64,112], "src": [64,112], "f": 0, "t": 172, "d": [228], "a": 1 }, + { "px": [80,112], "src": [80,112], "f": 0, "t": 173, "d": [229], "a": 1 }, + { "px": [96,112], "src": [96,112], "f": 0, "t": 174, "d": [230], "a": 1 }, + { "px": [112,112], "src": [112,112], "f": 0, "t": 175, "d": [231], "a": 1 }, + { "px": [128,112], "src": [128,112], "f": 0, "t": 176, "d": [232], "a": 1 }, + { "px": [144,112], "src": [144,112], "f": 0, "t": 177, "d": [233], "a": 1 }, + { "px": [160,112], "src": [160,112], "f": 0, "t": 178, "d": [234], "a": 1 }, + { "px": [176,112], "src": [176,112], "f": 0, "t": 179, "d": [235], "a": 1 }, + { "px": [192,112], "src": [192,112], "f": 0, "t": 180, "d": [236], "a": 1 }, + { "px": [208,112], "src": [208,112], "f": 0, "t": 181, "d": [237], "a": 1 }, + { "px": [224,112], "src": [224,112], "f": 0, "t": 182, "d": [238], "a": 1 }, + { "px": [240,112], "src": [240,112], "f": 0, "t": 183, "d": [239], "a": 1 }, + { "px": [256,112], "src": [256,112], "f": 0, "t": 184, "d": [240], "a": 1 }, + { "px": [272,112], "src": [272,112], "f": 0, "t": 185, "d": [241], "a": 1 }, + { "px": [288,112], "src": [288,112], "f": 0, "t": 186, "d": [242], "a": 1 }, + { "px": [304,112], "src": [304,112], "f": 0, "t": 187, "d": [243], "a": 1 }, + { "px": [320,112], "src": [320,112], "f": 0, "t": 188, "d": [244], "a": 1 }, + { "px": [336,112], "src": [336,112], "f": 0, "t": 189, "d": [245], "a": 1 }, + { "px": [352,112], "src": [352,112], "f": 0, "t": 190, "d": [246], "a": 1 }, + { "px": [368,112], "src": [368,112], "f": 0, "t": 191, "d": [247], "a": 1 }, + { "px": [384,112], "src": [0,112], "f": 0, "t": 168, "d": [248], "a": 1 }, + { "px": [400,112], "src": [16,112], "f": 0, "t": 169, "d": [249], "a": 1 }, + { "px": [416,112], "src": [32,112], "f": 0, "t": 170, "d": [250], "a": 1 }, + { "px": [432,112], "src": [48,112], "f": 0, "t": 171, "d": [251], "a": 1 }, + { "px": [448,112], "src": [64,112], "f": 0, "t": 172, "d": [252], "a": 1 }, + { "px": [464,112], "src": [80,112], "f": 0, "t": 173, "d": [253], "a": 1 }, + { "px": [480,112], "src": [96,112], "f": 0, "t": 174, "d": [254], "a": 1 }, + { "px": [496,112], "src": [112,112], "f": 0, "t": 175, "d": [255], "a": 1 }, + { "px": [0,128], "src": [0,128], "f": 0, "t": 192, "d": [256], "a": 1 }, + { "px": [16,128], "src": [16,128], "f": 0, "t": 193, "d": [257], "a": 1 }, + { "px": [32,128], "src": [32,128], "f": 0, "t": 194, "d": [258], "a": 1 }, + { "px": [48,128], "src": [48,128], "f": 0, "t": 195, "d": [259], "a": 1 }, + { "px": [64,128], "src": [64,128], "f": 0, "t": 196, "d": [260], "a": 1 }, + { "px": [80,128], "src": [80,128], "f": 0, "t": 197, "d": [261], "a": 1 }, + { "px": [96,128], "src": [96,128], "f": 0, "t": 198, "d": [262], "a": 1 }, + { "px": [112,128], "src": [112,128], "f": 0, "t": 199, "d": [263], "a": 1 }, + { "px": [128,128], "src": [128,128], "f": 0, "t": 200, "d": [264], "a": 1 }, + { "px": [144,128], "src": [144,128], "f": 0, "t": 201, "d": [265], "a": 1 }, + { "px": [160,128], "src": [160,128], "f": 0, "t": 202, "d": [266], "a": 1 }, + { "px": [176,128], "src": [176,128], "f": 0, "t": 203, "d": [267], "a": 1 }, + { "px": [192,128], "src": [192,128], "f": 0, "t": 204, "d": [268], "a": 1 }, + { "px": [208,128], "src": [208,128], "f": 0, "t": 205, "d": [269], "a": 1 }, + { "px": [224,128], "src": [224,128], "f": 0, "t": 206, "d": [270], "a": 1 }, + { "px": [240,128], "src": [240,128], "f": 0, "t": 207, "d": [271], "a": 1 }, + { "px": [256,128], "src": [256,128], "f": 0, "t": 208, "d": [272], "a": 1 }, + { "px": [272,128], "src": [272,128], "f": 0, "t": 209, "d": [273], "a": 1 }, + { "px": [288,128], "src": [288,128], "f": 0, "t": 210, "d": [274], "a": 1 }, + { "px": [304,128], "src": [304,128], "f": 0, "t": 211, "d": [275], "a": 1 }, + { "px": [320,128], "src": [320,128], "f": 0, "t": 212, "d": [276], "a": 1 }, + { "px": [336,128], "src": [336,128], "f": 0, "t": 213, "d": [277], "a": 1 }, + { "px": [352,128], "src": [352,128], "f": 0, "t": 214, "d": [278], "a": 1 }, + { "px": [368,128], "src": [368,128], "f": 0, "t": 215, "d": [279], "a": 1 }, + { "px": [384,128], "src": [0,128], "f": 0, "t": 192, "d": [280], "a": 1 }, + { "px": [400,128], "src": [16,128], "f": 0, "t": 193, "d": [281], "a": 1 }, + { "px": [416,128], "src": [32,128], "f": 0, "t": 194, "d": [282], "a": 1 }, + { "px": [432,128], "src": [48,128], "f": 0, "t": 195, "d": [283], "a": 1 }, + { "px": [448,128], "src": [64,128], "f": 0, "t": 196, "d": [284], "a": 1 }, + { "px": [464,128], "src": [80,128], "f": 0, "t": 197, "d": [285], "a": 1 }, + { "px": [480,128], "src": [96,128], "f": 0, "t": 198, "d": [286], "a": 1 }, + { "px": [496,128], "src": [112,128], "f": 0, "t": 199, "d": [287], "a": 1 }, + { "px": [0,144], "src": [0,144], "f": 0, "t": 216, "d": [288], "a": 1 }, + { "px": [16,144], "src": [16,144], "f": 0, "t": 217, "d": [289], "a": 1 }, + { "px": [32,144], "src": [32,144], "f": 0, "t": 218, "d": [290], "a": 1 }, + { "px": [48,144], "src": [48,144], "f": 0, "t": 219, "d": [291], "a": 1 }, + { "px": [64,144], "src": [64,144], "f": 0, "t": 220, "d": [292], "a": 1 }, + { "px": [80,144], "src": [80,144], "f": 0, "t": 221, "d": [293], "a": 1 }, + { "px": [96,144], "src": [96,144], "f": 0, "t": 222, "d": [294], "a": 1 }, + { "px": [112,144], "src": [112,144], "f": 0, "t": 223, "d": [295], "a": 1 }, + { "px": [128,144], "src": [128,144], "f": 0, "t": 224, "d": [296], "a": 1 }, + { "px": [144,144], "src": [144,144], "f": 0, "t": 225, "d": [297], "a": 1 }, + { "px": [160,144], "src": [160,144], "f": 0, "t": 226, "d": [298], "a": 1 }, + { "px": [176,144], "src": [176,144], "f": 0, "t": 227, "d": [299], "a": 1 }, + { "px": [192,144], "src": [192,144], "f": 0, "t": 228, "d": [300], "a": 1 }, + { "px": [208,144], "src": [208,144], "f": 0, "t": 229, "d": [301], "a": 1 }, + { "px": [224,144], "src": [224,144], "f": 0, "t": 230, "d": [302], "a": 1 }, + { "px": [240,144], "src": [240,144], "f": 0, "t": 231, "d": [303], "a": 1 }, + { "px": [256,144], "src": [256,144], "f": 0, "t": 232, "d": [304], "a": 1 }, + { "px": [272,144], "src": [272,144], "f": 0, "t": 233, "d": [305], "a": 1 }, + { "px": [288,144], "src": [288,144], "f": 0, "t": 234, "d": [306], "a": 1 }, + { "px": [304,144], "src": [304,144], "f": 0, "t": 235, "d": [307], "a": 1 }, + { "px": [320,144], "src": [320,144], "f": 0, "t": 236, "d": [308], "a": 1 }, + { "px": [336,144], "src": [336,144], "f": 0, "t": 237, "d": [309], "a": 1 }, + { "px": [352,144], "src": [352,144], "f": 0, "t": 238, "d": [310], "a": 1 }, + { "px": [368,144], "src": [368,144], "f": 0, "t": 239, "d": [311], "a": 1 }, + { "px": [384,144], "src": [0,144], "f": 0, "t": 216, "d": [312], "a": 1 }, + { "px": [400,144], "src": [16,144], "f": 0, "t": 217, "d": [313], "a": 1 }, + { "px": [416,144], "src": [32,144], "f": 0, "t": 218, "d": [314], "a": 1 }, + { "px": [432,144], "src": [48,144], "f": 0, "t": 219, "d": [315], "a": 1 }, + { "px": [448,144], "src": [64,144], "f": 0, "t": 220, "d": [316], "a": 1 }, + { "px": [464,144], "src": [80,144], "f": 0, "t": 221, "d": [317], "a": 1 }, + { "px": [480,144], "src": [96,144], "f": 0, "t": 222, "d": [318], "a": 1 }, + { "px": [496,144], "src": [112,144], "f": 0, "t": 223, "d": [319], "a": 1 }, + { "px": [0,160], "src": [0,160], "f": 0, "t": 240, "d": [320], "a": 1 }, + { "px": [16,160], "src": [16,160], "f": 0, "t": 241, "d": [321], "a": 1 }, + { "px": [32,160], "src": [32,160], "f": 0, "t": 242, "d": [322], "a": 1 }, + { "px": [48,160], "src": [48,160], "f": 0, "t": 243, "d": [323], "a": 1 }, + { "px": [64,160], "src": [64,160], "f": 0, "t": 244, "d": [324], "a": 1 }, + { "px": [80,160], "src": [80,160], "f": 0, "t": 245, "d": [325], "a": 1 }, + { "px": [96,160], "src": [96,160], "f": 0, "t": 246, "d": [326], "a": 1 }, + { "px": [112,160], "src": [112,160], "f": 0, "t": 247, "d": [327], "a": 1 }, + { "px": [128,160], "src": [128,160], "f": 0, "t": 248, "d": [328], "a": 1 }, + { "px": [144,160], "src": [144,160], "f": 0, "t": 249, "d": [329], "a": 1 }, + { "px": [160,160], "src": [160,160], "f": 0, "t": 250, "d": [330], "a": 1 }, + { "px": [176,160], "src": [176,160], "f": 0, "t": 251, "d": [331], "a": 1 }, + { "px": [192,160], "src": [192,160], "f": 0, "t": 252, "d": [332], "a": 1 }, + { "px": [208,160], "src": [208,160], "f": 0, "t": 253, "d": [333], "a": 1 }, + { "px": [224,160], "src": [224,160], "f": 0, "t": 254, "d": [334], "a": 1 }, + { "px": [240,160], "src": [240,160], "f": 0, "t": 255, "d": [335], "a": 1 }, + { "px": [256,160], "src": [256,160], "f": 0, "t": 256, "d": [336], "a": 1 }, + { "px": [272,160], "src": [272,160], "f": 0, "t": 257, "d": [337], "a": 1 }, + { "px": [288,160], "src": [288,160], "f": 0, "t": 258, "d": [338], "a": 1 }, + { "px": [304,160], "src": [304,160], "f": 0, "t": 259, "d": [339], "a": 1 }, + { "px": [320,160], "src": [320,160], "f": 0, "t": 260, "d": [340], "a": 1 }, + { "px": [336,160], "src": [336,160], "f": 0, "t": 261, "d": [341], "a": 1 }, + { "px": [352,160], "src": [352,160], "f": 0, "t": 262, "d": [342], "a": 1 }, + { "px": [368,160], "src": [368,160], "f": 0, "t": 263, "d": [343], "a": 1 }, + { "px": [384,160], "src": [0,160], "f": 0, "t": 240, "d": [344], "a": 1 }, + { "px": [400,160], "src": [16,160], "f": 0, "t": 241, "d": [345], "a": 1 }, + { "px": [416,160], "src": [32,160], "f": 0, "t": 242, "d": [346], "a": 1 }, + { "px": [432,160], "src": [48,160], "f": 0, "t": 243, "d": [347], "a": 1 }, + { "px": [448,160], "src": [64,160], "f": 0, "t": 244, "d": [348], "a": 1 }, + { "px": [464,160], "src": [80,160], "f": 0, "t": 245, "d": [349], "a": 1 }, + { "px": [480,160], "src": [96,160], "f": 0, "t": 246, "d": [350], "a": 1 }, + { "px": [496,160], "src": [112,160], "f": 0, "t": 247, "d": [351], "a": 1 }, + { "px": [0,176], "src": [0,176], "f": 0, "t": 264, "d": [352], "a": 1 }, + { "px": [16,176], "src": [16,176], "f": 0, "t": 265, "d": [353], "a": 1 }, + { "px": [32,176], "src": [32,176], "f": 0, "t": 266, "d": [354], "a": 1 }, + { "px": [48,176], "src": [48,176], "f": 0, "t": 267, "d": [355], "a": 1 }, + { "px": [64,176], "src": [64,176], "f": 0, "t": 268, "d": [356], "a": 1 }, + { "px": [80,176], "src": [80,176], "f": 0, "t": 269, "d": [357], "a": 1 }, + { "px": [96,176], "src": [96,176], "f": 0, "t": 270, "d": [358], "a": 1 }, + { "px": [112,176], "src": [112,176], "f": 0, "t": 271, "d": [359], "a": 1 }, + { "px": [128,176], "src": [128,176], "f": 0, "t": 272, "d": [360], "a": 1 }, + { "px": [144,176], "src": [144,176], "f": 0, "t": 273, "d": [361], "a": 1 }, + { "px": [160,176], "src": [160,176], "f": 0, "t": 274, "d": [362], "a": 1 }, + { "px": [176,176], "src": [176,176], "f": 0, "t": 275, "d": [363], "a": 1 }, + { "px": [192,176], "src": [192,176], "f": 0, "t": 276, "d": [364], "a": 1 }, + { "px": [208,176], "src": [208,176], "f": 0, "t": 277, "d": [365], "a": 1 }, + { "px": [224,176], "src": [224,176], "f": 0, "t": 278, "d": [366], "a": 1 }, + { "px": [240,176], "src": [240,176], "f": 0, "t": 279, "d": [367], "a": 1 }, + { "px": [256,176], "src": [256,176], "f": 0, "t": 280, "d": [368], "a": 1 }, + { "px": [272,176], "src": [272,176], "f": 0, "t": 281, "d": [369], "a": 1 }, + { "px": [288,176], "src": [288,176], "f": 0, "t": 282, "d": [370], "a": 1 }, + { "px": [304,176], "src": [304,176], "f": 0, "t": 283, "d": [371], "a": 1 }, + { "px": [320,176], "src": [320,176], "f": 0, "t": 284, "d": [372], "a": 1 }, + { "px": [336,176], "src": [336,176], "f": 0, "t": 285, "d": [373], "a": 1 }, + { "px": [352,176], "src": [352,176], "f": 0, "t": 286, "d": [374], "a": 1 }, + { "px": [368,176], "src": [368,176], "f": 0, "t": 287, "d": [375], "a": 1 }, + { "px": [384,176], "src": [0,176], "f": 0, "t": 264, "d": [376], "a": 1 }, + { "px": [400,176], "src": [16,176], "f": 0, "t": 265, "d": [377], "a": 1 }, + { "px": [416,176], "src": [32,176], "f": 0, "t": 266, "d": [378], "a": 1 }, + { "px": [432,176], "src": [48,176], "f": 0, "t": 267, "d": [379], "a": 1 }, + { "px": [448,176], "src": [64,176], "f": 0, "t": 268, "d": [380], "a": 1 }, + { "px": [464,176], "src": [80,176], "f": 0, "t": 269, "d": [381], "a": 1 }, + { "px": [480,176], "src": [96,176], "f": 0, "t": 270, "d": [382], "a": 1 }, + { "px": [496,176], "src": [112,176], "f": 0, "t": 271, "d": [383], "a": 1 }, + { "px": [0,192], "src": [0,192], "f": 0, "t": 288, "d": [384], "a": 1 }, + { "px": [16,192], "src": [16,192], "f": 0, "t": 289, "d": [385], "a": 1 }, + { "px": [32,192], "src": [32,192], "f": 0, "t": 290, "d": [386], "a": 1 }, + { "px": [48,192], "src": [48,192], "f": 0, "t": 291, "d": [387], "a": 1 }, + { "px": [64,192], "src": [64,192], "f": 0, "t": 292, "d": [388], "a": 1 }, + { "px": [80,192], "src": [80,192], "f": 0, "t": 293, "d": [389], "a": 1 }, + { "px": [96,192], "src": [96,192], "f": 0, "t": 294, "d": [390], "a": 1 }, + { "px": [112,192], "src": [112,192], "f": 0, "t": 295, "d": [391], "a": 1 }, + { "px": [128,192], "src": [128,192], "f": 0, "t": 296, "d": [392], "a": 1 }, + { "px": [144,192], "src": [144,192], "f": 0, "t": 297, "d": [393], "a": 1 }, + { "px": [160,192], "src": [160,192], "f": 0, "t": 298, "d": [394], "a": 1 }, + { "px": [176,192], "src": [176,192], "f": 0, "t": 299, "d": [395], "a": 1 }, + { "px": [192,192], "src": [192,192], "f": 0, "t": 300, "d": [396], "a": 1 }, + { "px": [208,192], "src": [208,192], "f": 0, "t": 301, "d": [397], "a": 1 }, + { "px": [224,192], "src": [224,192], "f": 0, "t": 302, "d": [398], "a": 1 }, + { "px": [240,192], "src": [240,192], "f": 0, "t": 303, "d": [399], "a": 1 }, + { "px": [256,192], "src": [256,192], "f": 0, "t": 304, "d": [400], "a": 1 }, + { "px": [272,192], "src": [272,192], "f": 0, "t": 305, "d": [401], "a": 1 }, + { "px": [288,192], "src": [288,192], "f": 0, "t": 306, "d": [402], "a": 1 }, + { "px": [304,192], "src": [304,192], "f": 0, "t": 307, "d": [403], "a": 1 }, + { "px": [320,192], "src": [320,192], "f": 0, "t": 308, "d": [404], "a": 1 }, + { "px": [336,192], "src": [336,192], "f": 0, "t": 309, "d": [405], "a": 1 }, + { "px": [352,192], "src": [352,192], "f": 0, "t": 310, "d": [406], "a": 1 }, + { "px": [368,192], "src": [368,192], "f": 0, "t": 311, "d": [407], "a": 1 }, + { "px": [384,192], "src": [0,192], "f": 0, "t": 288, "d": [408], "a": 1 }, + { "px": [400,192], "src": [16,192], "f": 0, "t": 289, "d": [409], "a": 1 }, + { "px": [416,192], "src": [32,192], "f": 0, "t": 290, "d": [410], "a": 1 }, + { "px": [432,192], "src": [48,192], "f": 0, "t": 291, "d": [411], "a": 1 }, + { "px": [448,192], "src": [64,192], "f": 0, "t": 292, "d": [412], "a": 1 }, + { "px": [464,192], "src": [80,192], "f": 0, "t": 293, "d": [413], "a": 1 }, + { "px": [480,192], "src": [96,192], "f": 0, "t": 294, "d": [414], "a": 1 }, + { "px": [496,192], "src": [112,192], "f": 0, "t": 295, "d": [415], "a": 1 }, + { "px": [0,208], "src": [0,208], "f": 0, "t": 312, "d": [416], "a": 1 }, + { "px": [16,208], "src": [16,208], "f": 0, "t": 313, "d": [417], "a": 1 }, + { "px": [32,208], "src": [32,208], "f": 0, "t": 314, "d": [418], "a": 1 }, + { "px": [48,208], "src": [48,208], "f": 0, "t": 315, "d": [419], "a": 1 }, + { "px": [64,208], "src": [64,208], "f": 0, "t": 316, "d": [420], "a": 1 }, + { "px": [80,208], "src": [80,208], "f": 0, "t": 317, "d": [421], "a": 1 }, + { "px": [96,208], "src": [96,208], "f": 0, "t": 318, "d": [422], "a": 1 }, + { "px": [112,208], "src": [112,208], "f": 0, "t": 319, "d": [423], "a": 1 }, + { "px": [128,208], "src": [128,208], "f": 0, "t": 320, "d": [424], "a": 1 }, + { "px": [144,208], "src": [144,208], "f": 0, "t": 321, "d": [425], "a": 1 }, + { "px": [160,208], "src": [160,208], "f": 0, "t": 322, "d": [426], "a": 1 }, + { "px": [176,208], "src": [176,208], "f": 0, "t": 323, "d": [427], "a": 1 }, + { "px": [192,208], "src": [192,208], "f": 0, "t": 324, "d": [428], "a": 1 }, + { "px": [208,208], "src": [208,208], "f": 0, "t": 325, "d": [429], "a": 1 }, + { "px": [224,208], "src": [224,208], "f": 0, "t": 326, "d": [430], "a": 1 }, + { "px": [240,208], "src": [240,208], "f": 0, "t": 327, "d": [431], "a": 1 }, + { "px": [256,208], "src": [256,208], "f": 0, "t": 328, "d": [432], "a": 1 }, + { "px": [272,208], "src": [272,208], "f": 0, "t": 329, "d": [433], "a": 1 }, + { "px": [288,208], "src": [288,208], "f": 0, "t": 330, "d": [434], "a": 1 }, + { "px": [304,208], "src": [304,208], "f": 0, "t": 331, "d": [435], "a": 1 }, + { "px": [320,208], "src": [320,208], "f": 0, "t": 332, "d": [436], "a": 1 }, + { "px": [336,208], "src": [336,208], "f": 0, "t": 333, "d": [437], "a": 1 }, + { "px": [352,208], "src": [352,208], "f": 0, "t": 334, "d": [438], "a": 1 }, + { "px": [368,208], "src": [368,208], "f": 0, "t": 335, "d": [439], "a": 1 }, + { "px": [384,208], "src": [0,208], "f": 0, "t": 312, "d": [440], "a": 1 }, + { "px": [400,208], "src": [16,208], "f": 0, "t": 313, "d": [441], "a": 1 }, + { "px": [416,208], "src": [32,208], "f": 0, "t": 314, "d": [442], "a": 1 }, + { "px": [432,208], "src": [48,208], "f": 0, "t": 315, "d": [443], "a": 1 }, + { "px": [448,208], "src": [64,208], "f": 0, "t": 316, "d": [444], "a": 1 }, + { "px": [464,208], "src": [80,208], "f": 0, "t": 317, "d": [445], "a": 1 }, + { "px": [480,208], "src": [96,208], "f": 0, "t": 318, "d": [446], "a": 1 }, + { "px": [496,208], "src": [112,208], "f": 0, "t": 319, "d": [447], "a": 1 }, + { "px": [0,224], "src": [0,224], "f": 0, "t": 336, "d": [448], "a": 1 }, + { "px": [16,224], "src": [16,224], "f": 0, "t": 337, "d": [449], "a": 1 }, + { "px": [32,224], "src": [32,224], "f": 0, "t": 338, "d": [450], "a": 1 }, + { "px": [48,224], "src": [48,224], "f": 0, "t": 339, "d": [451], "a": 1 }, + { "px": [64,224], "src": [64,224], "f": 0, "t": 340, "d": [452], "a": 1 }, + { "px": [80,224], "src": [80,224], "f": 0, "t": 341, "d": [453], "a": 1 }, + { "px": [96,224], "src": [96,224], "f": 0, "t": 342, "d": [454], "a": 1 }, + { "px": [112,224], "src": [112,224], "f": 0, "t": 343, "d": [455], "a": 1 }, + { "px": [128,224], "src": [128,224], "f": 0, "t": 344, "d": [456], "a": 1 }, + { "px": [144,224], "src": [144,224], "f": 0, "t": 345, "d": [457], "a": 1 }, + { "px": [160,224], "src": [160,224], "f": 0, "t": 346, "d": [458], "a": 1 }, + { "px": [176,224], "src": [176,224], "f": 0, "t": 347, "d": [459], "a": 1 }, + { "px": [192,224], "src": [192,224], "f": 0, "t": 348, "d": [460], "a": 1 }, + { "px": [208,224], "src": [208,224], "f": 0, "t": 349, "d": [461], "a": 1 }, + { "px": [224,224], "src": [224,224], "f": 0, "t": 350, "d": [462], "a": 1 }, + { "px": [240,224], "src": [240,224], "f": 0, "t": 351, "d": [463], "a": 1 }, + { "px": [256,224], "src": [256,224], "f": 0, "t": 352, "d": [464], "a": 1 }, + { "px": [272,224], "src": [272,224], "f": 0, "t": 353, "d": [465], "a": 1 }, + { "px": [288,224], "src": [288,224], "f": 0, "t": 354, "d": [466], "a": 1 }, + { "px": [304,224], "src": [304,224], "f": 0, "t": 355, "d": [467], "a": 1 }, + { "px": [320,224], "src": [320,224], "f": 0, "t": 356, "d": [468], "a": 1 }, + { "px": [336,224], "src": [336,224], "f": 0, "t": 357, "d": [469], "a": 1 }, + { "px": [352,224], "src": [352,224], "f": 0, "t": 358, "d": [470], "a": 1 }, + { "px": [368,224], "src": [368,224], "f": 0, "t": 359, "d": [471], "a": 1 }, + { "px": [384,224], "src": [0,224], "f": 0, "t": 336, "d": [472], "a": 1 }, + { "px": [400,224], "src": [16,224], "f": 0, "t": 337, "d": [473], "a": 1 }, + { "px": [416,224], "src": [32,224], "f": 0, "t": 338, "d": [474], "a": 1 }, + { "px": [432,224], "src": [48,224], "f": 0, "t": 339, "d": [475], "a": 1 }, + { "px": [448,224], "src": [64,224], "f": 0, "t": 340, "d": [476], "a": 1 }, + { "px": [464,224], "src": [80,224], "f": 0, "t": 341, "d": [477], "a": 1 }, + { "px": [480,224], "src": [96,224], "f": 0, "t": 342, "d": [478], "a": 1 }, + { "px": [496,224], "src": [112,224], "f": 0, "t": 343, "d": [479], "a": 1 }, + { "px": [0,240], "src": [0,224], "f": 0, "t": 336, "d": [480], "a": 1 }, + { "px": [16,240], "src": [16,224], "f": 0, "t": 337, "d": [481], "a": 1 }, + { "px": [32,240], "src": [32,224], "f": 0, "t": 338, "d": [482], "a": 1 }, + { "px": [48,240], "src": [48,224], "f": 0, "t": 339, "d": [483], "a": 1 }, + { "px": [64,240], "src": [64,224], "f": 0, "t": 340, "d": [484], "a": 1 }, + { "px": [80,240], "src": [80,224], "f": 0, "t": 341, "d": [485], "a": 1 }, + { "px": [96,240], "src": [96,224], "f": 0, "t": 342, "d": [486], "a": 1 }, + { "px": [112,240], "src": [112,224], "f": 0, "t": 343, "d": [487], "a": 1 }, + { "px": [128,240], "src": [128,224], "f": 0, "t": 344, "d": [488], "a": 1 }, + { "px": [144,240], "src": [144,224], "f": 0, "t": 345, "d": [489], "a": 1 }, + { "px": [160,240], "src": [160,224], "f": 0, "t": 346, "d": [490], "a": 1 }, + { "px": [176,240], "src": [176,224], "f": 0, "t": 347, "d": [491], "a": 1 }, + { "px": [192,240], "src": [192,224], "f": 0, "t": 348, "d": [492], "a": 1 }, + { "px": [208,240], "src": [208,224], "f": 0, "t": 349, "d": [493], "a": 1 }, + { "px": [224,240], "src": [224,224], "f": 0, "t": 350, "d": [494], "a": 1 }, + { "px": [240,240], "src": [240,224], "f": 0, "t": 351, "d": [495], "a": 1 }, + { "px": [256,240], "src": [256,224], "f": 0, "t": 352, "d": [496], "a": 1 }, + { "px": [272,240], "src": [272,224], "f": 0, "t": 353, "d": [497], "a": 1 }, + { "px": [288,240], "src": [288,224], "f": 0, "t": 354, "d": [498], "a": 1 }, + { "px": [304,240], "src": [304,224], "f": 0, "t": 355, "d": [499], "a": 1 }, + { "px": [320,240], "src": [320,224], "f": 0, "t": 356, "d": [500], "a": 1 }, + { "px": [336,240], "src": [336,224], "f": 0, "t": 357, "d": [501], "a": 1 }, + { "px": [352,240], "src": [352,224], "f": 0, "t": 358, "d": [502], "a": 1 }, + { "px": [368,240], "src": [368,224], "f": 0, "t": 359, "d": [503], "a": 1 }, + { "px": [384,240], "src": [0,224], "f": 0, "t": 336, "d": [504], "a": 1 }, + { "px": [400,240], "src": [16,224], "f": 0, "t": 337, "d": [505], "a": 1 }, + { "px": [416,240], "src": [32,224], "f": 0, "t": 338, "d": [506], "a": 1 }, + { "px": [432,240], "src": [48,224], "f": 0, "t": 339, "d": [507], "a": 1 }, + { "px": [448,240], "src": [64,224], "f": 0, "t": 340, "d": [508], "a": 1 }, + { "px": [464,240], "src": [80,224], "f": 0, "t": 341, "d": [509], "a": 1 }, + { "px": [480,240], "src": [96,224], "f": 0, "t": 342, "d": [510], "a": 1 }, + { "px": [496,240], "src": [112,224], "f": 0, "t": 343, "d": [511], "a": 1 } + ], + "entityInstances": [] + } + ], + "__neighbours": [] + } + ], + "worlds": [], + "dummyWorldIid": "a48e5b90-d380-11f0-a69c-55e16c4c7713" +} \ No newline at end of file diff --git a/py/assets/levels/top_down.ldtk b/py/assets/levels/top_down.ldtk new file mode 100644 index 0000000..0ea98bf --- /dev/null +++ b/py/assets/levels/top_down.ldtk @@ -0,0 +1,2651 @@ +{ + "__header__": { + "fileType": "LDtk Project JSON", + "app": "LDtk", + "doc": "https://ldtk.io/json", + "schema": "https://ldtk.io/files/JSON_SCHEMA.json", + "appAuthor": "Sebastien 'deepnight' Benard", + "appVersion": "1.5.3", + "url": "https://ldtk.io" + }, + "iid": "2451b2d0-d380-11f0-9ae1-7f8ef9aafb88", + "jsonVersion": "1.5.3", + "appBuildId": 473703, + "nextUid": 79, + "identifierStyle": "Capitalize", + "toc": [], + "worldLayout": "Free", + "worldGridWidth": 256, + "worldGridHeight": 256, + "defaultLevelWidth": 256, + "defaultLevelHeight": 256, + "defaultPivotX": 0, + "defaultPivotY": 0, + "defaultGridSize": 16, + "defaultEntityWidth": 16, + "defaultEntityHeight": 16, + "bgColor": "#40465B", + "defaultLevelBgColor": "#696A79", + "minifyJson": false, + "externalLevels": false, + "exportTiled": false, + "simplifiedExport": false, + "imageExportMode": "None", + "exportLevelBg": true, + "pngFilePattern": null, + "backupOnSave": false, + "backupLimit": 10, + "backupRelPath": null, + "levelNamePattern": "Level_%idx", + "tutorialDesc": null, + "customCommands": [], + "flags": [], + "defs": { "layers": [ + { + "__type": "Entities", + "identifier": "Entities", + "type": "Entities", + "uid": 77, + "doc": null, + "uiColor": null, + "gridSize": 64, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 0.6, + "hideInList": false, + "hideFieldsWhenInactive": true, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [], + "intGridValuesGroups": [], + "autoRuleGroups": [], + "autoSourceLayerDefUid": null, + "tilesetDefUid": null, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + }, + { + "__type": "Tiles", + "identifier": "Foreground", + "type": "Tiles", + "uid": 61, + "doc": null, + "uiColor": null, + "gridSize": 64, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 1, + "hideInList": false, + "hideFieldsWhenInactive": false, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [], + "intGridValuesGroups": [], + "autoRuleGroups": [], + "autoSourceLayerDefUid": null, + "tilesetDefUid": 1, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + }, + { + "__type": "IntGrid", + "identifier": "IntGrid", + "type": "IntGrid", + "uid": 2, + "doc": null, + "uiColor": null, + "gridSize": 64, + "guideGridWid": 0, + "guideGridHei": 0, + "displayOpacity": 1, + "inactiveOpacity": 1, + "hideInList": false, + "hideFieldsWhenInactive": false, + "canSelectWhenInactive": true, + "renderInWorldView": true, + "pxOffsetX": 0, + "pxOffsetY": 0, + "parallaxFactorX": 0, + "parallaxFactorY": 0, + "parallaxScaling": true, + "requiredTags": [], + "excludedTags": [], + "autoTilesKilledByOtherLayerUid": null, + "uiFilterTags": [], + "useAsyncRender": false, + "intGridValues": [ + { "value": 1, "identifier": "walls", "color": "#B86F50", "tile": null, "groupUid": 0 }, + { "value": 3, "identifier": "obstacles", "color": "#A22633", "tile": null, "groupUid": 0 }, + { "value": 2, "identifier": "grass", "color": "#63C74D", "tile": null, "groupUid": 0 }, + { "value": 4, "identifier": "tile", "color": "#3A4466", "tile": null, "groupUid": 0 } + ], + "intGridValuesGroups": [], + "autoRuleGroups": [ + { + "uid": 69, + "name": "obstacles", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 75, + "active": true, + "size": 3, + "tileRectsIds": [ [0], [1], [2], [3] ], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,2,0,0,3,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 791835, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 74, + "active": true, + "size": 3, + "tileRectsIds": [[10]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,3,0,0,4,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6879243, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 73, + "active": true, + "size": 3, + "tileRectsIds": [[10]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,4,0,0,3,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 5479555, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 71, + "active": true, + "size": 3, + "tileRectsIds": [[10]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,3,4,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 8857465, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 70, + "active": true, + "size": 3, + "tileRectsIds": [[10]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,4,3,0,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4405542, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": false, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 66, + "name": "tile", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 67, + "active": true, + "size": 1, + "tileRectsIds": [[10]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [4], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1675224, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": false, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 62, + "name": "grass", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 63, + "active": true, + "size": 1, + "tileRectsIds": [ [0], [1], [2], [3] ], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [2], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 8915025, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": false, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + }, + { + "uid": 3, + "name": "walls", + "color": null, + "icon": null, + "active": true, + "isOptional": false, + "rules": [ + { + "uid": 31, + "active": true, + "size": 3, + "tileRectsIds": [[204]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,-1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 7774931, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 32, + "active": true, + "size": 3, + "tileRectsIds": [[178]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,-1,1,1,1,-1,1,-1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9893420, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 33, + "active": true, + "size": 3, + "tileRectsIds": [[117]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,1,0,1,-1], + "flipX": true, + "flipY": true, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4908586, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 34, + "active": true, + "size": 3, + "tileRectsIds": [[258]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,1,1,1,1,1,1,-1], + "flipX": true, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4749804, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 35, + "active": true, + "size": 3, + "tileRectsIds": [[227]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,1,-1,-1,1,1,0,1,1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 233522, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 36, + "active": true, + "size": 3, + "tileRectsIds": [[229]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,1,1,1,-1,1,1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 7354597, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 37, + "active": true, + "size": 3, + "tileRectsIds": [[225]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,-1,1,1,1,-1,1,1], + "flipX": true, + "flipY": true, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6862161, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 38, + "active": true, + "size": 3, + "tileRectsIds": [[228]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,0,1,1,-1,1,1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4839941, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 39, + "active": true, + "size": 3, + "tileRectsIds": [[230]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,1,1,1,1,1,-1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4662796, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 40, + "active": true, + "size": 3, + "tileRectsIds": [[257]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [1,1,-1,1,1,1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1840180, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 41, + "active": true, + "size": 3, + "tileRectsIds": [[255]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [1,1,0,1,1,-1,-1,1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1641611, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 42, + "active": true, + "size": 3, + "tileRectsIds": [[254]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,1,1,-1,1,1,0,1,-1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6451097, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 43, + "active": true, + "size": 3, + "tileRectsIds": [[256]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,1,1,1,1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9176901, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 44, + "active": true, + "size": 3, + "tileRectsIds": [[121]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,-1,1,1,1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9846746, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 45, + "active": true, + "size": 3, + "tileRectsIds": [[147]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,1,-1,-1,1,1,0,1,-1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2534625, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 46, + "active": true, + "size": 3, + "tileRectsIds": [[120]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,1,1,1,-1,1,-1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4742475, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 47, + "active": true, + "size": 3, + "tileRectsIds": [[148]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,0,1,1,-1,-1,1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9160564, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 48, + "active": true, + "size": 3, + "tileRectsIds": [[201]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [-1,1,1,1,1,1,-1,1,1], + "flipX": true, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 8571935, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 49, + "active": true, + "size": 3, + "tileRectsIds": [[173]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [1,1,1,1,1,1,-1,1,-1], + "flipX": false, + "flipY": true, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9554225, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 50, + "active": true, + "size": 3, + "tileRectsIds": [[150]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 3700162, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 51, + "active": true, + "size": 3, + "tileRectsIds": [[122]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,-1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 5775500, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 52, + "active": true, + "size": 3, + "tileRectsIds": [[119]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,0,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4962963, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 53, + "active": true, + "size": 3, + "tileRectsIds": [[149]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,-1,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 9922820, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 54, + "active": true, + "size": 3, + "tileRectsIds": [[123]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-1,1,-1,0,-1,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2544830, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 55, + "active": true, + "size": 3, + "tileRectsIds": [[146]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-1,1,-1,0,0,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4037627, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 56, + "active": true, + "size": 3, + "tileRectsIds": [[124]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,-1,1,0,0,0,0], + "flipX": true, + "flipY": true, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 1124818, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 57, + "active": true, + "size": 3, + "tileRectsIds": [[202]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,-1,0,0,1,0,0,0,0], + "flipX": false, + "flipY": true, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 8849226, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 58, + "active": true, + "size": 3, + "tileRectsIds": [[175]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,-1,1,0,0,0,0], + "flipX": true, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 6643923, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 59, + "active": true, + "size": 3, + "tileRectsIds": [[171]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,1,1,0,1,-1], + "flipX": true, + "flipY": true, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 2745302, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, + { + "uid": 60, + "active": true, + "size": 1, + "tileRectsIds": [[177]], + "alpha": 1, + "chance": 1, + "breakOnMatch": true, + "pattern": [1], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "tileXOffset": 0, + "tileYOffset": 0, + "tileRandomXMin": 0, + "tileRandomXMax": 0, + "tileRandomYMin": 0, + "tileRandomYMax": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": 1, + "invalidated": false, + "perlinActive": false, + "perlinSeed": 4687117, + "perlinScale": 0.2, + "perlinOctaves": 2 + } + ], + "usesWizard": true, + "requiredBiomeValues": [], + "biomeRequirementMode": 0 + } + ], + "autoSourceLayerDefUid": null, + "tilesetDefUid": 1, + "tilePivotX": 0, + "tilePivotY": 0, + "biomeFieldUid": null + } + ], "entities": [ + { + "identifier": "Start", + "uid": 76, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 64, + "height": 64, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 1, + "lineOpacity": 1, + "hollow": false, + "color": "#2F48BE", + "renderMode": "Rectangle", + "showName": true, + "tilesetId": null, + "tileRenderMode": "FitInside", + "tileRect": null, + "uiTileRect": null, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0.5, + "pivotY": 0.5, + "fieldDefs": [] + }, + { + "identifier": "Spawn", + "uid": 78, + "tags": [], + "exportToToc": false, + "allowOutOfBounds": false, + "doc": null, + "width": 64, + "height": 64, + "resizableX": true, + "resizableY": true, + "minWidth": 64, + "maxWidth": null, + "minHeight": 64, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 1, + "lineOpacity": 1, + "hollow": false, + "color": "#E43B44", + "renderMode": "Rectangle", + "showName": true, + "tilesetId": null, + "tileRenderMode": "FitInside", + "tileRect": null, + "uiTileRect": null, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0.5, + "pivotY": 0.5, + "fieldDefs": [] + } + ], "tilesets": [ + { + "__cWid": 27, + "__cHei": 20, + "identifier": "Tilemap", + "uid": 1, + "relPath": "../zombie_shooter/tilemap.png", + "embedAtlas": null, + "pxWid": 1728, + "pxHei": 1280, + "tileGridSize": 64, + "spacing": 0, + "padding": 0, + "tags": [], + "tagsSourceEnumUid": null, + "enumTags": [], + "customData": [], + "savedSelections": [], + "cachedPixelData": { + "opaqueTiles": "111111111111111111110000000111111111111111111110000000111111111111111111110000000111111111111111111110000000111111111111111111000000000111111111111111111000000000111111110111111110000000000111111100111111100000000000111111100111111100000000000111111100111111100000000000111111111111111111000000000111111111111111111000000000111111110111111110111111000111111100111111100111111010111111100111111100111111000111111100111111100111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "averageColors": "f2a6f2a6f2a6f2a6fb74fb74f9bbf9bbf9bbf9bbf9bbfeeefc74fc74fd74fd74f2a6f2a6f28bf28b4995499549954c734c734c730000f654f654f654f544f544f664f664f666f666f666f555f555f666f666fb84fb84fb84fb84fb84fb84c695d6a5d6a5cd72dd72dd720000f654f654f654f544f544f664f664f666f666f666f555f555f666f666fd74fd74fd74fd74fd74fd74e4a5f3a6f3a6ed62fd62fd620000f554f554f554f554f444f444f554f555f555f555f555f444f444f555fc96fc96fc96fc96fc96fc96eacafacafacaedb9fdb9fdb90000f854f854f854f754f754f954f954f854f854f864f864f864f864f864f974f974f864f86410001000ba745a74b58a5edb5edb44a60000f854f854f854f754f754f954f954f854f854f864f864f864f864f864f974f974f864f86410001000ba745a74b5a57bde7bde1a740000f544f544f544f544f754f754f444f654aa53f554f554f654f654f754f754f444f754aa7483b783b7c3b68d748d84cd741aaa1aaa0000f544f544f544f544f754f754fa53ca536b63f554f554f654f654f754f754fa74ca746b7483b683b643a68d748d7433a53ddd4ddd0000f654f654f754f754f754f754f5447a537a53f654f654f764f764f764f764f6547a747a7433b63c7438aa28aa38aa15951baa3c748555f654f654f754f754f754f754f5447a537a53f654f654f764f764f764f764f6547a747a7438aa18aa2acd4b742a743b853b853bcc8deef9bbf9bbf9bbf9bbf9bbf9bbf9bbf9bbf9bbf788f788f788f677f677f799f799f788f7883c611c611acd59983a99fcb9fc97fabafcdcf9bbf9bbf9bbf9bbf9bbf9bbf9bbf9bbf9bbf788f788f788f677f677f799f799f788f7883c6138aa3a8878656555fdeefdeefdedfaaaf9bbf9bbf9bbf9bbf9bbf9bbf9bbf9bba9bbf555f555f556f556f677f677f444f666a8aafd95fd94fd95f7b9f6b8f7b9eb84fb84eb84f9bbf9bbf9bbf9bbf9bbf9bbf9bbc9bb69bbf555f555f556f556f677f677f8aac89a69aafd84fe83fd84f6b8f5b7f6b8fb84fb84fb84f9bbf9bbf9bbf9bbf9bbf9bbf9bb79bb79bbf566f566f677f677f677f677f55678aa78aafd73fe61fe83f5b7f2a6f5b7eb84fb84eb84f9bbf9bbf9bbf9bbf9bbf9bbf9bb79bb79bbf566f566f677f677f677f677f55678aa78aafd84fe83fd84f6b8f5b7f6b8ecb9ecb9ecb95bde5bde5bde5bde7dee7dee7a747a747a747a744b744b744b744b74a295c295a2958295727a6a74eb84eb84eb84db847b84000000005bde5bde4bde4bde7dee7dee7a747a747a747a744b744b744b744b74dc73dc73dc73ac737c734b847ca87ca97ca88c97ab84000000004bde4bde7dee7dee7dee6dee79bb79bb79bb79bb49bb49bb49bb49bb9655a555965596558765ab849b849b849b849b84ac73000000004bde4bde7dee7dee7dee6dee79bb79bb79bb79bb49bb49bb49bb49bb8b846b846c846b84377737776b868ca886664666dcb900000000" + } + } + ], "enums": [], "externalEnums": [], "levelFields": [] }, + "levels": [ + { + "identifier": "Level", + "iid": "2452eb50-d380-11f0-9ae1-d7a25c5a0db0", + "uid": 0, + "worldX": 0, + "worldY": 0, + "worldDepth": 0, + "pxWid": 2560, + "pxHei": 1440, + "__bgColor": "#696A79", + "bgColor": null, + "useAutoIdentifier": false, + "bgRelPath": null, + "bgPos": null, + "bgPivotX": 0.5, + "bgPivotY": 0.5, + "__smartColor": "#ADADB5", + "__bgPos": null, + "externalRelPath": null, + "fieldInstances": [], + "layerInstances": [ + { + "__identifier": "Entities", + "__type": "Entities", + "__cWid": 40, + "__cHei": 23, + "__gridSize": 64, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": null, + "__tilesetRelPath": null, + "iid": "18a082a0-d380-11f0-9ae1-03f5d4b03633", + "levelId": 0, + "layerDefUid": 77, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [], + "autoLayerTiles": [], + "seed": 2737745, + "overrideTilesetUid": null, + "gridTiles": [], + "entityInstances": [ + { + "__identifier": "Start", + "__grid": [2,20], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": null, + "__smartColor": "#2F48BE", + "iid": "312e8560-d380-11f0-9ae1-a1382736c5df", + "width": 64, + "height": 64, + "defUid": 76, + "px": [160,1312], + "fieldInstances": [], + "__worldX": 160, + "__worldY": 1312 + }, + { + "__identifier": "Start", + "__grid": [13,18], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": null, + "__smartColor": "#2F48BE", + "iid": "34ffd8b0-d380-11f0-9ae1-35d6329f3b27", + "width": 64, + "height": 64, + "defUid": 76, + "px": [864,1184], + "fieldInstances": [], + "__worldX": 864, + "__worldY": 1184 + }, + { + "__identifier": "Start", + "__grid": [25,20], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": null, + "__smartColor": "#2F48BE", + "iid": "35c79580-d380-11f0-9ae1-17680d06aecf", + "width": 64, + "height": 64, + "defUid": 76, + "px": [1632,1312], + "fieldInstances": [], + "__worldX": 1632, + "__worldY": 1312 + }, + { + "__identifier": "Start", + "__grid": [33,18], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": null, + "__smartColor": "#2F48BE", + "iid": "36d86940-d380-11f0-9ae1-5725e8e8d983", + "width": 64, + "height": 64, + "defUid": 76, + "px": [2144,1184], + "fieldInstances": [], + "__worldX": 2144, + "__worldY": 1184 + }, + { + "__identifier": "Spawn", + "__grid": [17,1], + "__pivot": [0.5,0.5], + "__tags": [], + "__tile": null, + "__smartColor": "#E43B44", + "iid": "03544b20-d380-11f0-9ae1-a375bc6f6eb9", + "width": 1664, + "height": 64, + "defUid": 78, + "px": [1120,96], + "fieldInstances": [], + "__worldX": 1120, + "__worldY": 96 + } + ] + }, + { + "__identifier": "Foreground", + "__type": "Tiles", + "__cWid": 40, + "__cHei": 23, + "__gridSize": 64, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": 1, + "__tilesetRelPath": "../zombie_shooter/tilemap.png", + "iid": "7e07a4f0-d380-11f0-9ae1-c1407425fd82", + "levelId": 0, + "layerDefUid": 61, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [], + "autoLayerTiles": [], + "seed": 3361326, + "overrideTilesetUid": null, + "gridTiles": [ + { "px": [192,128], "src": [1216,704], "f": 0, "t": 316, "d": [83], "a": 1 }, + { "px": [960,128], "src": [1280,320], "f": 0, "t": 155, "d": [95], "a": 1 }, + { "px": [1856,128], "src": [1472,384], "f": 0, "t": 185, "d": [109], "a": 1 }, + { "px": [448,384], "src": [1280,256], "f": 0, "t": 128, "d": [247], "a": 1 }, + { "px": [512,384], "src": [1280,256], "f": 0, "t": 128, "d": [248], "a": 1 }, + { "px": [64,448], "src": [1472,384], "f": 0, "t": 185, "d": [281], "a": 1 }, + { "px": [1728,512], "src": [1280,320], "f": 0, "t": 155, "d": [347], "a": 1 }, + { "px": [2304,640], "src": [1472,384], "f": 0, "t": 185, "d": [436], "a": 1 }, + { "px": [768,704], "src": [1344,384], "f": 0, "t": 183, "d": [452], "a": 1 }, + { "px": [832,704], "src": [1408,384], "f": 0, "t": 184, "d": [453], "a": 1 }, + { "px": [768,768], "src": [1344,448], "f": 0, "t": 210, "d": [492], "a": 1 }, + { "px": [832,768], "src": [1408,448], "f": 0, "t": 211, "d": [493], "a": 1 }, + { "px": [1408,768], "src": [1216,704], "f": 0, "t": 316, "d": [502], "a": 1 }, + { "px": [64,1088], "src": [1472,512], "f": 0, "t": 239, "d": [681], "a": 1 }, + { "px": [576,1088], "src": [1472,512], "f": 0, "t": 239, "d": [689], "a": 1 }, + { "px": [64,1152], "src": [1408,1216], "f": 0, "t": 535, "d": [721], "a": 1 }, + { "px": [384,1216], "src": [896,1088], "f": 0, "t": 473, "d": [766], "a": 1 }, + { "px": [448,1216], "src": [960,1088], "f": 0, "t": 474, "d": [767], "a": 1 }, + { "px": [512,1216], "src": [1024,1088], "f": 0, "t": 475, "d": [768], "a": 1 }, + { "px": [1088,1216], "src": [1472,64], "f": 0, "t": 50, "d": [777], "a": 1 }, + { "px": [1344,1216], "src": [1280,64], "f": 0, "t": 47, "d": [781], "a": 1 }, + { "px": [2432,1216], "src": [1472,512], "f": 0, "t": 239, "d": [798], "a": 1 }, + { "px": [256,1280], "src": [1536,64], "f": 0, "t": 51, "d": [804], "a": 1 }, + { "px": [320,1280], "src": [1600,64], "f": 0, "t": 52, "d": [805], "a": 1 }, + { "px": [1088,1280], "src": [1472,128], "f": 0, "t": 77, "d": [817], "a": 1 }, + { "px": [1344,1280], "src": [1280,128], "f": 0, "t": 74, "d": [821], "a": 1 }, + { "px": [1856,1280], "src": [1216,1152], "f": 0, "t": 505, "d": [829], "a": 1 }, + { "px": [256,1344], "src": [1536,192], "f": 0, "t": 105, "d": [844], "a": 1 }, + { "px": [320,1344], "src": [1600,192], "f": 0, "t": 106, "d": [845], "a": 1 }, + { "px": [1088,1344], "src": [1472,192], "f": 0, "t": 104, "d": [857], "a": 1 }, + { "px": [1344,1344], "src": [1280,192], "f": 0, "t": 101, "d": [861], "a": 1 }, + { "px": [1856,1344], "src": [960,1216], "f": 0, "t": 528, "d": [869], "a": 1 } + ], + "entityInstances": [] + }, + { + "__identifier": "IntGrid", + "__type": "IntGrid", + "__cWid": 40, + "__cHei": 23, + "__gridSize": 64, + "__opacity": 1, + "__pxTotalOffsetX": 0, + "__pxTotalOffsetY": 0, + "__tilesetDefUid": 1, + "__tilesetRelPath": "../zombie_shooter/tilemap.png", + "iid": "49e5c130-d380-11f0-9ae1-4121d35fc153", + "levelId": 0, + "layerDefUid": 2, + "pxOffsetX": 0, + "pxOffsetY": 0, + "visible": true, + "optionalRules": [], + "intGridCsv": [ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,1,1,1,1,1,2,2,3,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2, + 2,2,3,3,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, + 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2, + 2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, + 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,4,4,4,4,4,3,3,3,4, + 4,4,4,4,4,4,4,3,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,4,4,4,3, + 3,1,1,1,4,4,4,4,4,4,4,4,3,1,1,1,3,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,1, + 1,4,4,4,3,3,1,4,1,4,4,4,4,4,4,4,4,3,1,1,1,3,4,4,4,4,4,4,4,3,4,4,4,4,4, + 4,4,4,4,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1 + ], + "autoLayerTiles": [ + { "px": [2368,0], "src": [960,384], "f": 0, "t": 177, "d": [60,37], "a": 1 }, + { "px": [2432,0], "src": [960,384], "f": 0, "t": 177, "d": [60,38], "a": 1 }, + { "px": [2496,0], "src": [960,384], "f": 0, "t": 177, "d": [60,39], "a": 1 }, + { "px": [2368,64], "src": [960,384], "f": 0, "t": 177, "d": [60,77], "a": 1 }, + { "px": [2432,64], "src": [960,384], "f": 0, "t": 177, "d": [60,78], "a": 1 }, + { "px": [2496,64], "src": [960,384], "f": 0, "t": 177, "d": [60,79], "a": 1 }, + { "px": [2368,128], "src": [960,384], "f": 0, "t": 177, "d": [60,117], "a": 1 }, + { "px": [2432,128], "src": [960,384], "f": 0, "t": 177, "d": [60,118], "a": 1 }, + { "px": [2496,128], "src": [960,384], "f": 0, "t": 177, "d": [60,119], "a": 1 }, + { "px": [2368,192], "src": [960,384], "f": 0, "t": 177, "d": [60,157], "a": 1 }, + { "px": [2432,192], "src": [960,384], "f": 0, "t": 177, "d": [60,158], "a": 1 }, + { "px": [2496,192], "src": [960,384], "f": 0, "t": 177, "d": [60,159], "a": 1 }, + { "px": [1216,320], "src": [960,384], "f": 0, "t": 177, "d": [60,219], "a": 1 }, + { "px": [1152,384], "src": [960,384], "f": 0, "t": 177, "d": [60,258], "a": 1 }, + { "px": [1216,384], "src": [960,384], "f": 0, "t": 177, "d": [60,259], "a": 1 }, + { "px": [1280,384], "src": [960,384], "f": 0, "t": 177, "d": [60,260], "a": 1 }, + { "px": [2368,1088], "src": [960,384], "f": 0, "t": 177, "d": [60,717], "a": 1 }, + { "px": [2432,1088], "src": [960,384], "f": 0, "t": 177, "d": [60,718], "a": 1 }, + { "px": [2496,1088], "src": [960,384], "f": 0, "t": 177, "d": [60,719], "a": 1 }, + { "px": [1216,1280], "src": [960,384], "f": 0, "t": 177, "d": [60,819], "a": 1 }, + { "px": [1216,1344], "src": [960,384], "f": 0, "t": 177, "d": [60,859], "a": 1 }, + { "px": [1216,1408], "src": [960,384], "f": 0, "t": 177, "d": [60,899], "a": 1 }, + { "px": [0,0], "src": [576,384], "f": 0, "t": 171, "d": [59,0], "a": 1 }, + { "px": [2304,0], "src": [576,384], "f": 1, "t": 171, "d": [59,36], "a": 1 }, + { "px": [2304,192], "src": [576,384], "f": 3, "t": 171, "d": [59,156], "a": 1 }, + { "px": [2496,256], "src": [576,384], "f": 1, "t": 171, "d": [59,199], "a": 1 }, + { "px": [1152,320], "src": [576,384], "f": 3, "t": 171, "d": [59,218], "a": 1 }, + { "px": [1280,320], "src": [576,384], "f": 2, "t": 171, "d": [59,220], "a": 1 }, + { "px": [2496,1024], "src": [576,384], "f": 3, "t": 171, "d": [59,679], "a": 1 }, + { "px": [2496,1152], "src": [576,384], "f": 1, "t": 171, "d": [59,759], "a": 1 }, + { "px": [0,1408], "src": [576,384], "f": 2, "t": 171, "d": [59,880], "a": 1 }, + { "px": [1152,1408], "src": [576,384], "f": 3, "t": 171, "d": [59,898], "a": 1 }, + { "px": [1280,1408], "src": [576,384], "f": 2, "t": 171, "d": [59,900], "a": 1 }, + { "px": [2496,1408], "src": [576,384], "f": 3, "t": 171, "d": [59,919], "a": 1 }, + { "px": [0,64], "src": [832,384], "f": 1, "t": 175, "d": [58,40], "a": 1 }, + { "px": [2304,64], "src": [832,384], "f": 0, "t": 175, "d": [58,76], "a": 1 }, + { "px": [0,128], "src": [832,384], "f": 1, "t": 175, "d": [58,80], "a": 1 }, + { "px": [2304,128], "src": [832,384], "f": 0, "t": 175, "d": [58,116], "a": 1 }, + { "px": [0,192], "src": [832,384], "f": 1, "t": 175, "d": [58,120], "a": 1 }, + { "px": [0,256], "src": [832,384], "f": 1, "t": 175, "d": [58,160], "a": 1 }, + { "px": [0,320], "src": [832,384], "f": 1, "t": 175, "d": [58,200], "a": 1 }, + { "px": [2496,320], "src": [832,384], "f": 0, "t": 175, "d": [58,239], "a": 1 }, + { "px": [0,384], "src": [832,384], "f": 1, "t": 175, "d": [58,240], "a": 1 }, + { "px": [1088,384], "src": [832,384], "f": 0, "t": 175, "d": [58,257], "a": 1 }, + { "px": [1344,384], "src": [832,384], "f": 1, "t": 175, "d": [58,261], "a": 1 }, + { "px": [2496,384], "src": [832,384], "f": 0, "t": 175, "d": [58,279], "a": 1 }, + { "px": [0,448], "src": [832,384], "f": 1, "t": 175, "d": [58,280], "a": 1 }, + { "px": [2496,448], "src": [832,384], "f": 0, "t": 175, "d": [58,319], "a": 1 }, + { "px": [0,512], "src": [832,384], "f": 1, "t": 175, "d": [58,320], "a": 1 }, + { "px": [2496,512], "src": [832,384], "f": 0, "t": 175, "d": [58,359], "a": 1 }, + { "px": [0,576], "src": [832,384], "f": 1, "t": 175, "d": [58,360], "a": 1 }, + { "px": [2496,576], "src": [832,384], "f": 0, "t": 175, "d": [58,399], "a": 1 }, + { "px": [0,640], "src": [832,384], "f": 1, "t": 175, "d": [58,400], "a": 1 }, + { "px": [2496,640], "src": [832,384], "f": 0, "t": 175, "d": [58,439], "a": 1 }, + { "px": [0,704], "src": [832,384], "f": 1, "t": 175, "d": [58,440], "a": 1 }, + { "px": [2496,704], "src": [832,384], "f": 0, "t": 175, "d": [58,479], "a": 1 }, + { "px": [0,768], "src": [832,384], "f": 1, "t": 175, "d": [58,480], "a": 1 }, + { "px": [2496,768], "src": [832,384], "f": 0, "t": 175, "d": [58,519], "a": 1 }, + { "px": [0,832], "src": [832,384], "f": 1, "t": 175, "d": [58,520], "a": 1 }, + { "px": [2496,832], "src": [832,384], "f": 0, "t": 175, "d": [58,559], "a": 1 }, + { "px": [0,896], "src": [832,384], "f": 1, "t": 175, "d": [58,560], "a": 1 }, + { "px": [2496,896], "src": [832,384], "f": 0, "t": 175, "d": [58,599], "a": 1 }, + { "px": [0,960], "src": [832,384], "f": 1, "t": 175, "d": [58,600], "a": 1 }, + { "px": [2496,960], "src": [832,384], "f": 0, "t": 175, "d": [58,639], "a": 1 }, + { "px": [0,1088], "src": [832,384], "f": 1, "t": 175, "d": [58,680], "a": 1 }, + { "px": [2304,1088], "src": [832,384], "f": 0, "t": 175, "d": [58,716], "a": 1 }, + { "px": [0,1152], "src": [832,384], "f": 1, "t": 175, "d": [58,720], "a": 1 }, + { "px": [0,1216], "src": [832,384], "f": 1, "t": 175, "d": [58,760], "a": 1 }, + { "px": [2496,1216], "src": [832,384], "f": 0, "t": 175, "d": [58,799], "a": 1 }, + { "px": [0,1280], "src": [832,384], "f": 1, "t": 175, "d": [58,800], "a": 1 }, + { "px": [1152,1280], "src": [832,384], "f": 0, "t": 175, "d": [58,818], "a": 1 }, + { "px": [1280,1280], "src": [832,384], "f": 1, "t": 175, "d": [58,820], "a": 1 }, + { "px": [2496,1280], "src": [832,384], "f": 0, "t": 175, "d": [58,839], "a": 1 }, + { "px": [0,1344], "src": [832,384], "f": 1, "t": 175, "d": [58,840], "a": 1 }, + { "px": [1152,1344], "src": [832,384], "f": 0, "t": 175, "d": [58,858], "a": 1 }, + { "px": [1280,1344], "src": [832,384], "f": 1, "t": 175, "d": [58,860], "a": 1 }, + { "px": [2496,1344], "src": [832,384], "f": 0, "t": 175, "d": [58,879], "a": 1 }, + { "px": [64,0], "src": [832,448], "f": 2, "t": 202, "d": [57,1], "a": 1 }, + { "px": [128,0], "src": [832,448], "f": 2, "t": 202, "d": [57,2], "a": 1 }, + { "px": [192,0], "src": [832,448], "f": 2, "t": 202, "d": [57,3], "a": 1 }, + { "px": [256,0], "src": [832,448], "f": 2, "t": 202, "d": [57,4], "a": 1 }, + { "px": [320,0], "src": [832,448], "f": 2, "t": 202, "d": [57,5], "a": 1 }, + { "px": [384,0], "src": [832,448], "f": 2, "t": 202, "d": [57,6], "a": 1 }, + { "px": [448,0], "src": [832,448], "f": 2, "t": 202, "d": [57,7], "a": 1 }, + { "px": [512,0], "src": [832,448], "f": 2, "t": 202, "d": [57,8], "a": 1 }, + { "px": [576,0], "src": [832,448], "f": 2, "t": 202, "d": [57,9], "a": 1 }, + { "px": [640,0], "src": [832,448], "f": 2, "t": 202, "d": [57,10], "a": 1 }, + { "px": [704,0], "src": [832,448], "f": 2, "t": 202, "d": [57,11], "a": 1 }, + { "px": [768,0], "src": [832,448], "f": 2, "t": 202, "d": [57,12], "a": 1 }, + { "px": [832,0], "src": [832,448], "f": 2, "t": 202, "d": [57,13], "a": 1 }, + { "px": [896,0], "src": [832,448], "f": 2, "t": 202, "d": [57,14], "a": 1 }, + { "px": [960,0], "src": [832,448], "f": 2, "t": 202, "d": [57,15], "a": 1 }, + { "px": [1024,0], "src": [832,448], "f": 2, "t": 202, "d": [57,16], "a": 1 }, + { "px": [1088,0], "src": [832,448], "f": 2, "t": 202, "d": [57,17], "a": 1 }, + { "px": [1152,0], "src": [832,448], "f": 2, "t": 202, "d": [57,18], "a": 1 }, + { "px": [1216,0], "src": [832,448], "f": 2, "t": 202, "d": [57,19], "a": 1 }, + { "px": [1280,0], "src": [832,448], "f": 2, "t": 202, "d": [57,20], "a": 1 }, + { "px": [1344,0], "src": [832,448], "f": 2, "t": 202, "d": [57,21], "a": 1 }, + { "px": [1408,0], "src": [832,448], "f": 2, "t": 202, "d": [57,22], "a": 1 }, + { "px": [1472,0], "src": [832,448], "f": 2, "t": 202, "d": [57,23], "a": 1 }, + { "px": [1536,0], "src": [832,448], "f": 2, "t": 202, "d": [57,24], "a": 1 }, + { "px": [1600,0], "src": [832,448], "f": 2, "t": 202, "d": [57,25], "a": 1 }, + { "px": [1664,0], "src": [832,448], "f": 2, "t": 202, "d": [57,26], "a": 1 }, + { "px": [1728,0], "src": [832,448], "f": 2, "t": 202, "d": [57,27], "a": 1 }, + { "px": [1792,0], "src": [832,448], "f": 2, "t": 202, "d": [57,28], "a": 1 }, + { "px": [1856,0], "src": [832,448], "f": 2, "t": 202, "d": [57,29], "a": 1 }, + { "px": [1920,0], "src": [832,448], "f": 2, "t": 202, "d": [57,30], "a": 1 }, + { "px": [1984,0], "src": [832,448], "f": 2, "t": 202, "d": [57,31], "a": 1 }, + { "px": [2048,0], "src": [832,448], "f": 2, "t": 202, "d": [57,32], "a": 1 }, + { "px": [2112,0], "src": [832,448], "f": 2, "t": 202, "d": [57,33], "a": 1 }, + { "px": [2176,0], "src": [832,448], "f": 2, "t": 202, "d": [57,34], "a": 1 }, + { "px": [2240,0], "src": [832,448], "f": 2, "t": 202, "d": [57,35], "a": 1 }, + { "px": [2240,192], "src": [832,448], "f": 0, "t": 202, "d": [57,155], "a": 1 }, + { "px": [1216,256], "src": [832,448], "f": 0, "t": 202, "d": [57,179], "a": 1 }, + { "px": [2240,256], "src": [832,448], "f": 2, "t": 202, "d": [57,195], "a": 1 }, + { "px": [2304,256], "src": [832,448], "f": 2, "t": 202, "d": [57,196], "a": 1 }, + { "px": [2368,256], "src": [832,448], "f": 2, "t": 202, "d": [57,197], "a": 1 }, + { "px": [2432,256], "src": [832,448], "f": 2, "t": 202, "d": [57,198], "a": 1 }, + { "px": [1152,448], "src": [832,448], "f": 2, "t": 202, "d": [57,298], "a": 1 }, + { "px": [1216,448], "src": [832,448], "f": 2, "t": 202, "d": [57,299], "a": 1 }, + { "px": [1280,448], "src": [832,448], "f": 2, "t": 202, "d": [57,300], "a": 1 }, + { "px": [2368,1024], "src": [832,448], "f": 0, "t": 202, "d": [57,677], "a": 1 }, + { "px": [2432,1024], "src": [832,448], "f": 0, "t": 202, "d": [57,678], "a": 1 }, + { "px": [2368,1152], "src": [832,448], "f": 2, "t": 202, "d": [57,757], "a": 1 }, + { "px": [2432,1152], "src": [832,448], "f": 2, "t": 202, "d": [57,758], "a": 1 }, + { "px": [1216,1216], "src": [832,448], "f": 0, "t": 202, "d": [57,779], "a": 1 }, + { "px": [64,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,881], "a": 1 }, + { "px": [128,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,882], "a": 1 }, + { "px": [192,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,883], "a": 1 }, + { "px": [256,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,884], "a": 1 }, + { "px": [320,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,885], "a": 1 }, + { "px": [576,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,889], "a": 1 }, + { "px": [640,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,890], "a": 1 }, + { "px": [704,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,891], "a": 1 }, + { "px": [768,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,892], "a": 1 }, + { "px": [832,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,893], "a": 1 }, + { "px": [896,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,894], "a": 1 }, + { "px": [960,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,895], "a": 1 }, + { "px": [1024,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,896], "a": 1 }, + { "px": [1088,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,897], "a": 1 }, + { "px": [1344,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,901], "a": 1 }, + { "px": [1408,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,902], "a": 1 }, + { "px": [1472,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,903], "a": 1 }, + { "px": [1536,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,904], "a": 1 }, + { "px": [1600,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,905], "a": 1 }, + { "px": [1664,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,906], "a": 1 }, + { "px": [1728,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,907], "a": 1 }, + { "px": [1792,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,908], "a": 1 }, + { "px": [1856,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,909], "a": 1 }, + { "px": [1920,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,910], "a": 1 }, + { "px": [1984,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,911], "a": 1 }, + { "px": [2048,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,912], "a": 1 }, + { "px": [2112,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,913], "a": 1 }, + { "px": [2176,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,914], "a": 1 }, + { "px": [2240,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,915], "a": 1 }, + { "px": [2304,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,916], "a": 1 }, + { "px": [2368,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,917], "a": 1 }, + { "px": [2432,1408], "src": [832,448], "f": 0, "t": 202, "d": [57,918], "a": 1 }, + { "px": [2176,192], "src": [1024,256], "f": 0, "t": 124, "d": [56,154], "a": 1 }, + { "px": [1152,256], "src": [1024,256], "f": 0, "t": 124, "d": [56,178], "a": 1 }, + { "px": [1280,256], "src": [1024,256], "f": 1, "t": 124, "d": [56,180], "a": 1 }, + { "px": [2176,256], "src": [1024,256], "f": 2, "t": 124, "d": [56,194], "a": 1 }, + { "px": [1088,320], "src": [1024,256], "f": 0, "t": 124, "d": [56,217], "a": 1 }, + { "px": [1344,320], "src": [1024,256], "f": 1, "t": 124, "d": [56,221], "a": 1 }, + { "px": [1088,448], "src": [1024,256], "f": 2, "t": 124, "d": [56,297], "a": 1 }, + { "px": [1344,448], "src": [1024,256], "f": 3, "t": 124, "d": [56,301], "a": 1 }, + { "px": [2304,1152], "src": [1024,256], "f": 2, "t": 124, "d": [56,756], "a": 1 }, + { "px": [1152,1216], "src": [1024,256], "f": 0, "t": 124, "d": [56,778], "a": 1 }, + { "px": [1280,1216], "src": [1024,256], "f": 1, "t": 124, "d": [56,780], "a": 1 }, + { "px": [384,1344], "src": [704,320], "f": 0, "t": 146, "d": [55,846], "a": 1 }, + { "px": [512,1344], "src": [704,320], "f": 0, "t": 146, "d": [55,848], "a": 1 }, + { "px": [64,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,641], "a": 1 }, + { "px": [128,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,642], "a": 1 }, + { "px": [192,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,643], "a": 1 }, + { "px": [640,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,650], "a": 1 }, + { "px": [704,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,651], "a": 1 }, + { "px": [768,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,652], "a": 1 }, + { "px": [832,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,653], "a": 1 }, + { "px": [896,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,654], "a": 1 }, + { "px": [960,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,655], "a": 1 }, + { "px": [1024,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,656], "a": 1 }, + { "px": [1088,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,657], "a": 1 }, + { "px": [1152,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,658], "a": 1 }, + { "px": [1216,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,659], "a": 1 }, + { "px": [1280,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,660], "a": 1 }, + { "px": [1344,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,661], "a": 1 }, + { "px": [1408,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,662], "a": 1 }, + { "px": [1472,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,663], "a": 1 }, + { "px": [1536,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,664], "a": 1 }, + { "px": [1600,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,665], "a": 1 }, + { "px": [1664,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,666], "a": 1 }, + { "px": [1728,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,667], "a": 1 }, + { "px": [1792,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,668], "a": 1 }, + { "px": [1856,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,669], "a": 1 }, + { "px": [2176,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,674], "a": 1 }, + { "px": [2240,1024], "src": [704,256], "f": 0, "t": 119, "d": [52,675], "a": 1 }, + { "px": [448,1280], "src": [704,256], "f": 0, "t": 119, "d": [52,807], "a": 1 }, + { "px": [1664,768], "src": [896,256], "f": 0, "t": 122, "d": [51,506], "a": 1 }, + { "px": [256,1024], "src": [896,256], "f": 0, "t": 122, "d": [51,644], "a": 1 }, + { "px": [1920,1024], "src": [896,256], "f": 0, "t": 122, "d": [51,670], "a": 1 }, + { "px": [1600,768], "src": [960,320], "f": 0, "t": 150, "d": [50,505], "a": 1 }, + { "px": [576,1024], "src": [960,320], "f": 0, "t": 150, "d": [50,649], "a": 1 }, + { "px": [2112,1024], "src": [960,320], "f": 0, "t": 150, "d": [50,673], "a": 1 }, + { "px": [0,1024], "src": [768,448], "f": 1, "t": 201, "d": [48,640], "a": 1 }, + { "px": [384,1408], "src": [768,512], "f": 0, "t": 228, "d": [38,886], "a": 1 }, + { "px": [2304,1024], "src": [832,512], "f": 0, "t": 229, "d": [36,676], "a": 1 }, + { "px": [512,1408], "src": [704,512], "f": 0, "t": 227, "d": [35,888], "a": 1 }, + { "px": [384,1280], "src": [576,256], "f": 0, "t": 117, "d": [33,806], "a": 1 }, + { "px": [512,1280], "src": [576,256], "f": 1, "t": 117, "d": [33,808], "a": 1 }, + { "px": [1984,576], "src": [960,448], "f": 0, "t": 204, "d": [31,391], "a": 1 }, + { "px": [512,704], "src": [960,448], "f": 0, "t": 204, "d": [31,448], "a": 1 }, + { "px": [64,64], "src": [192,0], "f": 0, "t": 3, "d": [63,41], "a": 1 }, + { "px": [128,64], "src": [64,0], "f": 0, "t": 1, "d": [63,42], "a": 1 }, + { "px": [192,64], "src": [128,0], "f": 0, "t": 2, "d": [63,43], "a": 1 }, + { "px": [256,64], "src": [192,0], "f": 0, "t": 3, "d": [63,44], "a": 1 }, + { "px": [320,64], "src": [64,0], "f": 0, "t": 1, "d": [63,45], "a": 1 }, + { "px": [384,64], "src": [0,0], "f": 0, "t": 0, "d": [63,46], "a": 1 }, + { "px": [448,64], "src": [0,0], "f": 0, "t": 0, "d": [63,47], "a": 1 }, + { "px": [512,64], "src": [128,0], "f": 0, "t": 2, "d": [63,48], "a": 1 }, + { "px": [576,64], "src": [64,0], "f": 0, "t": 1, "d": [63,49], "a": 1 }, + { "px": [640,64], "src": [128,0], "f": 0, "t": 2, "d": [63,50], "a": 1 }, + { "px": [704,64], "src": [192,0], "f": 0, "t": 3, "d": [63,51], "a": 1 }, + { "px": [768,64], "src": [128,0], "f": 0, "t": 2, "d": [63,52], "a": 1 }, + { "px": [832,64], "src": [128,0], "f": 0, "t": 2, "d": [63,53], "a": 1 }, + { "px": [896,64], "src": [64,0], "f": 0, "t": 1, "d": [63,54], "a": 1 }, + { "px": [960,64], "src": [192,0], "f": 0, "t": 3, "d": [63,55], "a": 1 }, + { "px": [1024,64], "src": [192,0], "f": 0, "t": 3, "d": [63,56], "a": 1 }, + { "px": [1088,64], "src": [64,0], "f": 0, "t": 1, "d": [63,57], "a": 1 }, + { "px": [1152,64], "src": [64,0], "f": 0, "t": 1, "d": [63,58], "a": 1 }, + { "px": [1216,64], "src": [0,0], "f": 0, "t": 0, "d": [63,59], "a": 1 }, + { "px": [1280,64], "src": [128,0], "f": 0, "t": 2, "d": [63,60], "a": 1 }, + { "px": [1344,64], "src": [64,0], "f": 0, "t": 1, "d": [63,61], "a": 1 }, + { "px": [1408,64], "src": [64,0], "f": 0, "t": 1, "d": [63,62], "a": 1 }, + { "px": [1472,64], "src": [192,0], "f": 0, "t": 3, "d": [63,63], "a": 1 }, + { "px": [1536,64], "src": [64,0], "f": 0, "t": 1, "d": [63,64], "a": 1 }, + { "px": [1600,64], "src": [192,0], "f": 0, "t": 3, "d": [63,65], "a": 1 }, + { "px": [1664,64], "src": [192,0], "f": 0, "t": 3, "d": [63,66], "a": 1 }, + { "px": [1728,64], "src": [0,0], "f": 0, "t": 0, "d": [63,67], "a": 1 }, + { "px": [1792,64], "src": [0,0], "f": 0, "t": 0, "d": [63,68], "a": 1 }, + { "px": [1856,64], "src": [0,0], "f": 0, "t": 0, "d": [63,69], "a": 1 }, + { "px": [1920,64], "src": [64,0], "f": 0, "t": 1, "d": [63,70], "a": 1 }, + { "px": [1984,64], "src": [64,0], "f": 0, "t": 1, "d": [63,71], "a": 1 }, + { "px": [2048,64], "src": [128,0], "f": 0, "t": 2, "d": [63,72], "a": 1 }, + { "px": [2112,64], "src": [128,0], "f": 0, "t": 2, "d": [63,73], "a": 1 }, + { "px": [2176,64], "src": [0,0], "f": 0, "t": 0, "d": [63,74], "a": 1 }, + { "px": [2240,64], "src": [128,0], "f": 0, "t": 2, "d": [63,75], "a": 1 }, + { "px": [64,128], "src": [128,0], "f": 0, "t": 2, "d": [63,81], "a": 1 }, + { "px": [128,128], "src": [64,0], "f": 0, "t": 1, "d": [63,82], "a": 1 }, + { "px": [256,128], "src": [128,0], "f": 0, "t": 2, "d": [63,84], "a": 1 }, + { "px": [320,128], "src": [0,0], "f": 0, "t": 0, "d": [63,85], "a": 1 }, + { "px": [384,128], "src": [64,0], "f": 0, "t": 1, "d": [63,86], "a": 1 }, + { "px": [448,128], "src": [0,0], "f": 0, "t": 0, "d": [63,87], "a": 1 }, + { "px": [512,128], "src": [128,0], "f": 0, "t": 2, "d": [63,88], "a": 1 }, + { "px": [576,128], "src": [192,0], "f": 0, "t": 3, "d": [63,89], "a": 1 }, + { "px": [640,128], "src": [64,0], "f": 0, "t": 1, "d": [63,90], "a": 1 }, + { "px": [704,128], "src": [64,0], "f": 0, "t": 1, "d": [63,91], "a": 1 }, + { "px": [768,128], "src": [128,0], "f": 0, "t": 2, "d": [63,92], "a": 1 }, + { "px": [832,128], "src": [64,0], "f": 0, "t": 1, "d": [63,93], "a": 1 }, + { "px": [896,128], "src": [0,0], "f": 0, "t": 0, "d": [63,94], "a": 1 }, + { "px": [1024,128], "src": [192,0], "f": 0, "t": 3, "d": [63,96], "a": 1 }, + { "px": [1088,128], "src": [192,0], "f": 0, "t": 3, "d": [63,97], "a": 1 }, + { "px": [1152,128], "src": [192,0], "f": 0, "t": 3, "d": [63,98], "a": 1 }, + { "px": [1216,128], "src": [192,0], "f": 0, "t": 3, "d": [63,99], "a": 1 }, + { "px": [1280,128], "src": [128,0], "f": 0, "t": 2, "d": [63,100], "a": 1 }, + { "px": [1344,128], "src": [0,0], "f": 0, "t": 0, "d": [63,101], "a": 1 }, + { "px": [1408,128], "src": [0,0], "f": 0, "t": 0, "d": [63,102], "a": 1 }, + { "px": [1472,128], "src": [0,0], "f": 0, "t": 0, "d": [63,103], "a": 1 }, + { "px": [1536,128], "src": [64,0], "f": 0, "t": 1, "d": [63,104], "a": 1 }, + { "px": [1600,128], "src": [192,0], "f": 0, "t": 3, "d": [63,105], "a": 1 }, + { "px": [1664,128], "src": [64,0], "f": 0, "t": 1, "d": [63,106], "a": 1 }, + { "px": [1728,128], "src": [64,0], "f": 0, "t": 1, "d": [63,107], "a": 1 }, + { "px": [1792,128], "src": [64,0], "f": 0, "t": 1, "d": [63,108], "a": 1 }, + { "px": [1856,128], "src": [64,0], "f": 0, "t": 1, "d": [63,109], "a": 1 }, + { "px": [1920,128], "src": [64,0], "f": 0, "t": 1, "d": [63,110], "a": 1 }, + { "px": [1984,128], "src": [0,0], "f": 0, "t": 0, "d": [63,111], "a": 1 }, + { "px": [2048,128], "src": [192,0], "f": 0, "t": 3, "d": [63,112], "a": 1 }, + { "px": [2112,128], "src": [192,0], "f": 0, "t": 3, "d": [63,113], "a": 1 }, + { "px": [2176,128], "src": [64,0], "f": 0, "t": 1, "d": [63,114], "a": 1 }, + { "px": [2240,128], "src": [192,0], "f": 0, "t": 3, "d": [63,115], "a": 1 }, + { "px": [64,192], "src": [0,0], "f": 0, "t": 0, "d": [63,121], "a": 1 }, + { "px": [128,192], "src": [64,0], "f": 0, "t": 1, "d": [63,122], "a": 1 }, + { "px": [192,192], "src": [64,0], "f": 0, "t": 1, "d": [63,123], "a": 1 }, + { "px": [256,192], "src": [192,0], "f": 0, "t": 3, "d": [63,124], "a": 1 }, + { "px": [320,192], "src": [64,0], "f": 0, "t": 1, "d": [63,125], "a": 1 }, + { "px": [384,192], "src": [0,0], "f": 0, "t": 0, "d": [63,126], "a": 1 }, + { "px": [448,192], "src": [0,0], "f": 0, "t": 0, "d": [63,127], "a": 1 }, + { "px": [512,192], "src": [64,0], "f": 0, "t": 1, "d": [63,128], "a": 1 }, + { "px": [576,192], "src": [128,0], "f": 0, "t": 2, "d": [63,129], "a": 1 }, + { "px": [640,192], "src": [64,0], "f": 0, "t": 1, "d": [63,130], "a": 1 }, + { "px": [704,192], "src": [192,0], "f": 0, "t": 3, "d": [63,131], "a": 1 }, + { "px": [768,192], "src": [64,0], "f": 0, "t": 1, "d": [63,132], "a": 1 }, + { "px": [832,192], "src": [192,0], "f": 0, "t": 3, "d": [63,133], "a": 1 }, + { "px": [896,192], "src": [128,0], "f": 0, "t": 2, "d": [63,134], "a": 1 }, + { "px": [960,192], "src": [64,0], "f": 0, "t": 1, "d": [63,135], "a": 1 }, + { "px": [1024,192], "src": [128,0], "f": 0, "t": 2, "d": [63,136], "a": 1 }, + { "px": [1088,192], "src": [0,0], "f": 0, "t": 0, "d": [63,137], "a": 1 }, + { "px": [1152,192], "src": [64,0], "f": 0, "t": 1, "d": [63,138], "a": 1 }, + { "px": [1216,192], "src": [0,0], "f": 0, "t": 0, "d": [63,139], "a": 1 }, + { "px": [1280,192], "src": [64,0], "f": 0, "t": 1, "d": [63,140], "a": 1 }, + { "px": [1344,192], "src": [192,0], "f": 0, "t": 3, "d": [63,141], "a": 1 }, + { "px": [1408,192], "src": [128,0], "f": 0, "t": 2, "d": [63,142], "a": 1 }, + { "px": [1472,192], "src": [0,0], "f": 0, "t": 0, "d": [63,143], "a": 1 }, + { "px": [1536,192], "src": [192,0], "f": 0, "t": 3, "d": [63,144], "a": 1 }, + { "px": [1600,192], "src": [128,0], "f": 0, "t": 2, "d": [63,145], "a": 1 }, + { "px": [1664,192], "src": [192,0], "f": 0, "t": 3, "d": [63,146], "a": 1 }, + { "px": [1728,192], "src": [0,0], "f": 0, "t": 0, "d": [63,147], "a": 1 }, + { "px": [1792,192], "src": [0,0], "f": 0, "t": 0, "d": [63,148], "a": 1 }, + { "px": [1856,192], "src": [64,0], "f": 0, "t": 1, "d": [63,149], "a": 1 }, + { "px": [1920,192], "src": [0,0], "f": 0, "t": 0, "d": [63,150], "a": 1 }, + { "px": [1984,192], "src": [0,0], "f": 0, "t": 0, "d": [63,151], "a": 1 }, + { "px": [2048,192], "src": [64,0], "f": 0, "t": 1, "d": [63,152], "a": 1 }, + { "px": [2112,192], "src": [0,0], "f": 0, "t": 0, "d": [63,153], "a": 1 }, + { "px": [64,256], "src": [0,0], "f": 0, "t": 0, "d": [63,161], "a": 1 }, + { "px": [128,256], "src": [192,0], "f": 0, "t": 3, "d": [63,162], "a": 1 }, + { "px": [192,256], "src": [0,0], "f": 0, "t": 0, "d": [63,163], "a": 1 }, + { "px": [256,256], "src": [192,0], "f": 0, "t": 3, "d": [63,164], "a": 1 }, + { "px": [320,256], "src": [0,0], "f": 0, "t": 0, "d": [63,165], "a": 1 }, + { "px": [384,256], "src": [128,0], "f": 0, "t": 2, "d": [63,166], "a": 1 }, + { "px": [448,256], "src": [192,0], "f": 0, "t": 3, "d": [63,167], "a": 1 }, + { "px": [512,256], "src": [192,0], "f": 0, "t": 3, "d": [63,168], "a": 1 }, + { "px": [576,256], "src": [192,0], "f": 0, "t": 3, "d": [63,169], "a": 1 }, + { "px": [640,256], "src": [192,0], "f": 0, "t": 3, "d": [63,170], "a": 1 }, + { "px": [704,256], "src": [64,0], "f": 0, "t": 1, "d": [63,171], "a": 1 }, + { "px": [768,256], "src": [128,0], "f": 0, "t": 2, "d": [63,172], "a": 1 }, + { "px": [832,256], "src": [192,0], "f": 0, "t": 3, "d": [63,173], "a": 1 }, + { "px": [896,256], "src": [64,0], "f": 0, "t": 1, "d": [63,174], "a": 1 }, + { "px": [960,256], "src": [64,0], "f": 0, "t": 1, "d": [63,175], "a": 1 }, + { "px": [1024,256], "src": [0,0], "f": 0, "t": 0, "d": [63,176], "a": 1 }, + { "px": [1088,256], "src": [128,0], "f": 0, "t": 2, "d": [63,177], "a": 1 }, + { "px": [1344,256], "src": [64,0], "f": 0, "t": 1, "d": [63,181], "a": 1 }, + { "px": [1408,256], "src": [128,0], "f": 0, "t": 2, "d": [63,182], "a": 1 }, + { "px": [1472,256], "src": [128,0], "f": 0, "t": 2, "d": [63,183], "a": 1 }, + { "px": [1536,256], "src": [128,0], "f": 0, "t": 2, "d": [63,184], "a": 1 }, + { "px": [1600,256], "src": [192,0], "f": 0, "t": 3, "d": [63,185], "a": 1 }, + { "px": [1664,256], "src": [128,0], "f": 0, "t": 2, "d": [63,186], "a": 1 }, + { "px": [1728,256], "src": [0,0], "f": 0, "t": 0, "d": [63,187], "a": 1 }, + { "px": [1792,256], "src": [128,0], "f": 0, "t": 2, "d": [63,188], "a": 1 }, + { "px": [1856,256], "src": [192,0], "f": 0, "t": 3, "d": [63,189], "a": 1 }, + { "px": [1920,256], "src": [64,0], "f": 0, "t": 1, "d": [63,190], "a": 1 }, + { "px": [1984,256], "src": [192,0], "f": 0, "t": 3, "d": [63,191], "a": 1 }, + { "px": [2048,256], "src": [128,0], "f": 0, "t": 2, "d": [63,192], "a": 1 }, + { "px": [2112,256], "src": [64,0], "f": 0, "t": 1, "d": [63,193], "a": 1 }, + { "px": [64,320], "src": [192,0], "f": 0, "t": 3, "d": [63,201], "a": 1 }, + { "px": [128,320], "src": [128,0], "f": 0, "t": 2, "d": [63,202], "a": 1 }, + { "px": [192,320], "src": [128,0], "f": 0, "t": 2, "d": [63,203], "a": 1 }, + { "px": [256,320], "src": [0,0], "f": 0, "t": 0, "d": [63,204], "a": 1 }, + { "px": [320,320], "src": [0,0], "f": 0, "t": 0, "d": [63,205], "a": 1 }, + { "px": [384,320], "src": [128,0], "f": 0, "t": 2, "d": [63,206], "a": 1 }, + { "px": [448,320], "src": [192,0], "f": 0, "t": 3, "d": [63,207], "a": 1 }, + { "px": [512,320], "src": [0,0], "f": 0, "t": 0, "d": [63,208], "a": 1 }, + { "px": [576,320], "src": [128,0], "f": 0, "t": 2, "d": [63,209], "a": 1 }, + { "px": [640,320], "src": [128,0], "f": 0, "t": 2, "d": [63,210], "a": 1 }, + { "px": [704,320], "src": [0,0], "f": 0, "t": 0, "d": [63,211], "a": 1 }, + { "px": [768,320], "src": [64,0], "f": 0, "t": 1, "d": [63,212], "a": 1 }, + { "px": [832,320], "src": [128,0], "f": 0, "t": 2, "d": [63,213], "a": 1 }, + { "px": [896,320], "src": [128,0], "f": 0, "t": 2, "d": [63,214], "a": 1 }, + { "px": [960,320], "src": [64,0], "f": 0, "t": 1, "d": [63,215], "a": 1 }, + { "px": [1024,320], "src": [192,0], "f": 0, "t": 3, "d": [63,216], "a": 1 }, + { "px": [1408,320], "src": [128,0], "f": 0, "t": 2, "d": [63,222], "a": 1 }, + { "px": [1472,320], "src": [0,0], "f": 0, "t": 0, "d": [63,223], "a": 1 }, + { "px": [1536,320], "src": [0,0], "f": 0, "t": 0, "d": [63,224], "a": 1 }, + { "px": [1600,320], "src": [128,0], "f": 0, "t": 2, "d": [63,225], "a": 1 }, + { "px": [1664,320], "src": [64,0], "f": 0, "t": 1, "d": [63,226], "a": 1 }, + { "px": [1728,320], "src": [64,0], "f": 0, "t": 1, "d": [63,227], "a": 1 }, + { "px": [1792,320], "src": [0,0], "f": 0, "t": 0, "d": [63,228], "a": 1 }, + { "px": [1856,320], "src": [0,0], "f": 0, "t": 0, "d": [63,229], "a": 1 }, + { "px": [1920,320], "src": [0,0], "f": 0, "t": 0, "d": [63,230], "a": 1 }, + { "px": [1984,320], "src": [64,0], "f": 0, "t": 1, "d": [63,231], "a": 1 }, + { "px": [2048,320], "src": [64,0], "f": 0, "t": 1, "d": [63,232], "a": 1 }, + { "px": [2112,320], "src": [64,0], "f": 0, "t": 1, "d": [63,233], "a": 1 }, + { "px": [2176,320], "src": [128,0], "f": 0, "t": 2, "d": [63,234], "a": 1 }, + { "px": [2240,320], "src": [0,0], "f": 0, "t": 0, "d": [63,235], "a": 1 }, + { "px": [2304,320], "src": [64,0], "f": 0, "t": 1, "d": [63,236], "a": 1 }, + { "px": [2368,320], "src": [64,0], "f": 0, "t": 1, "d": [63,237], "a": 1 }, + { "px": [2432,320], "src": [0,0], "f": 0, "t": 0, "d": [63,238], "a": 1 }, + { "px": [64,384], "src": [192,0], "f": 0, "t": 3, "d": [63,241], "a": 1 }, + { "px": [128,384], "src": [0,0], "f": 0, "t": 0, "d": [63,242], "a": 1 }, + { "px": [192,384], "src": [192,0], "f": 0, "t": 3, "d": [63,243], "a": 1 }, + { "px": [256,384], "src": [0,0], "f": 0, "t": 0, "d": [63,244], "a": 1 }, + { "px": [320,384], "src": [192,0], "f": 0, "t": 3, "d": [63,245], "a": 1 }, + { "px": [384,384], "src": [64,0], "f": 0, "t": 1, "d": [63,246], "a": 1 }, + { "px": [576,384], "src": [64,0], "f": 0, "t": 1, "d": [63,249], "a": 1 }, + { "px": [640,384], "src": [128,0], "f": 0, "t": 2, "d": [63,250], "a": 1 }, + { "px": [704,384], "src": [192,0], "f": 0, "t": 3, "d": [63,251], "a": 1 }, + { "px": [768,384], "src": [64,0], "f": 0, "t": 1, "d": [63,252], "a": 1 }, + { "px": [832,384], "src": [192,0], "f": 0, "t": 3, "d": [63,253], "a": 1 }, + { "px": [896,384], "src": [0,0], "f": 0, "t": 0, "d": [63,254], "a": 1 }, + { "px": [960,384], "src": [64,0], "f": 0, "t": 1, "d": [63,255], "a": 1 }, + { "px": [1024,384], "src": [128,0], "f": 0, "t": 2, "d": [63,256], "a": 1 }, + { "px": [1408,384], "src": [192,0], "f": 0, "t": 3, "d": [63,262], "a": 1 }, + { "px": [1472,384], "src": [64,0], "f": 0, "t": 1, "d": [63,263], "a": 1 }, + { "px": [1536,384], "src": [128,0], "f": 0, "t": 2, "d": [63,264], "a": 1 }, + { "px": [1600,384], "src": [64,0], "f": 0, "t": 1, "d": [63,265], "a": 1 }, + { "px": [1664,384], "src": [128,0], "f": 0, "t": 2, "d": [63,266], "a": 1 }, + { "px": [1728,384], "src": [64,0], "f": 0, "t": 1, "d": [63,267], "a": 1 }, + { "px": [1792,384], "src": [0,0], "f": 0, "t": 0, "d": [63,268], "a": 1 }, + { "px": [1856,384], "src": [192,0], "f": 0, "t": 3, "d": [63,269], "a": 1 }, + { "px": [1920,384], "src": [0,0], "f": 0, "t": 0, "d": [63,270], "a": 1 }, + { "px": [1984,384], "src": [192,0], "f": 0, "t": 3, "d": [63,271], "a": 1 }, + { "px": [2048,384], "src": [0,0], "f": 0, "t": 0, "d": [63,272], "a": 1 }, + { "px": [2112,384], "src": [192,0], "f": 0, "t": 3, "d": [63,273], "a": 1 }, + { "px": [2176,384], "src": [192,0], "f": 0, "t": 3, "d": [63,274], "a": 1 }, + { "px": [2240,384], "src": [0,0], "f": 0, "t": 0, "d": [63,275], "a": 1 }, + { "px": [2304,384], "src": [64,0], "f": 0, "t": 1, "d": [63,276], "a": 1 }, + { "px": [2368,384], "src": [0,0], "f": 0, "t": 0, "d": [63,277], "a": 1 }, + { "px": [2432,384], "src": [0,0], "f": 0, "t": 0, "d": [63,278], "a": 1 }, + { "px": [64,448], "src": [192,0], "f": 0, "t": 3, "d": [63,281], "a": 1 }, + { "px": [128,448], "src": [0,0], "f": 0, "t": 0, "d": [63,282], "a": 1 }, + { "px": [192,448], "src": [0,0], "f": 0, "t": 0, "d": [63,283], "a": 1 }, + { "px": [256,448], "src": [192,0], "f": 0, "t": 3, "d": [63,284], "a": 1 }, + { "px": [320,448], "src": [0,0], "f": 0, "t": 0, "d": [63,285], "a": 1 }, + { "px": [384,448], "src": [64,0], "f": 0, "t": 1, "d": [63,286], "a": 1 }, + { "px": [448,448], "src": [192,0], "f": 0, "t": 3, "d": [63,287], "a": 1 }, + { "px": [512,448], "src": [192,0], "f": 0, "t": 3, "d": [63,288], "a": 1 }, + { "px": [576,448], "src": [128,0], "f": 0, "t": 2, "d": [63,289], "a": 1 }, + { "px": [640,448], "src": [128,0], "f": 0, "t": 2, "d": [63,290], "a": 1 }, + { "px": [704,448], "src": [64,0], "f": 0, "t": 1, "d": [63,291], "a": 1 }, + { "px": [768,448], "src": [192,0], "f": 0, "t": 3, "d": [63,292], "a": 1 }, + { "px": [832,448], "src": [128,0], "f": 0, "t": 2, "d": [63,293], "a": 1 }, + { "px": [896,448], "src": [64,0], "f": 0, "t": 1, "d": [63,294], "a": 1 }, + { "px": [960,448], "src": [192,0], "f": 0, "t": 3, "d": [63,295], "a": 1 }, + { "px": [1024,448], "src": [0,0], "f": 0, "t": 0, "d": [63,296], "a": 1 }, + { "px": [1408,448], "src": [64,0], "f": 0, "t": 1, "d": [63,302], "a": 1 }, + { "px": [1472,448], "src": [128,0], "f": 0, "t": 2, "d": [63,303], "a": 1 }, + { "px": [1536,448], "src": [192,0], "f": 0, "t": 3, "d": [63,304], "a": 1 }, + { "px": [1600,448], "src": [0,0], "f": 0, "t": 0, "d": [63,305], "a": 1 }, + { "px": [1664,448], "src": [192,0], "f": 0, "t": 3, "d": [63,306], "a": 1 }, + { "px": [1728,448], "src": [192,0], "f": 0, "t": 3, "d": [63,307], "a": 1 }, + { "px": [1792,448], "src": [192,0], "f": 0, "t": 3, "d": [63,308], "a": 1 }, + { "px": [1856,448], "src": [192,0], "f": 0, "t": 3, "d": [63,309], "a": 1 }, + { "px": [1920,448], "src": [128,0], "f": 0, "t": 2, "d": [63,310], "a": 1 }, + { "px": [1984,448], "src": [64,0], "f": 0, "t": 1, "d": [63,311], "a": 1 }, + { "px": [2048,448], "src": [128,0], "f": 0, "t": 2, "d": [63,312], "a": 1 }, + { "px": [2112,448], "src": [0,0], "f": 0, "t": 0, "d": [63,313], "a": 1 }, + { "px": [2176,448], "src": [128,0], "f": 0, "t": 2, "d": [63,314], "a": 1 }, + { "px": [2240,448], "src": [128,0], "f": 0, "t": 2, "d": [63,315], "a": 1 }, + { "px": [2304,448], "src": [192,0], "f": 0, "t": 3, "d": [63,316], "a": 1 }, + { "px": [2368,448], "src": [64,0], "f": 0, "t": 1, "d": [63,317], "a": 1 }, + { "px": [2432,448], "src": [192,0], "f": 0, "t": 3, "d": [63,318], "a": 1 }, + { "px": [64,512], "src": [192,0], "f": 0, "t": 3, "d": [63,321], "a": 1 }, + { "px": [128,512], "src": [64,0], "f": 0, "t": 1, "d": [63,322], "a": 1 }, + { "px": [192,512], "src": [128,0], "f": 0, "t": 2, "d": [63,323], "a": 1 }, + { "px": [256,512], "src": [128,0], "f": 0, "t": 2, "d": [63,324], "a": 1 }, + { "px": [320,512], "src": [0,0], "f": 0, "t": 0, "d": [63,325], "a": 1 }, + { "px": [384,512], "src": [192,0], "f": 0, "t": 3, "d": [63,326], "a": 1 }, + { "px": [448,512], "src": [0,0], "f": 0, "t": 0, "d": [63,327], "a": 1 }, + { "px": [512,512], "src": [192,0], "f": 0, "t": 3, "d": [63,328], "a": 1 }, + { "px": [576,512], "src": [128,0], "f": 0, "t": 2, "d": [63,329], "a": 1 }, + { "px": [640,512], "src": [0,0], "f": 0, "t": 0, "d": [63,330], "a": 1 }, + { "px": [704,512], "src": [0,0], "f": 0, "t": 0, "d": [63,331], "a": 1 }, + { "px": [768,512], "src": [64,0], "f": 0, "t": 1, "d": [63,332], "a": 1 }, + { "px": [832,512], "src": [64,0], "f": 0, "t": 1, "d": [63,333], "a": 1 }, + { "px": [896,512], "src": [192,0], "f": 0, "t": 3, "d": [63,334], "a": 1 }, + { "px": [960,512], "src": [128,0], "f": 0, "t": 2, "d": [63,335], "a": 1 }, + { "px": [1024,512], "src": [64,0], "f": 0, "t": 1, "d": [63,336], "a": 1 }, + { "px": [1088,512], "src": [128,0], "f": 0, "t": 2, "d": [63,337], "a": 1 }, + { "px": [1152,512], "src": [0,0], "f": 0, "t": 0, "d": [63,338], "a": 1 }, + { "px": [1216,512], "src": [0,0], "f": 0, "t": 0, "d": [63,339], "a": 1 }, + { "px": [1280,512], "src": [0,0], "f": 0, "t": 0, "d": [63,340], "a": 1 }, + { "px": [1344,512], "src": [64,0], "f": 0, "t": 1, "d": [63,341], "a": 1 }, + { "px": [1408,512], "src": [128,0], "f": 0, "t": 2, "d": [63,342], "a": 1 }, + { "px": [1472,512], "src": [192,0], "f": 0, "t": 3, "d": [63,343], "a": 1 }, + { "px": [1536,512], "src": [192,0], "f": 0, "t": 3, "d": [63,344], "a": 1 }, + { "px": [1600,512], "src": [0,0], "f": 0, "t": 0, "d": [63,345], "a": 1 }, + { "px": [1664,512], "src": [0,0], "f": 0, "t": 0, "d": [63,346], "a": 1 }, + { "px": [1792,512], "src": [64,0], "f": 0, "t": 1, "d": [63,348], "a": 1 }, + { "px": [1856,512], "src": [128,0], "f": 0, "t": 2, "d": [63,349], "a": 1 }, + { "px": [1920,512], "src": [0,0], "f": 0, "t": 0, "d": [63,350], "a": 1 }, + { "px": [1984,512], "src": [0,0], "f": 0, "t": 0, "d": [63,351], "a": 1 }, + { "px": [2048,512], "src": [64,0], "f": 0, "t": 1, "d": [63,352], "a": 1 }, + { "px": [2112,512], "src": [192,0], "f": 0, "t": 3, "d": [63,353], "a": 1 }, + { "px": [2176,512], "src": [0,0], "f": 0, "t": 0, "d": [63,354], "a": 1 }, + { "px": [2240,512], "src": [64,0], "f": 0, "t": 1, "d": [63,355], "a": 1 }, + { "px": [2304,512], "src": [128,0], "f": 0, "t": 2, "d": [63,356], "a": 1 }, + { "px": [2368,512], "src": [64,0], "f": 0, "t": 1, "d": [63,357], "a": 1 }, + { "px": [2432,512], "src": [64,0], "f": 0, "t": 1, "d": [63,358], "a": 1 }, + { "px": [64,576], "src": [64,0], "f": 0, "t": 1, "d": [63,361], "a": 1 }, + { "px": [128,576], "src": [0,0], "f": 0, "t": 0, "d": [63,362], "a": 1 }, + { "px": [192,576], "src": [192,0], "f": 0, "t": 3, "d": [63,363], "a": 1 }, + { "px": [256,576], "src": [0,0], "f": 0, "t": 0, "d": [63,364], "a": 1 }, + { "px": [320,576], "src": [128,0], "f": 0, "t": 2, "d": [63,365], "a": 1 }, + { "px": [384,576], "src": [0,0], "f": 0, "t": 0, "d": [63,366], "a": 1 }, + { "px": [448,576], "src": [192,0], "f": 0, "t": 3, "d": [63,367], "a": 1 }, + { "px": [512,576], "src": [128,0], "f": 0, "t": 2, "d": [63,368], "a": 1 }, + { "px": [576,576], "src": [192,0], "f": 0, "t": 3, "d": [63,369], "a": 1 }, + { "px": [640,576], "src": [64,0], "f": 0, "t": 1, "d": [63,370], "a": 1 }, + { "px": [704,576], "src": [0,0], "f": 0, "t": 0, "d": [63,371], "a": 1 }, + { "px": [768,576], "src": [0,0], "f": 0, "t": 0, "d": [63,372], "a": 1 }, + { "px": [832,576], "src": [128,0], "f": 0, "t": 2, "d": [63,373], "a": 1 }, + { "px": [896,576], "src": [0,0], "f": 0, "t": 0, "d": [63,374], "a": 1 }, + { "px": [960,576], "src": [192,0], "f": 0, "t": 3, "d": [63,375], "a": 1 }, + { "px": [1024,576], "src": [64,0], "f": 0, "t": 1, "d": [63,376], "a": 1 }, + { "px": [1088,576], "src": [192,0], "f": 0, "t": 3, "d": [63,377], "a": 1 }, + { "px": [1152,576], "src": [192,0], "f": 0, "t": 3, "d": [63,378], "a": 1 }, + { "px": [1216,576], "src": [0,0], "f": 0, "t": 0, "d": [63,379], "a": 1 }, + { "px": [1280,576], "src": [0,0], "f": 0, "t": 0, "d": [63,380], "a": 1 }, + { "px": [1344,576], "src": [0,0], "f": 0, "t": 0, "d": [63,381], "a": 1 }, + { "px": [1408,576], "src": [128,0], "f": 0, "t": 2, "d": [63,382], "a": 1 }, + { "px": [1472,576], "src": [128,0], "f": 0, "t": 2, "d": [63,383], "a": 1 }, + { "px": [1536,576], "src": [0,0], "f": 0, "t": 0, "d": [63,384], "a": 1 }, + { "px": [1600,576], "src": [0,0], "f": 0, "t": 0, "d": [63,385], "a": 1 }, + { "px": [1664,576], "src": [192,0], "f": 0, "t": 3, "d": [63,386], "a": 1 }, + { "px": [1728,576], "src": [64,0], "f": 0, "t": 1, "d": [63,387], "a": 1 }, + { "px": [1792,576], "src": [0,0], "f": 0, "t": 0, "d": [63,388], "a": 1 }, + { "px": [1856,576], "src": [64,0], "f": 0, "t": 1, "d": [63,389], "a": 1 }, + { "px": [1920,576], "src": [128,0], "f": 0, "t": 2, "d": [63,390], "a": 1 }, + { "px": [2048,576], "src": [0,0], "f": 0, "t": 0, "d": [63,392], "a": 1 }, + { "px": [2112,576], "src": [128,0], "f": 0, "t": 2, "d": [63,393], "a": 1 }, + { "px": [2176,576], "src": [64,0], "f": 0, "t": 1, "d": [63,394], "a": 1 }, + { "px": [2240,576], "src": [0,0], "f": 0, "t": 0, "d": [63,395], "a": 1 }, + { "px": [2304,576], "src": [128,0], "f": 0, "t": 2, "d": [63,396], "a": 1 }, + { "px": [2368,576], "src": [192,0], "f": 0, "t": 3, "d": [63,397], "a": 1 }, + { "px": [2432,576], "src": [0,0], "f": 0, "t": 0, "d": [63,398], "a": 1 }, + { "px": [64,640], "src": [64,0], "f": 0, "t": 1, "d": [63,401], "a": 1 }, + { "px": [128,640], "src": [64,0], "f": 0, "t": 1, "d": [63,402], "a": 1 }, + { "px": [192,640], "src": [0,0], "f": 0, "t": 0, "d": [63,403], "a": 1 }, + { "px": [256,640], "src": [0,0], "f": 0, "t": 0, "d": [63,404], "a": 1 }, + { "px": [320,640], "src": [64,0], "f": 0, "t": 1, "d": [63,405], "a": 1 }, + { "px": [384,640], "src": [192,0], "f": 0, "t": 3, "d": [63,406], "a": 1 }, + { "px": [448,640], "src": [128,0], "f": 0, "t": 2, "d": [63,407], "a": 1 }, + { "px": [512,640], "src": [64,0], "f": 0, "t": 1, "d": [63,408], "a": 1 }, + { "px": [576,640], "src": [192,0], "f": 0, "t": 3, "d": [63,409], "a": 1 }, + { "px": [640,640], "src": [64,0], "f": 0, "t": 1, "d": [63,410], "a": 1 }, + { "px": [704,640], "src": [128,0], "f": 0, "t": 2, "d": [63,411], "a": 1 }, + { "px": [768,640], "src": [64,0], "f": 0, "t": 1, "d": [63,412], "a": 1 }, + { "px": [832,640], "src": [0,0], "f": 0, "t": 0, "d": [63,413], "a": 1 }, + { "px": [896,640], "src": [0,0], "f": 0, "t": 0, "d": [63,414], "a": 1 }, + { "px": [960,640], "src": [192,0], "f": 0, "t": 3, "d": [63,415], "a": 1 }, + { "px": [1024,640], "src": [0,0], "f": 0, "t": 0, "d": [63,416], "a": 1 }, + { "px": [1088,640], "src": [0,0], "f": 0, "t": 0, "d": [63,417], "a": 1 }, + { "px": [1152,640], "src": [128,0], "f": 0, "t": 2, "d": [63,418], "a": 1 }, + { "px": [1216,640], "src": [0,0], "f": 0, "t": 0, "d": [63,419], "a": 1 }, + { "px": [1280,640], "src": [192,0], "f": 0, "t": 3, "d": [63,420], "a": 1 }, + { "px": [1344,640], "src": [64,0], "f": 0, "t": 1, "d": [63,421], "a": 1 }, + { "px": [1408,640], "src": [0,0], "f": 0, "t": 0, "d": [63,422], "a": 1 }, + { "px": [1472,640], "src": [128,0], "f": 0, "t": 2, "d": [63,423], "a": 1 }, + { "px": [1536,640], "src": [64,0], "f": 0, "t": 1, "d": [63,424], "a": 1 }, + { "px": [1600,640], "src": [64,0], "f": 0, "t": 1, "d": [63,425], "a": 1 }, + { "px": [1664,640], "src": [0,0], "f": 0, "t": 0, "d": [63,426], "a": 1 }, + { "px": [1728,640], "src": [128,0], "f": 0, "t": 2, "d": [63,427], "a": 1 }, + { "px": [1792,640], "src": [0,0], "f": 0, "t": 0, "d": [63,428], "a": 1 }, + { "px": [1856,640], "src": [192,0], "f": 0, "t": 3, "d": [63,429], "a": 1 }, + { "px": [1920,640], "src": [128,0], "f": 0, "t": 2, "d": [63,430], "a": 1 }, + { "px": [1984,640], "src": [0,0], "f": 0, "t": 0, "d": [63,431], "a": 1 }, + { "px": [2048,640], "src": [192,0], "f": 0, "t": 3, "d": [63,432], "a": 1 }, + { "px": [2112,640], "src": [192,0], "f": 0, "t": 3, "d": [63,433], "a": 1 }, + { "px": [2176,640], "src": [192,0], "f": 0, "t": 3, "d": [63,434], "a": 1 }, + { "px": [2240,640], "src": [128,0], "f": 0, "t": 2, "d": [63,435], "a": 1 }, + { "px": [2304,640], "src": [64,0], "f": 0, "t": 1, "d": [63,436], "a": 1 }, + { "px": [2368,640], "src": [0,0], "f": 0, "t": 0, "d": [63,437], "a": 1 }, + { "px": [2432,640], "src": [0,0], "f": 0, "t": 0, "d": [63,438], "a": 1 }, + { "px": [64,704], "src": [0,0], "f": 0, "t": 0, "d": [63,441], "a": 1 }, + { "px": [128,704], "src": [64,0], "f": 0, "t": 1, "d": [63,442], "a": 1 }, + { "px": [192,704], "src": [128,0], "f": 0, "t": 2, "d": [63,443], "a": 1 }, + { "px": [256,704], "src": [0,0], "f": 0, "t": 0, "d": [63,444], "a": 1 }, + { "px": [320,704], "src": [64,0], "f": 0, "t": 1, "d": [63,445], "a": 1 }, + { "px": [384,704], "src": [0,0], "f": 0, "t": 0, "d": [63,446], "a": 1 }, + { "px": [448,704], "src": [192,0], "f": 0, "t": 3, "d": [63,447], "a": 1 }, + { "px": [576,704], "src": [64,0], "f": 0, "t": 1, "d": [63,449], "a": 1 }, + { "px": [640,704], "src": [0,0], "f": 0, "t": 0, "d": [63,450], "a": 1 }, + { "px": [704,704], "src": [192,0], "f": 0, "t": 3, "d": [63,451], "a": 1 }, + { "px": [768,704], "src": [128,0], "f": 0, "t": 2, "d": [63,452], "a": 1 }, + { "px": [832,704], "src": [64,0], "f": 0, "t": 1, "d": [63,453], "a": 1 }, + { "px": [896,704], "src": [128,0], "f": 0, "t": 2, "d": [63,454], "a": 1 }, + { "px": [960,704], "src": [64,0], "f": 0, "t": 1, "d": [63,455], "a": 1 }, + { "px": [1024,704], "src": [192,0], "f": 0, "t": 3, "d": [63,456], "a": 1 }, + { "px": [1088,704], "src": [128,0], "f": 0, "t": 2, "d": [63,457], "a": 1 }, + { "px": [1152,704], "src": [64,0], "f": 0, "t": 1, "d": [63,458], "a": 1 }, + { "px": [1216,704], "src": [64,0], "f": 0, "t": 1, "d": [63,459], "a": 1 }, + { "px": [1280,704], "src": [0,0], "f": 0, "t": 0, "d": [63,460], "a": 1 }, + { "px": [1344,704], "src": [192,0], "f": 0, "t": 3, "d": [63,461], "a": 1 }, + { "px": [1408,704], "src": [192,0], "f": 0, "t": 3, "d": [63,462], "a": 1 }, + { "px": [1472,704], "src": [192,0], "f": 0, "t": 3, "d": [63,463], "a": 1 }, + { "px": [1536,704], "src": [0,0], "f": 0, "t": 0, "d": [63,464], "a": 1 }, + { "px": [1600,704], "src": [192,0], "f": 0, "t": 3, "d": [63,465], "a": 1 }, + { "px": [1664,704], "src": [64,0], "f": 0, "t": 1, "d": [63,466], "a": 1 }, + { "px": [1728,704], "src": [192,0], "f": 0, "t": 3, "d": [63,467], "a": 1 }, + { "px": [1792,704], "src": [128,0], "f": 0, "t": 2, "d": [63,468], "a": 1 }, + { "px": [1856,704], "src": [128,0], "f": 0, "t": 2, "d": [63,469], "a": 1 }, + { "px": [1920,704], "src": [0,0], "f": 0, "t": 0, "d": [63,470], "a": 1 }, + { "px": [1984,704], "src": [64,0], "f": 0, "t": 1, "d": [63,471], "a": 1 }, + { "px": [2048,704], "src": [192,0], "f": 0, "t": 3, "d": [63,472], "a": 1 }, + { "px": [2112,704], "src": [192,0], "f": 0, "t": 3, "d": [63,473], "a": 1 }, + { "px": [2176,704], "src": [64,0], "f": 0, "t": 1, "d": [63,474], "a": 1 }, + { "px": [2240,704], "src": [192,0], "f": 0, "t": 3, "d": [63,475], "a": 1 }, + { "px": [2304,704], "src": [64,0], "f": 0, "t": 1, "d": [63,476], "a": 1 }, + { "px": [2368,704], "src": [128,0], "f": 0, "t": 2, "d": [63,477], "a": 1 }, + { "px": [2432,704], "src": [64,0], "f": 0, "t": 1, "d": [63,478], "a": 1 }, + { "px": [64,768], "src": [0,0], "f": 0, "t": 0, "d": [63,481], "a": 1 }, + { "px": [128,768], "src": [0,0], "f": 0, "t": 0, "d": [63,482], "a": 1 }, + { "px": [192,768], "src": [64,0], "f": 0, "t": 1, "d": [63,483], "a": 1 }, + { "px": [256,768], "src": [0,0], "f": 0, "t": 0, "d": [63,484], "a": 1 }, + { "px": [320,768], "src": [192,0], "f": 0, "t": 3, "d": [63,485], "a": 1 }, + { "px": [384,768], "src": [128,0], "f": 0, "t": 2, "d": [63,486], "a": 1 }, + { "px": [448,768], "src": [128,0], "f": 0, "t": 2, "d": [63,487], "a": 1 }, + { "px": [512,768], "src": [64,0], "f": 0, "t": 1, "d": [63,488], "a": 1 }, + { "px": [576,768], "src": [0,0], "f": 0, "t": 0, "d": [63,489], "a": 1 }, + { "px": [640,768], "src": [128,0], "f": 0, "t": 2, "d": [63,490], "a": 1 }, + { "px": [704,768], "src": [0,0], "f": 0, "t": 0, "d": [63,491], "a": 1 }, + { "px": [768,768], "src": [192,0], "f": 0, "t": 3, "d": [63,492], "a": 1 }, + { "px": [832,768], "src": [64,0], "f": 0, "t": 1, "d": [63,493], "a": 1 }, + { "px": [896,768], "src": [64,0], "f": 0, "t": 1, "d": [63,494], "a": 1 }, + { "px": [960,768], "src": [128,0], "f": 0, "t": 2, "d": [63,495], "a": 1 }, + { "px": [1024,768], "src": [0,0], "f": 0, "t": 0, "d": [63,496], "a": 1 }, + { "px": [1088,768], "src": [128,0], "f": 0, "t": 2, "d": [63,497], "a": 1 }, + { "px": [1152,768], "src": [128,0], "f": 0, "t": 2, "d": [63,498], "a": 1 }, + { "px": [1216,768], "src": [192,0], "f": 0, "t": 3, "d": [63,499], "a": 1 }, + { "px": [1280,768], "src": [0,0], "f": 0, "t": 0, "d": [63,500], "a": 1 }, + { "px": [1344,768], "src": [128,0], "f": 0, "t": 2, "d": [63,501], "a": 1 }, + { "px": [1472,768], "src": [192,0], "f": 0, "t": 3, "d": [63,503], "a": 1 }, + { "px": [1536,768], "src": [192,0], "f": 0, "t": 3, "d": [63,504], "a": 1 }, + { "px": [1728,768], "src": [0,0], "f": 0, "t": 0, "d": [63,507], "a": 1 }, + { "px": [1792,768], "src": [0,0], "f": 0, "t": 0, "d": [63,508], "a": 1 }, + { "px": [1856,768], "src": [64,0], "f": 0, "t": 1, "d": [63,509], "a": 1 }, + { "px": [1920,768], "src": [0,0], "f": 0, "t": 0, "d": [63,510], "a": 1 }, + { "px": [1984,768], "src": [0,0], "f": 0, "t": 0, "d": [63,511], "a": 1 }, + { "px": [2048,768], "src": [0,0], "f": 0, "t": 0, "d": [63,512], "a": 1 }, + { "px": [2112,768], "src": [128,0], "f": 0, "t": 2, "d": [63,513], "a": 1 }, + { "px": [2176,768], "src": [192,0], "f": 0, "t": 3, "d": [63,514], "a": 1 }, + { "px": [2240,768], "src": [64,0], "f": 0, "t": 1, "d": [63,515], "a": 1 }, + { "px": [2304,768], "src": [0,0], "f": 0, "t": 0, "d": [63,516], "a": 1 }, + { "px": [2368,768], "src": [192,0], "f": 0, "t": 3, "d": [63,517], "a": 1 }, + { "px": [2432,768], "src": [0,0], "f": 0, "t": 0, "d": [63,518], "a": 1 }, + { "px": [64,832], "src": [64,0], "f": 0, "t": 1, "d": [63,521], "a": 1 }, + { "px": [128,832], "src": [128,0], "f": 0, "t": 2, "d": [63,522], "a": 1 }, + { "px": [192,832], "src": [0,0], "f": 0, "t": 0, "d": [63,523], "a": 1 }, + { "px": [256,832], "src": [128,0], "f": 0, "t": 2, "d": [63,524], "a": 1 }, + { "px": [320,832], "src": [0,0], "f": 0, "t": 0, "d": [63,525], "a": 1 }, + { "px": [384,832], "src": [192,0], "f": 0, "t": 3, "d": [63,526], "a": 1 }, + { "px": [448,832], "src": [0,0], "f": 0, "t": 0, "d": [63,527], "a": 1 }, + { "px": [512,832], "src": [0,0], "f": 0, "t": 0, "d": [63,528], "a": 1 }, + { "px": [576,832], "src": [192,0], "f": 0, "t": 3, "d": [63,529], "a": 1 }, + { "px": [640,832], "src": [192,0], "f": 0, "t": 3, "d": [63,530], "a": 1 }, + { "px": [704,832], "src": [192,0], "f": 0, "t": 3, "d": [63,531], "a": 1 }, + { "px": [768,832], "src": [0,0], "f": 0, "t": 0, "d": [63,532], "a": 1 }, + { "px": [832,832], "src": [192,0], "f": 0, "t": 3, "d": [63,533], "a": 1 }, + { "px": [896,832], "src": [0,0], "f": 0, "t": 0, "d": [63,534], "a": 1 }, + { "px": [960,832], "src": [192,0], "f": 0, "t": 3, "d": [63,535], "a": 1 }, + { "px": [1024,832], "src": [128,0], "f": 0, "t": 2, "d": [63,536], "a": 1 }, + { "px": [1088,832], "src": [0,0], "f": 0, "t": 0, "d": [63,537], "a": 1 }, + { "px": [1152,832], "src": [128,0], "f": 0, "t": 2, "d": [63,538], "a": 1 }, + { "px": [1216,832], "src": [64,0], "f": 0, "t": 1, "d": [63,539], "a": 1 }, + { "px": [1280,832], "src": [0,0], "f": 0, "t": 0, "d": [63,540], "a": 1 }, + { "px": [1344,832], "src": [64,0], "f": 0, "t": 1, "d": [63,541], "a": 1 }, + { "px": [1408,832], "src": [64,0], "f": 0, "t": 1, "d": [63,542], "a": 1 }, + { "px": [1472,832], "src": [128,0], "f": 0, "t": 2, "d": [63,543], "a": 1 }, + { "px": [1536,832], "src": [64,0], "f": 0, "t": 1, "d": [63,544], "a": 1 }, + { "px": [1600,832], "src": [192,0], "f": 0, "t": 3, "d": [63,545], "a": 1 }, + { "px": [1664,832], "src": [64,0], "f": 0, "t": 1, "d": [63,546], "a": 1 }, + { "px": [1728,832], "src": [0,0], "f": 0, "t": 0, "d": [63,547], "a": 1 }, + { "px": [1792,832], "src": [64,0], "f": 0, "t": 1, "d": [63,548], "a": 1 }, + { "px": [1856,832], "src": [192,0], "f": 0, "t": 3, "d": [63,549], "a": 1 }, + { "px": [1920,832], "src": [128,0], "f": 0, "t": 2, "d": [63,550], "a": 1 }, + { "px": [1984,832], "src": [0,0], "f": 0, "t": 0, "d": [63,551], "a": 1 }, + { "px": [2048,832], "src": [0,0], "f": 0, "t": 0, "d": [63,552], "a": 1 }, + { "px": [2112,832], "src": [192,0], "f": 0, "t": 3, "d": [63,553], "a": 1 }, + { "px": [2176,832], "src": [128,0], "f": 0, "t": 2, "d": [63,554], "a": 1 }, + { "px": [2240,832], "src": [128,0], "f": 0, "t": 2, "d": [63,555], "a": 1 }, + { "px": [2304,832], "src": [128,0], "f": 0, "t": 2, "d": [63,556], "a": 1 }, + { "px": [2368,832], "src": [64,0], "f": 0, "t": 1, "d": [63,557], "a": 1 }, + { "px": [2432,832], "src": [192,0], "f": 0, "t": 3, "d": [63,558], "a": 1 }, + { "px": [64,896], "src": [0,0], "f": 0, "t": 0, "d": [63,561], "a": 1 }, + { "px": [128,896], "src": [128,0], "f": 0, "t": 2, "d": [63,562], "a": 1 }, + { "px": [192,896], "src": [64,0], "f": 0, "t": 1, "d": [63,563], "a": 1 }, + { "px": [256,896], "src": [128,0], "f": 0, "t": 2, "d": [63,564], "a": 1 }, + { "px": [320,896], "src": [64,0], "f": 0, "t": 1, "d": [63,565], "a": 1 }, + { "px": [384,896], "src": [64,0], "f": 0, "t": 1, "d": [63,566], "a": 1 }, + { "px": [448,896], "src": [64,0], "f": 0, "t": 1, "d": [63,567], "a": 1 }, + { "px": [512,896], "src": [192,0], "f": 0, "t": 3, "d": [63,568], "a": 1 }, + { "px": [576,896], "src": [192,0], "f": 0, "t": 3, "d": [63,569], "a": 1 }, + { "px": [640,896], "src": [0,0], "f": 0, "t": 0, "d": [63,570], "a": 1 }, + { "px": [704,896], "src": [192,0], "f": 0, "t": 3, "d": [63,571], "a": 1 }, + { "px": [768,896], "src": [192,0], "f": 0, "t": 3, "d": [63,572], "a": 1 }, + { "px": [832,896], "src": [192,0], "f": 0, "t": 3, "d": [63,573], "a": 1 }, + { "px": [896,896], "src": [128,0], "f": 0, "t": 2, "d": [63,574], "a": 1 }, + { "px": [960,896], "src": [0,0], "f": 0, "t": 0, "d": [63,575], "a": 1 }, + { "px": [1024,896], "src": [128,0], "f": 0, "t": 2, "d": [63,576], "a": 1 }, + { "px": [1088,896], "src": [192,0], "f": 0, "t": 3, "d": [63,577], "a": 1 }, + { "px": [1152,896], "src": [0,0], "f": 0, "t": 0, "d": [63,578], "a": 1 }, + { "px": [1216,896], "src": [192,0], "f": 0, "t": 3, "d": [63,579], "a": 1 }, + { "px": [1280,896], "src": [192,0], "f": 0, "t": 3, "d": [63,580], "a": 1 }, + { "px": [1344,896], "src": [0,0], "f": 0, "t": 0, "d": [63,581], "a": 1 }, + { "px": [1408,896], "src": [128,0], "f": 0, "t": 2, "d": [63,582], "a": 1 }, + { "px": [1472,896], "src": [192,0], "f": 0, "t": 3, "d": [63,583], "a": 1 }, + { "px": [1536,896], "src": [192,0], "f": 0, "t": 3, "d": [63,584], "a": 1 }, + { "px": [1600,896], "src": [64,0], "f": 0, "t": 1, "d": [63,585], "a": 1 }, + { "px": [1664,896], "src": [128,0], "f": 0, "t": 2, "d": [63,586], "a": 1 }, + { "px": [1728,896], "src": [128,0], "f": 0, "t": 2, "d": [63,587], "a": 1 }, + { "px": [1792,896], "src": [192,0], "f": 0, "t": 3, "d": [63,588], "a": 1 }, + { "px": [1856,896], "src": [0,0], "f": 0, "t": 0, "d": [63,589], "a": 1 }, + { "px": [1920,896], "src": [192,0], "f": 0, "t": 3, "d": [63,590], "a": 1 }, + { "px": [1984,896], "src": [64,0], "f": 0, "t": 1, "d": [63,591], "a": 1 }, + { "px": [2048,896], "src": [64,0], "f": 0, "t": 1, "d": [63,592], "a": 1 }, + { "px": [2112,896], "src": [192,0], "f": 0, "t": 3, "d": [63,593], "a": 1 }, + { "px": [2176,896], "src": [0,0], "f": 0, "t": 0, "d": [63,594], "a": 1 }, + { "px": [2240,896], "src": [0,0], "f": 0, "t": 0, "d": [63,595], "a": 1 }, + { "px": [2304,896], "src": [192,0], "f": 0, "t": 3, "d": [63,596], "a": 1 }, + { "px": [2368,896], "src": [128,0], "f": 0, "t": 2, "d": [63,597], "a": 1 }, + { "px": [2432,896], "src": [64,0], "f": 0, "t": 1, "d": [63,598], "a": 1 }, + { "px": [64,960], "src": [192,0], "f": 0, "t": 3, "d": [63,601], "a": 1 }, + { "px": [128,960], "src": [0,0], "f": 0, "t": 0, "d": [63,602], "a": 1 }, + { "px": [192,960], "src": [0,0], "f": 0, "t": 0, "d": [63,603], "a": 1 }, + { "px": [256,960], "src": [64,0], "f": 0, "t": 1, "d": [63,604], "a": 1 }, + { "px": [320,960], "src": [192,0], "f": 0, "t": 3, "d": [63,605], "a": 1 }, + { "px": [384,960], "src": [0,0], "f": 0, "t": 0, "d": [63,606], "a": 1 }, + { "px": [448,960], "src": [0,0], "f": 0, "t": 0, "d": [63,607], "a": 1 }, + { "px": [512,960], "src": [128,0], "f": 0, "t": 2, "d": [63,608], "a": 1 }, + { "px": [576,960], "src": [128,0], "f": 0, "t": 2, "d": [63,609], "a": 1 }, + { "px": [640,960], "src": [192,0], "f": 0, "t": 3, "d": [63,610], "a": 1 }, + { "px": [704,960], "src": [192,0], "f": 0, "t": 3, "d": [63,611], "a": 1 }, + { "px": [768,960], "src": [0,0], "f": 0, "t": 0, "d": [63,612], "a": 1 }, + { "px": [832,960], "src": [0,0], "f": 0, "t": 0, "d": [63,613], "a": 1 }, + { "px": [896,960], "src": [192,0], "f": 0, "t": 3, "d": [63,614], "a": 1 }, + { "px": [960,960], "src": [0,0], "f": 0, "t": 0, "d": [63,615], "a": 1 }, + { "px": [1024,960], "src": [192,0], "f": 0, "t": 3, "d": [63,616], "a": 1 }, + { "px": [1088,960], "src": [64,0], "f": 0, "t": 1, "d": [63,617], "a": 1 }, + { "px": [1152,960], "src": [128,0], "f": 0, "t": 2, "d": [63,618], "a": 1 }, + { "px": [1216,960], "src": [64,0], "f": 0, "t": 1, "d": [63,619], "a": 1 }, + { "px": [1280,960], "src": [0,0], "f": 0, "t": 0, "d": [63,620], "a": 1 }, + { "px": [1344,960], "src": [64,0], "f": 0, "t": 1, "d": [63,621], "a": 1 }, + { "px": [1408,960], "src": [128,0], "f": 0, "t": 2, "d": [63,622], "a": 1 }, + { "px": [1472,960], "src": [192,0], "f": 0, "t": 3, "d": [63,623], "a": 1 }, + { "px": [1536,960], "src": [64,0], "f": 0, "t": 1, "d": [63,624], "a": 1 }, + { "px": [1600,960], "src": [64,0], "f": 0, "t": 1, "d": [63,625], "a": 1 }, + { "px": [1664,960], "src": [128,0], "f": 0, "t": 2, "d": [63,626], "a": 1 }, + { "px": [1728,960], "src": [128,0], "f": 0, "t": 2, "d": [63,627], "a": 1 }, + { "px": [1792,960], "src": [0,0], "f": 0, "t": 0, "d": [63,628], "a": 1 }, + { "px": [1856,960], "src": [192,0], "f": 0, "t": 3, "d": [63,629], "a": 1 }, + { "px": [1920,960], "src": [64,0], "f": 0, "t": 1, "d": [63,630], "a": 1 }, + { "px": [1984,960], "src": [0,0], "f": 0, "t": 0, "d": [63,631], "a": 1 }, + { "px": [2048,960], "src": [0,0], "f": 0, "t": 0, "d": [63,632], "a": 1 }, + { "px": [2112,960], "src": [64,0], "f": 0, "t": 1, "d": [63,633], "a": 1 }, + { "px": [2176,960], "src": [192,0], "f": 0, "t": 3, "d": [63,634], "a": 1 }, + { "px": [2240,960], "src": [0,0], "f": 0, "t": 0, "d": [63,635], "a": 1 }, + { "px": [2304,960], "src": [64,0], "f": 0, "t": 1, "d": [63,636], "a": 1 }, + { "px": [2368,960], "src": [128,0], "f": 0, "t": 2, "d": [63,637], "a": 1 }, + { "px": [2432,960], "src": [64,0], "f": 0, "t": 1, "d": [63,638], "a": 1 }, + { "px": [320,1024], "src": [128,0], "f": 0, "t": 2, "d": [63,645], "a": 1 }, + { "px": [384,1024], "src": [128,0], "f": 0, "t": 2, "d": [63,646], "a": 1 }, + { "px": [448,1024], "src": [64,0], "f": 0, "t": 1, "d": [63,647], "a": 1 }, + { "px": [512,1024], "src": [128,0], "f": 0, "t": 2, "d": [63,648], "a": 1 }, + { "px": [1984,1024], "src": [64,0], "f": 0, "t": 1, "d": [63,671], "a": 1 }, + { "px": [2048,1024], "src": [128,0], "f": 0, "t": 2, "d": [63,672], "a": 1 }, + { "px": [64,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,681], "a": 1 }, + { "px": [128,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,682], "a": 1 }, + { "px": [192,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,683], "a": 1 }, + { "px": [256,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,684], "a": 1 }, + { "px": [320,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,685], "a": 1 }, + { "px": [384,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,686], "a": 1 }, + { "px": [448,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,687], "a": 1 }, + { "px": [512,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,688], "a": 1 }, + { "px": [576,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,689], "a": 1 }, + { "px": [640,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,690], "a": 1 }, + { "px": [704,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,691], "a": 1 }, + { "px": [768,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,692], "a": 1 }, + { "px": [832,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,693], "a": 1 }, + { "px": [896,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,694], "a": 1 }, + { "px": [960,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,695], "a": 1 }, + { "px": [1024,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,696], "a": 1 }, + { "px": [1088,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,697], "a": 1 }, + { "px": [1152,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,698], "a": 1 }, + { "px": [1216,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,699], "a": 1 }, + { "px": [1280,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,700], "a": 1 }, + { "px": [1344,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,701], "a": 1 }, + { "px": [1408,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,702], "a": 1 }, + { "px": [1472,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,703], "a": 1 }, + { "px": [1536,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,704], "a": 1 }, + { "px": [1600,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,705], "a": 1 }, + { "px": [1664,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,706], "a": 1 }, + { "px": [1728,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,707], "a": 1 }, + { "px": [1792,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,708], "a": 1 }, + { "px": [1856,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,709], "a": 1 }, + { "px": [1920,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,710], "a": 1 }, + { "px": [1984,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,711], "a": 1 }, + { "px": [2048,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,712], "a": 1 }, + { "px": [2112,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,713], "a": 1 }, + { "px": [2176,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,714], "a": 1 }, + { "px": [2240,1088], "src": [640,0], "f": 0, "t": 10, "d": [67,715], "a": 1 }, + { "px": [128,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,722], "a": 1 }, + { "px": [192,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,723], "a": 1 }, + { "px": [256,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,724], "a": 1 }, + { "px": [320,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,725], "a": 1 }, + { "px": [384,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,726], "a": 1 }, + { "px": [448,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,727], "a": 1 }, + { "px": [512,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,728], "a": 1 }, + { "px": [576,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,729], "a": 1 }, + { "px": [640,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,730], "a": 1 }, + { "px": [704,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,731], "a": 1 }, + { "px": [768,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,732], "a": 1 }, + { "px": [832,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,733], "a": 1 }, + { "px": [896,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,734], "a": 1 }, + { "px": [960,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,735], "a": 1 }, + { "px": [1024,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,736], "a": 1 }, + { "px": [1088,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,737], "a": 1 }, + { "px": [1152,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,738], "a": 1 }, + { "px": [1216,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,739], "a": 1 }, + { "px": [1280,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,740], "a": 1 }, + { "px": [1344,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,741], "a": 1 }, + { "px": [1408,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,742], "a": 1 }, + { "px": [1472,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,743], "a": 1 }, + { "px": [1536,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,744], "a": 1 }, + { "px": [1600,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,745], "a": 1 }, + { "px": [1664,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,746], "a": 1 }, + { "px": [1728,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,747], "a": 1 }, + { "px": [1792,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,748], "a": 1 }, + { "px": [1856,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,749], "a": 1 }, + { "px": [1920,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,750], "a": 1 }, + { "px": [1984,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,751], "a": 1 }, + { "px": [2048,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,752], "a": 1 }, + { "px": [2112,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,753], "a": 1 }, + { "px": [2176,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,754], "a": 1 }, + { "px": [2240,1152], "src": [640,0], "f": 0, "t": 10, "d": [67,755], "a": 1 }, + { "px": [64,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,761], "a": 1 }, + { "px": [128,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,762], "a": 1 }, + { "px": [192,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,763], "a": 1 }, + { "px": [256,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,764], "a": 1 }, + { "px": [320,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,765], "a": 1 }, + { "px": [576,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,769], "a": 1 }, + { "px": [640,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,770], "a": 1 }, + { "px": [704,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,771], "a": 1 }, + { "px": [768,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,772], "a": 1 }, + { "px": [832,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,773], "a": 1 }, + { "px": [896,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,774], "a": 1 }, + { "px": [960,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,775], "a": 1 }, + { "px": [1024,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,776], "a": 1 }, + { "px": [1408,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,782], "a": 1 }, + { "px": [1472,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,783], "a": 1 }, + { "px": [1536,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,784], "a": 1 }, + { "px": [1600,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,785], "a": 1 }, + { "px": [1664,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,786], "a": 1 }, + { "px": [1728,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,787], "a": 1 }, + { "px": [1792,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,788], "a": 1 }, + { "px": [1856,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,789], "a": 1 }, + { "px": [1920,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,790], "a": 1 }, + { "px": [1984,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,791], "a": 1 }, + { "px": [2048,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,792], "a": 1 }, + { "px": [2112,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,793], "a": 1 }, + { "px": [2176,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,794], "a": 1 }, + { "px": [2240,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,795], "a": 1 }, + { "px": [2304,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,796], "a": 1 }, + { "px": [2368,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,797], "a": 1 }, + { "px": [2432,1216], "src": [640,0], "f": 0, "t": 10, "d": [67,798], "a": 1 }, + { "px": [64,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,801], "a": 1 }, + { "px": [128,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,802], "a": 1 }, + { "px": [192,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,803], "a": 1 }, + { "px": [576,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,809], "a": 1 }, + { "px": [640,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,810], "a": 1 }, + { "px": [704,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,811], "a": 1 }, + { "px": [768,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,812], "a": 1 }, + { "px": [832,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,813], "a": 1 }, + { "px": [896,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,814], "a": 1 }, + { "px": [960,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,815], "a": 1 }, + { "px": [1024,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,816], "a": 1 }, + { "px": [1408,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,822], "a": 1 }, + { "px": [1472,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,823], "a": 1 }, + { "px": [1536,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,824], "a": 1 }, + { "px": [1600,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,825], "a": 1 }, + { "px": [1664,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,826], "a": 1 }, + { "px": [1728,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,827], "a": 1 }, + { "px": [1792,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,828], "a": 1 }, + { "px": [1920,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,830], "a": 1 }, + { "px": [1984,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,831], "a": 1 }, + { "px": [2048,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,832], "a": 1 }, + { "px": [2112,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,833], "a": 1 }, + { "px": [2176,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,834], "a": 1 }, + { "px": [2240,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,835], "a": 1 }, + { "px": [2304,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,836], "a": 1 }, + { "px": [2368,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,837], "a": 1 }, + { "px": [2432,1280], "src": [640,0], "f": 0, "t": 10, "d": [67,838], "a": 1 }, + { "px": [64,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,841], "a": 1 }, + { "px": [128,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,842], "a": 1 }, + { "px": [192,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,843], "a": 1 }, + { "px": [448,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,847], "a": 1 }, + { "px": [576,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,849], "a": 1 }, + { "px": [640,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,850], "a": 1 }, + { "px": [704,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,851], "a": 1 }, + { "px": [768,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,852], "a": 1 }, + { "px": [832,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,853], "a": 1 }, + { "px": [896,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,854], "a": 1 }, + { "px": [960,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,855], "a": 1 }, + { "px": [1024,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,856], "a": 1 }, + { "px": [1408,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,862], "a": 1 }, + { "px": [1472,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,863], "a": 1 }, + { "px": [1536,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,864], "a": 1 }, + { "px": [1600,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,865], "a": 1 }, + { "px": [1664,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,866], "a": 1 }, + { "px": [1728,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,867], "a": 1 }, + { "px": [1792,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,868], "a": 1 }, + { "px": [1920,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,870], "a": 1 }, + { "px": [1984,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,871], "a": 1 }, + { "px": [2048,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,872], "a": 1 }, + { "px": [2112,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,873], "a": 1 }, + { "px": [2176,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,874], "a": 1 }, + { "px": [2240,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,875], "a": 1 }, + { "px": [2304,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,876], "a": 1 }, + { "px": [2368,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,877], "a": 1 }, + { "px": [2432,1344], "src": [640,0], "f": 0, "t": 10, "d": [67,878], "a": 1 }, + { "px": [448,1408], "src": [640,0], "f": 0, "t": 10, "d": [67,887], "a": 1 }, + { "px": [1088,1280], "src": [640,0], "f": 0, "t": 10, "d": [70,817], "a": 1 }, + { "px": [256,1344], "src": [640,0], "f": 0, "t": 10, "d": [70,844], "a": 1 }, + { "px": [1088,1344], "src": [640,0], "f": 0, "t": 10, "d": [70,857], "a": 1 }, + { "px": [1344,1280], "src": [640,0], "f": 0, "t": 10, "d": [71,821], "a": 1 }, + { "px": [1344,1344], "src": [640,0], "f": 0, "t": 10, "d": [71,861], "a": 1 }, + { "px": [1856,1344], "src": [640,0], "f": 0, "t": 10, "d": [71,869], "a": 1 }, + { "px": [384,1216], "src": [640,0], "f": 0, "t": 10, "d": [73,766], "a": 1 }, + { "px": [448,1216], "src": [640,0], "f": 0, "t": 10, "d": [73,767], "a": 1 }, + { "px": [512,1216], "src": [640,0], "f": 0, "t": 10, "d": [73,768], "a": 1 }, + { "px": [1088,1216], "src": [640,0], "f": 0, "t": 10, "d": [73,777], "a": 1 }, + { "px": [1344,1216], "src": [640,0], "f": 0, "t": 10, "d": [73,781], "a": 1 }, + { "px": [256,1280], "src": [640,0], "f": 0, "t": 10, "d": [73,804], "a": 1 }, + { "px": [320,1280], "src": [640,0], "f": 0, "t": 10, "d": [73,805], "a": 1 }, + { "px": [1856,1280], "src": [640,0], "f": 0, "t": 10, "d": [73,829], "a": 1 }, + { "px": [64,1152], "src": [640,0], "f": 0, "t": 10, "d": [74,721], "a": 1 }, + { "px": [192,128], "src": [192,0], "f": 0, "t": 3, "d": [75,83], "a": 1 }, + { "px": [960,128], "src": [0,0], "f": 0, "t": 0, "d": [75,95], "a": 1 }, + { "px": [448,384], "src": [64,0], "f": 0, "t": 1, "d": [75,247], "a": 1 }, + { "px": [512,384], "src": [0,0], "f": 0, "t": 0, "d": [75,248], "a": 1 }, + { "px": [1728,512], "src": [64,0], "f": 0, "t": 1, "d": [75,347], "a": 1 }, + { "px": [1408,768], "src": [192,0], "f": 0, "t": 3, "d": [75,502], "a": 1 } + ], + "seed": 9289703, + "overrideTilesetUid": null, + "gridTiles": [], + "entityInstances": [] + } + ], + "__neighbours": [] + } + ], + "worlds": [], + "dummyWorldIid": "24522800-d380-11f0-9ae1-a31d61a14ed0" +} \ No newline at end of file diff --git a/py/assets/pixel_platformer/backgrounds.png b/py/assets/pixel_platformer/backgrounds.png new file mode 100644 index 0000000..821ddfc Binary files /dev/null and b/py/assets/pixel_platformer/backgrounds.png differ diff --git a/py/assets/pixel_platformer/characters.png b/py/assets/pixel_platformer/characters.png new file mode 100644 index 0000000..ae1f329 Binary files /dev/null and b/py/assets/pixel_platformer/characters.png differ diff --git a/py/assets/pixel_platformer/characters/blue_1.png b/py/assets/pixel_platformer/characters/blue_1.png new file mode 100644 index 0000000..1acdd37 Binary files /dev/null and b/py/assets/pixel_platformer/characters/blue_1.png differ diff --git a/py/assets/pixel_platformer/characters/blue_2.png b/py/assets/pixel_platformer/characters/blue_2.png new file mode 100644 index 0000000..691f497 Binary files /dev/null and b/py/assets/pixel_platformer/characters/blue_2.png differ diff --git a/py/assets/pixel_platformer/characters/green_1.png b/py/assets/pixel_platformer/characters/green_1.png new file mode 100644 index 0000000..c6d7d7f Binary files /dev/null and b/py/assets/pixel_platformer/characters/green_1.png differ diff --git a/py/assets/pixel_platformer/characters/green_2.png b/py/assets/pixel_platformer/characters/green_2.png new file mode 100644 index 0000000..a6c81e0 Binary files /dev/null and b/py/assets/pixel_platformer/characters/green_2.png differ diff --git a/py/assets/pixel_platformer/characters/pink_1.png b/py/assets/pixel_platformer/characters/pink_1.png new file mode 100644 index 0000000..99d7f63 Binary files /dev/null and b/py/assets/pixel_platformer/characters/pink_1.png differ diff --git a/py/assets/pixel_platformer/characters/pink_2.png b/py/assets/pixel_platformer/characters/pink_2.png new file mode 100644 index 0000000..5c95202 Binary files /dev/null and b/py/assets/pixel_platformer/characters/pink_2.png differ diff --git a/py/assets/pixel_platformer/characters/yellow_1.png b/py/assets/pixel_platformer/characters/yellow_1.png new file mode 100644 index 0000000..6b177a0 Binary files /dev/null and b/py/assets/pixel_platformer/characters/yellow_1.png differ diff --git a/py/assets/pixel_platformer/characters/yellow_2.png b/py/assets/pixel_platformer/characters/yellow_2.png new file mode 100644 index 0000000..607b9a8 Binary files /dev/null and b/py/assets/pixel_platformer/characters/yellow_2.png differ diff --git a/py/assets/pixel_platformer/enemies/bat_1.png b/py/assets/pixel_platformer/enemies/bat_1.png new file mode 100644 index 0000000..8c8e276 Binary files /dev/null and b/py/assets/pixel_platformer/enemies/bat_1.png differ diff --git a/py/assets/pixel_platformer/enemies/bat_2.png b/py/assets/pixel_platformer/enemies/bat_2.png new file mode 100644 index 0000000..d4ac52d Binary files /dev/null and b/py/assets/pixel_platformer/enemies/bat_2.png differ diff --git a/py/assets/pixel_platformer/enemies/bat_3.png b/py/assets/pixel_platformer/enemies/bat_3.png new file mode 100644 index 0000000..7372c35 Binary files /dev/null and b/py/assets/pixel_platformer/enemies/bat_3.png differ diff --git a/py/assets/pixel_platformer/enemies/block_head_1.png b/py/assets/pixel_platformer/enemies/block_head_1.png new file mode 100644 index 0000000..33182eb Binary files /dev/null and b/py/assets/pixel_platformer/enemies/block_head_1.png differ diff --git a/py/assets/pixel_platformer/enemies/block_head_2.png b/py/assets/pixel_platformer/enemies/block_head_2.png new file mode 100644 index 0000000..a57c0ce Binary files /dev/null and b/py/assets/pixel_platformer/enemies/block_head_2.png differ diff --git a/py/assets/pixel_platformer/enemies/drill_head_1.png b/py/assets/pixel_platformer/enemies/drill_head_1.png new file mode 100644 index 0000000..81a5921 Binary files /dev/null and b/py/assets/pixel_platformer/enemies/drill_head_1.png differ diff --git a/py/assets/pixel_platformer/enemies/drill_head_2.png b/py/assets/pixel_platformer/enemies/drill_head_2.png new file mode 100644 index 0000000..37357d6 Binary files /dev/null and b/py/assets/pixel_platformer/enemies/drill_head_2.png differ diff --git a/py/assets/pixel_platformer/items/coin_1.png b/py/assets/pixel_platformer/items/coin_1.png new file mode 100644 index 0000000..25b9044 Binary files /dev/null and b/py/assets/pixel_platformer/items/coin_1.png differ diff --git a/py/assets/pixel_platformer/items/coin_2.png b/py/assets/pixel_platformer/items/coin_2.png new file mode 100644 index 0000000..d563c89 Binary files /dev/null and b/py/assets/pixel_platformer/items/coin_2.png differ diff --git a/py/assets/pixel_platformer/tilemap.png b/py/assets/pixel_platformer/tilemap.png new file mode 100644 index 0000000..901a785 Binary files /dev/null and b/py/assets/pixel_platformer/tilemap.png differ diff --git a/py/assets/sounds/coin.wav b/py/assets/sounds/coin.wav new file mode 100644 index 0000000..bd4835d Binary files /dev/null and b/py/assets/sounds/coin.wav differ diff --git a/py/assets/sounds/die.wav b/py/assets/sounds/die.wav new file mode 100644 index 0000000..0ead6b5 Binary files /dev/null and b/py/assets/sounds/die.wav differ diff --git a/py/assets/sounds/hit.wav b/py/assets/sounds/hit.wav new file mode 100644 index 0000000..85531dd Binary files /dev/null and b/py/assets/sounds/hit.wav differ diff --git a/py/assets/sounds/jump.wav b/py/assets/sounds/jump.wav new file mode 100644 index 0000000..25c80bf Binary files /dev/null and b/py/assets/sounds/jump.wav differ diff --git a/py/assets/sounds/shoot.wav b/py/assets/sounds/shoot.wav new file mode 100644 index 0000000..d3a4b9c Binary files /dev/null and b/py/assets/sounds/shoot.wav differ diff --git a/py/assets/sunnyland/back.png b/py/assets/sunnyland/back.png new file mode 100644 index 0000000..5b9bfd8 Binary files /dev/null and b/py/assets/sunnyland/back.png differ diff --git a/py/assets/sunnyland/bunny/idle-1.png b/py/assets/sunnyland/bunny/idle-1.png new file mode 100644 index 0000000..82b4865 Binary files /dev/null and b/py/assets/sunnyland/bunny/idle-1.png differ diff --git a/py/assets/sunnyland/bunny/idle-2.png b/py/assets/sunnyland/bunny/idle-2.png new file mode 100644 index 0000000..ac2b6e8 Binary files /dev/null and b/py/assets/sunnyland/bunny/idle-2.png differ diff --git a/py/assets/sunnyland/bunny/idle-3.png b/py/assets/sunnyland/bunny/idle-3.png new file mode 100644 index 0000000..cea7dc0 Binary files /dev/null and b/py/assets/sunnyland/bunny/idle-3.png differ diff --git a/py/assets/sunnyland/bunny/idle-4.png b/py/assets/sunnyland/bunny/idle-4.png new file mode 100644 index 0000000..c37607c Binary files /dev/null and b/py/assets/sunnyland/bunny/idle-4.png differ diff --git a/py/assets/sunnyland/bunny/jump-1.png b/py/assets/sunnyland/bunny/jump-1.png new file mode 100644 index 0000000..ae99485 Binary files /dev/null and b/py/assets/sunnyland/bunny/jump-1.png differ diff --git a/py/assets/sunnyland/bunny/jump-2.png b/py/assets/sunnyland/bunny/jump-2.png new file mode 100644 index 0000000..32f9df4 Binary files /dev/null and b/py/assets/sunnyland/bunny/jump-2.png differ diff --git a/py/assets/sunnyland/bunny/run-1.png b/py/assets/sunnyland/bunny/run-1.png new file mode 100644 index 0000000..4403711 Binary files /dev/null and b/py/assets/sunnyland/bunny/run-1.png differ diff --git a/py/assets/sunnyland/bunny/run-2.png b/py/assets/sunnyland/bunny/run-2.png new file mode 100644 index 0000000..7a1dedd Binary files /dev/null and b/py/assets/sunnyland/bunny/run-2.png differ diff --git a/py/assets/sunnyland/bunny/run-3.png b/py/assets/sunnyland/bunny/run-3.png new file mode 100644 index 0000000..6ae103b Binary files /dev/null and b/py/assets/sunnyland/bunny/run-3.png differ diff --git a/py/assets/sunnyland/bunny/run-4.png b/py/assets/sunnyland/bunny/run-4.png new file mode 100644 index 0000000..1e93aa0 Binary files /dev/null and b/py/assets/sunnyland/bunny/run-4.png differ diff --git a/py/assets/sunnyland/bunny/run-5.png b/py/assets/sunnyland/bunny/run-5.png new file mode 100644 index 0000000..9029c9e Binary files /dev/null and b/py/assets/sunnyland/bunny/run-5.png differ diff --git a/py/assets/sunnyland/bunny/run-6.png b/py/assets/sunnyland/bunny/run-6.png new file mode 100644 index 0000000..e174da1 Binary files /dev/null and b/py/assets/sunnyland/bunny/run-6.png differ diff --git a/py/assets/sunnyland/fireball/fireball-1.png b/py/assets/sunnyland/fireball/fireball-1.png new file mode 100644 index 0000000..c93702d Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-1.png differ diff --git a/py/assets/sunnyland/fireball/fireball-2.png b/py/assets/sunnyland/fireball/fireball-2.png new file mode 100644 index 0000000..be316b9 Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-2.png differ diff --git a/py/assets/sunnyland/fireball/fireball-3.png b/py/assets/sunnyland/fireball/fireball-3.png new file mode 100644 index 0000000..ab8f39d Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-3.png differ diff --git a/py/assets/sunnyland/fireball/fireball-4.png b/py/assets/sunnyland/fireball/fireball-4.png new file mode 100644 index 0000000..7907a66 Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-4.png differ diff --git a/py/assets/sunnyland/fireball/fireball-5.png b/py/assets/sunnyland/fireball/fireball-5.png new file mode 100644 index 0000000..535eb65 Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-5.png differ diff --git a/py/assets/sunnyland/fireball/fireball-hit-1.png b/py/assets/sunnyland/fireball/fireball-hit-1.png new file mode 100644 index 0000000..b0277e5 Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-hit-1.png differ diff --git a/py/assets/sunnyland/fireball/fireball-hit-2.png b/py/assets/sunnyland/fireball/fireball-hit-2.png new file mode 100644 index 0000000..4f521e8 Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-hit-2.png differ diff --git a/py/assets/sunnyland/fireball/fireball-hit-3.png b/py/assets/sunnyland/fireball/fireball-hit-3.png new file mode 100644 index 0000000..ee3843d Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-hit-3.png differ diff --git a/py/assets/sunnyland/fireball/fireball-hit-4.png b/py/assets/sunnyland/fireball/fireball-hit-4.png new file mode 100644 index 0000000..16e58a8 Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-hit-4.png differ diff --git a/py/assets/sunnyland/fireball/fireball-hit-5.png b/py/assets/sunnyland/fireball/fireball-hit-5.png new file mode 100644 index 0000000..20fc216 Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-hit-5.png differ diff --git a/py/assets/sunnyland/fireball/fireball-hit-6.png b/py/assets/sunnyland/fireball/fireball-hit-6.png new file mode 100644 index 0000000..055b4f5 Binary files /dev/null and b/py/assets/sunnyland/fireball/fireball-hit-6.png differ diff --git a/py/assets/sunnyland/fox/hurt-1.png b/py/assets/sunnyland/fox/hurt-1.png new file mode 100644 index 0000000..2d944ab Binary files /dev/null and b/py/assets/sunnyland/fox/hurt-1.png differ diff --git a/py/assets/sunnyland/fox/hurt-2.png b/py/assets/sunnyland/fox/hurt-2.png new file mode 100644 index 0000000..18e8bca Binary files /dev/null and b/py/assets/sunnyland/fox/hurt-2.png differ diff --git a/py/assets/sunnyland/fox/idle-1.png b/py/assets/sunnyland/fox/idle-1.png new file mode 100644 index 0000000..7a3210b Binary files /dev/null and b/py/assets/sunnyland/fox/idle-1.png differ diff --git a/py/assets/sunnyland/fox/idle-2.png b/py/assets/sunnyland/fox/idle-2.png new file mode 100644 index 0000000..c6e0212 Binary files /dev/null and b/py/assets/sunnyland/fox/idle-2.png differ diff --git a/py/assets/sunnyland/fox/idle-3.png b/py/assets/sunnyland/fox/idle-3.png new file mode 100644 index 0000000..f1c0f44 Binary files /dev/null and b/py/assets/sunnyland/fox/idle-3.png differ diff --git a/py/assets/sunnyland/fox/idle-4.png b/py/assets/sunnyland/fox/idle-4.png new file mode 100644 index 0000000..8bde279 Binary files /dev/null and b/py/assets/sunnyland/fox/idle-4.png differ diff --git a/py/assets/sunnyland/fox/jump-1.png b/py/assets/sunnyland/fox/jump-1.png new file mode 100644 index 0000000..036b46e Binary files /dev/null and b/py/assets/sunnyland/fox/jump-1.png differ diff --git a/py/assets/sunnyland/fox/jump-2.png b/py/assets/sunnyland/fox/jump-2.png new file mode 100644 index 0000000..de416ae Binary files /dev/null and b/py/assets/sunnyland/fox/jump-2.png differ diff --git a/py/assets/sunnyland/fox/roll-1.png b/py/assets/sunnyland/fox/roll-1.png new file mode 100644 index 0000000..76a41a8 Binary files /dev/null and b/py/assets/sunnyland/fox/roll-1.png differ diff --git a/py/assets/sunnyland/fox/roll-2.png b/py/assets/sunnyland/fox/roll-2.png new file mode 100644 index 0000000..08d7d75 Binary files /dev/null and b/py/assets/sunnyland/fox/roll-2.png differ diff --git a/py/assets/sunnyland/fox/roll-3.png b/py/assets/sunnyland/fox/roll-3.png new file mode 100644 index 0000000..add166b Binary files /dev/null and b/py/assets/sunnyland/fox/roll-3.png differ diff --git a/py/assets/sunnyland/fox/roll-4.png b/py/assets/sunnyland/fox/roll-4.png new file mode 100644 index 0000000..58ff431 Binary files /dev/null and b/py/assets/sunnyland/fox/roll-4.png differ diff --git a/py/assets/sunnyland/fox/run-1.png b/py/assets/sunnyland/fox/run-1.png new file mode 100644 index 0000000..ff5d2dd Binary files /dev/null and b/py/assets/sunnyland/fox/run-1.png differ diff --git a/py/assets/sunnyland/fox/run-2.png b/py/assets/sunnyland/fox/run-2.png new file mode 100644 index 0000000..b428145 Binary files /dev/null and b/py/assets/sunnyland/fox/run-2.png differ diff --git a/py/assets/sunnyland/fox/run-3.png b/py/assets/sunnyland/fox/run-3.png new file mode 100644 index 0000000..987b8f1 Binary files /dev/null and b/py/assets/sunnyland/fox/run-3.png differ diff --git a/py/assets/sunnyland/fox/run-4.png b/py/assets/sunnyland/fox/run-4.png new file mode 100644 index 0000000..a4e6f14 Binary files /dev/null and b/py/assets/sunnyland/fox/run-4.png differ diff --git a/py/assets/sunnyland/fox/run-5.png b/py/assets/sunnyland/fox/run-5.png new file mode 100644 index 0000000..2b915ee Binary files /dev/null and b/py/assets/sunnyland/fox/run-5.png differ diff --git a/py/assets/sunnyland/fox/run-6.png b/py/assets/sunnyland/fox/run-6.png new file mode 100644 index 0000000..762e1cf Binary files /dev/null and b/py/assets/sunnyland/fox/run-6.png differ diff --git a/py/assets/sunnyland/imp/hurt-1.png b/py/assets/sunnyland/imp/hurt-1.png new file mode 100644 index 0000000..a251789 Binary files /dev/null and b/py/assets/sunnyland/imp/hurt-1.png differ diff --git a/py/assets/sunnyland/imp/hurt-2.png b/py/assets/sunnyland/imp/hurt-2.png new file mode 100644 index 0000000..84ed54d Binary files /dev/null and b/py/assets/sunnyland/imp/hurt-2.png differ diff --git a/py/assets/sunnyland/imp/idle-1.png b/py/assets/sunnyland/imp/idle-1.png new file mode 100644 index 0000000..5f12fbb Binary files /dev/null and b/py/assets/sunnyland/imp/idle-1.png differ diff --git a/py/assets/sunnyland/imp/idle-2.png b/py/assets/sunnyland/imp/idle-2.png new file mode 100644 index 0000000..92b03da Binary files /dev/null and b/py/assets/sunnyland/imp/idle-2.png differ diff --git a/py/assets/sunnyland/imp/idle-3.png b/py/assets/sunnyland/imp/idle-3.png new file mode 100644 index 0000000..b220c04 Binary files /dev/null and b/py/assets/sunnyland/imp/idle-3.png differ diff --git a/py/assets/sunnyland/imp/idle-4.png b/py/assets/sunnyland/imp/idle-4.png new file mode 100644 index 0000000..c8992ee Binary files /dev/null and b/py/assets/sunnyland/imp/idle-4.png differ diff --git a/py/assets/sunnyland/imp/jump-1.png b/py/assets/sunnyland/imp/jump-1.png new file mode 100644 index 0000000..45c6a56 Binary files /dev/null and b/py/assets/sunnyland/imp/jump-1.png differ diff --git a/py/assets/sunnyland/imp/jump-2.png b/py/assets/sunnyland/imp/jump-2.png new file mode 100644 index 0000000..bd40e86 Binary files /dev/null and b/py/assets/sunnyland/imp/jump-2.png differ diff --git a/py/assets/sunnyland/imp/jump-3.png b/py/assets/sunnyland/imp/jump-3.png new file mode 100644 index 0000000..9a59b1b Binary files /dev/null and b/py/assets/sunnyland/imp/jump-3.png differ diff --git a/py/assets/sunnyland/imp/jump-4.png b/py/assets/sunnyland/imp/jump-4.png new file mode 100644 index 0000000..99371a8 Binary files /dev/null and b/py/assets/sunnyland/imp/jump-4.png differ diff --git a/py/assets/sunnyland/imp/jump-5.png b/py/assets/sunnyland/imp/jump-5.png new file mode 100644 index 0000000..fadeb70 Binary files /dev/null and b/py/assets/sunnyland/imp/jump-5.png differ diff --git a/py/assets/sunnyland/imp/run-1.png b/py/assets/sunnyland/imp/run-1.png new file mode 100644 index 0000000..d4aef63 Binary files /dev/null and b/py/assets/sunnyland/imp/run-1.png differ diff --git a/py/assets/sunnyland/imp/run-2.png b/py/assets/sunnyland/imp/run-2.png new file mode 100644 index 0000000..6e8f2a7 Binary files /dev/null and b/py/assets/sunnyland/imp/run-2.png differ diff --git a/py/assets/sunnyland/imp/run-3.png b/py/assets/sunnyland/imp/run-3.png new file mode 100644 index 0000000..ff53781 Binary files /dev/null and b/py/assets/sunnyland/imp/run-3.png differ diff --git a/py/assets/sunnyland/imp/run-4.png b/py/assets/sunnyland/imp/run-4.png new file mode 100644 index 0000000..60491b8 Binary files /dev/null and b/py/assets/sunnyland/imp/run-4.png differ diff --git a/py/assets/sunnyland/imp/run-5.png b/py/assets/sunnyland/imp/run-5.png new file mode 100644 index 0000000..cc69e28 Binary files /dev/null and b/py/assets/sunnyland/imp/run-5.png differ diff --git a/py/assets/sunnyland/imp/run-6.png b/py/assets/sunnyland/imp/run-6.png new file mode 100644 index 0000000..204ece9 Binary files /dev/null and b/py/assets/sunnyland/imp/run-6.png differ diff --git a/py/assets/sunnyland/imp/run-7.png b/py/assets/sunnyland/imp/run-7.png new file mode 100644 index 0000000..18373d6 Binary files /dev/null and b/py/assets/sunnyland/imp/run-7.png differ diff --git a/py/assets/sunnyland/imp/run-8.png b/py/assets/sunnyland/imp/run-8.png new file mode 100644 index 0000000..43fd6f3 Binary files /dev/null and b/py/assets/sunnyland/imp/run-8.png differ diff --git a/py/assets/sunnyland/imp/shot-1.png b/py/assets/sunnyland/imp/shot-1.png new file mode 100644 index 0000000..f1a76ee Binary files /dev/null and b/py/assets/sunnyland/imp/shot-1.png differ diff --git a/py/assets/sunnyland/imp/shot-2.png b/py/assets/sunnyland/imp/shot-2.png new file mode 100644 index 0000000..6396b0c Binary files /dev/null and b/py/assets/sunnyland/imp/shot-2.png differ diff --git a/py/assets/sunnyland/imp/shot-3.png b/py/assets/sunnyland/imp/shot-3.png new file mode 100644 index 0000000..07ccd00 Binary files /dev/null and b/py/assets/sunnyland/imp/shot-3.png differ diff --git a/py/assets/sunnyland/imp/shot-4.png b/py/assets/sunnyland/imp/shot-4.png new file mode 100644 index 0000000..97dc8f6 Binary files /dev/null and b/py/assets/sunnyland/imp/shot-4.png differ diff --git a/py/assets/sunnyland/middle.png b/py/assets/sunnyland/middle.png new file mode 100644 index 0000000..3e74b1d Binary files /dev/null and b/py/assets/sunnyland/middle.png differ diff --git a/py/assets/sunnyland/squirrel/hurt-1.png b/py/assets/sunnyland/squirrel/hurt-1.png new file mode 100644 index 0000000..df3e183 Binary files /dev/null and b/py/assets/sunnyland/squirrel/hurt-1.png differ diff --git a/py/assets/sunnyland/squirrel/hurt-2.png b/py/assets/sunnyland/squirrel/hurt-2.png new file mode 100644 index 0000000..f822d3f Binary files /dev/null and b/py/assets/sunnyland/squirrel/hurt-2.png differ diff --git a/py/assets/sunnyland/squirrel/idle-1.png b/py/assets/sunnyland/squirrel/idle-1.png new file mode 100644 index 0000000..8e8a8f1 Binary files /dev/null and b/py/assets/sunnyland/squirrel/idle-1.png differ diff --git a/py/assets/sunnyland/squirrel/idle-2.png b/py/assets/sunnyland/squirrel/idle-2.png new file mode 100644 index 0000000..3642a29 Binary files /dev/null and b/py/assets/sunnyland/squirrel/idle-2.png differ diff --git a/py/assets/sunnyland/squirrel/idle-3.png b/py/assets/sunnyland/squirrel/idle-3.png new file mode 100644 index 0000000..4c2bad7 Binary files /dev/null and b/py/assets/sunnyland/squirrel/idle-3.png differ diff --git a/py/assets/sunnyland/squirrel/idle-4.png b/py/assets/sunnyland/squirrel/idle-4.png new file mode 100644 index 0000000..2520d21 Binary files /dev/null and b/py/assets/sunnyland/squirrel/idle-4.png differ diff --git a/py/assets/sunnyland/squirrel/idle-5.png b/py/assets/sunnyland/squirrel/idle-5.png new file mode 100644 index 0000000..65b76ed Binary files /dev/null and b/py/assets/sunnyland/squirrel/idle-5.png differ diff --git a/py/assets/sunnyland/squirrel/idle-6.png b/py/assets/sunnyland/squirrel/idle-6.png new file mode 100644 index 0000000..bbfe049 Binary files /dev/null and b/py/assets/sunnyland/squirrel/idle-6.png differ diff --git a/py/assets/sunnyland/squirrel/idle-7.png b/py/assets/sunnyland/squirrel/idle-7.png new file mode 100644 index 0000000..87064de Binary files /dev/null and b/py/assets/sunnyland/squirrel/idle-7.png differ diff --git a/py/assets/sunnyland/squirrel/idle-8.png b/py/assets/sunnyland/squirrel/idle-8.png new file mode 100644 index 0000000..3b47b77 Binary files /dev/null and b/py/assets/sunnyland/squirrel/idle-8.png differ diff --git a/py/assets/sunnyland/squirrel/jump-1.png b/py/assets/sunnyland/squirrel/jump-1.png new file mode 100644 index 0000000..857c598 Binary files /dev/null and b/py/assets/sunnyland/squirrel/jump-1.png differ diff --git a/py/assets/sunnyland/squirrel/jump-2.png b/py/assets/sunnyland/squirrel/jump-2.png new file mode 100644 index 0000000..d757774 Binary files /dev/null and b/py/assets/sunnyland/squirrel/jump-2.png differ diff --git a/py/assets/sunnyland/squirrel/jump-3.png b/py/assets/sunnyland/squirrel/jump-3.png new file mode 100644 index 0000000..20b939c Binary files /dev/null and b/py/assets/sunnyland/squirrel/jump-3.png differ diff --git a/py/assets/sunnyland/squirrel/jump-4.png b/py/assets/sunnyland/squirrel/jump-4.png new file mode 100644 index 0000000..3746d0a Binary files /dev/null and b/py/assets/sunnyland/squirrel/jump-4.png differ diff --git a/py/assets/sunnyland/squirrel/run-1.png b/py/assets/sunnyland/squirrel/run-1.png new file mode 100644 index 0000000..4222411 Binary files /dev/null and b/py/assets/sunnyland/squirrel/run-1.png differ diff --git a/py/assets/sunnyland/squirrel/run-2.png b/py/assets/sunnyland/squirrel/run-2.png new file mode 100644 index 0000000..a2604fc Binary files /dev/null and b/py/assets/sunnyland/squirrel/run-2.png differ diff --git a/py/assets/sunnyland/squirrel/run-3.png b/py/assets/sunnyland/squirrel/run-3.png new file mode 100644 index 0000000..4595640 Binary files /dev/null and b/py/assets/sunnyland/squirrel/run-3.png differ diff --git a/py/assets/sunnyland/squirrel/run-4.png b/py/assets/sunnyland/squirrel/run-4.png new file mode 100644 index 0000000..2455a81 Binary files /dev/null and b/py/assets/sunnyland/squirrel/run-4.png differ diff --git a/py/assets/sunnyland/squirrel/run-5.png b/py/assets/sunnyland/squirrel/run-5.png new file mode 100644 index 0000000..1a965e2 Binary files /dev/null and b/py/assets/sunnyland/squirrel/run-5.png differ diff --git a/py/assets/sunnyland/squirrel/run-6.png b/py/assets/sunnyland/squirrel/run-6.png new file mode 100644 index 0000000..1702cad Binary files /dev/null and b/py/assets/sunnyland/squirrel/run-6.png differ diff --git a/py/assets/sunnyland/tileset.png b/py/assets/sunnyland/tileset.png new file mode 100644 index 0000000..f44abc3 Binary files /dev/null and b/py/assets/sunnyland/tileset.png differ diff --git a/py/assets/zombie_shooter/bullet.png b/py/assets/zombie_shooter/bullet.png new file mode 100644 index 0000000..fd38525 Binary files /dev/null and b/py/assets/zombie_shooter/bullet.png differ diff --git a/py/assets/zombie_shooter/light.png b/py/assets/zombie_shooter/light.png new file mode 100644 index 0000000..c40411b Binary files /dev/null and b/py/assets/zombie_shooter/light.png differ diff --git a/py/assets/zombie_shooter/player_1.png b/py/assets/zombie_shooter/player_1.png new file mode 100644 index 0000000..3cebeb7 Binary files /dev/null and b/py/assets/zombie_shooter/player_1.png differ diff --git a/py/assets/zombie_shooter/player_2.png b/py/assets/zombie_shooter/player_2.png new file mode 100644 index 0000000..9c966d3 Binary files /dev/null and b/py/assets/zombie_shooter/player_2.png differ diff --git a/py/assets/zombie_shooter/player_3.png b/py/assets/zombie_shooter/player_3.png new file mode 100644 index 0000000..11d3e71 Binary files /dev/null and b/py/assets/zombie_shooter/player_3.png differ diff --git a/py/assets/zombie_shooter/player_4.png b/py/assets/zombie_shooter/player_4.png new file mode 100644 index 0000000..2e00169 Binary files /dev/null and b/py/assets/zombie_shooter/player_4.png differ diff --git a/py/assets/zombie_shooter/tilemap.png b/py/assets/zombie_shooter/tilemap.png new file mode 100644 index 0000000..53a8dda Binary files /dev/null and b/py/assets/zombie_shooter/tilemap.png differ diff --git a/py/assets/zombie_shooter/zombie.png b/py/assets/zombie_shooter/zombie.png new file mode 100644 index 0000000..79eca07 Binary files /dev/null and b/py/assets/zombie_shooter/zombie.png differ diff --git a/py/engine/LdtkJson.py b/py/engine/LdtkJson.py new file mode 100644 index 0000000..c816f39 --- /dev/null +++ b/py/engine/LdtkJson.py @@ -0,0 +1,2831 @@ +from enum import Enum +from typing import Any, List, Optional, Dict, TypeVar, Type, Callable, cast + + +T = TypeVar("T") +EnumT = TypeVar("EnumT", bound=Enum) + + +def from_str(x: Any) -> str: + assert isinstance(x, str) + return x + + +def to_enum(c: Type[EnumT], x: Any) -> EnumT: + assert isinstance(x, c) + return x.value + + +def from_none(x: Any) -> Any: + assert x is None + return x + + +def from_list(f: Callable[[Any], T], x: Any) -> List[T]: + assert isinstance(x, list) + return [f(y) for y in x] + + +def from_union(fs, x): + for f in fs: + try: + return f(x) + except: + pass + assert False + + +def from_int(x: Any) -> int: + assert isinstance(x, int) and not isinstance(x, bool) + return x + + +def from_bool(x: Any) -> bool: + assert isinstance(x, bool) + return x + + +def from_float(x: Any) -> float: + assert isinstance(x, (float, int)) and not isinstance(x, bool) + return float(x) + + +def to_float(x: Any) -> float: + assert isinstance(x, float) + return x + + +def to_class(c: Type[T], x: Any) -> dict: + assert isinstance(x, c) + return cast(Any, x).to_dict() + + +def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]: + assert isinstance(x, dict) + return { k: f(v) for (k, v) in x.items() } + + +class When(Enum): + """Possible values: `Manual`, `AfterLoad`, `BeforeSave`, `AfterSave`""" + AFTER_LOAD = "AfterLoad" + AFTER_SAVE = "AfterSave" + BEFORE_SAVE = "BeforeSave" + MANUAL = "Manual" + + +class LdtkCustomCommand: + command: str + when: When + """Possible values: `Manual`, `AfterLoad`, `BeforeSave`, `AfterSave`""" + + def __init__(self, command: str, when: When) -> None: + self.command = command + self.when = when + + @staticmethod + def from_dict(obj: Any) -> 'LdtkCustomCommand': + assert isinstance(obj, dict) + command = from_str(obj.get("command")) + when = When(obj.get("when")) + return LdtkCustomCommand(command, when) + + def to_dict(self) -> dict: + result: dict = {} + result["command"] = from_str(self.command) + result["when"] = to_enum(When, self.when) + return result + + +class AllowedRefs(Enum): + """Possible values: `Any`, `OnlySame`, `OnlyTags`, `OnlySpecificEntity`""" + ANY = "Any" + ONLY_SAME = "OnlySame" + ONLY_SPECIFIC_ENTITY = "OnlySpecificEntity" + ONLY_TAGS = "OnlyTags" + + +class EditorDisplayMode(Enum): + """Possible values: `Hidden`, `ValueOnly`, `NameAndValue`, `EntityTile`, `LevelTile`, + `Points`, `PointStar`, `PointPath`, `PointPathLoop`, `RadiusPx`, `RadiusGrid`, + `ArrayCountWithLabel`, `ArrayCountNoLabel`, `RefLinkBetweenPivots`, + `RefLinkBetweenCenters` + """ + ARRAY_COUNT_NO_LABEL = "ArrayCountNoLabel" + ARRAY_COUNT_WITH_LABEL = "ArrayCountWithLabel" + ENTITY_TILE = "EntityTile" + HIDDEN = "Hidden" + LEVEL_TILE = "LevelTile" + NAME_AND_VALUE = "NameAndValue" + POINTS = "Points" + POINT_PATH = "PointPath" + POINT_PATH_LOOP = "PointPathLoop" + POINT_STAR = "PointStar" + RADIUS_GRID = "RadiusGrid" + RADIUS_PX = "RadiusPx" + REF_LINK_BETWEEN_CENTERS = "RefLinkBetweenCenters" + REF_LINK_BETWEEN_PIVOTS = "RefLinkBetweenPivots" + VALUE_ONLY = "ValueOnly" + + +class EditorDisplayPos(Enum): + """Possible values: `Above`, `Center`, `Beneath`""" + ABOVE = "Above" + BENEATH = "Beneath" + CENTER = "Center" + + +class EditorLinkStyle(Enum): + """Possible values: `ZigZag`, `StraightArrow`, `CurvedArrow`, `ArrowsLine`, `DashedLine`""" + ARROWS_LINE = "ArrowsLine" + CURVED_ARROW = "CurvedArrow" + DASHED_LINE = "DashedLine" + STRAIGHT_ARROW = "StraightArrow" + ZIG_ZAG = "ZigZag" + + +class TextLanguageMode(Enum): + LANG_C = "LangC" + LANG_HAXE = "LangHaxe" + LANG_JS = "LangJS" + LANG_JSON = "LangJson" + LANG_LOG = "LangLog" + LANG_LUA = "LangLua" + LANG_MARKDOWN = "LangMarkdown" + LANG_PYTHON = "LangPython" + LANG_RUBY = "LangRuby" + LANG_XML = "LangXml" + + +class FieldDefinition: + """This section is mostly only intended for the LDtk editor app itself. You can safely + ignore it. + """ + type: str + """Human readable value type. Possible values: `Int, Float, String, Bool, rl.Color, + ExternEnum.XXX, LocalEnum.XXX, Point, FilePath`.
If the field is an array, this + field will look like `Array<...>` (eg. `Array`, `Array` etc.)
NOTE: if + you enable the advanced option **Use Multilines type**, you will have "*Multilines*" + instead of "*String*" when relevant. + """ + accept_file_types: Optional[List[str]] + """Optional list of accepted file extensions for FilePath value type. Includes the dot: + `.ext` + """ + allowed_refs: AllowedRefs + """Possible values: `Any`, `OnlySame`, `OnlyTags`, `OnlySpecificEntity`""" + allowed_refs_entity_uid: Optional[int] + allowed_ref_tags: List[str] + allow_out_of_level_ref: bool + array_max_length: Optional[int] + """Array max length""" + array_min_length: Optional[int] + """Array min length""" + auto_chain_ref: bool + can_be_null: bool + """TRUE if the value can be null. For arrays, TRUE means it can contain null values + (exception: array of Points can't have null values). + """ + default_override: Any + """Default value if selected value is null or invalid.""" + doc: Optional[str] + """User defined documentation for this field to provide help/tips to level designers about + accepted values. + """ + editor_always_show: bool + editor_cut_long_values: bool + editor_display_color: Optional[str] + editor_display_mode: EditorDisplayMode + """Possible values: `Hidden`, `ValueOnly`, `NameAndValue`, `EntityTile`, `LevelTile`, + `Points`, `PointStar`, `PointPath`, `PointPathLoop`, `RadiusPx`, `RadiusGrid`, + `ArrayCountWithLabel`, `ArrayCountNoLabel`, `RefLinkBetweenPivots`, + `RefLinkBetweenCenters` + """ + editor_display_pos: EditorDisplayPos + """Possible values: `Above`, `Center`, `Beneath`""" + editor_display_scale: float + editor_link_style: EditorLinkStyle + """Possible values: `ZigZag`, `StraightArrow`, `CurvedArrow`, `ArrowsLine`, `DashedLine`""" + editor_show_in_world: bool + editor_text_prefix: Optional[str] + editor_text_suffix: Optional[str] + export_to_toc: bool + """If TRUE, the field value will be exported to the `toc` project JSON field. Only applies + to Entity fields. + """ + identifier: str + """User defined unique identifier""" + is_array: bool + """TRUE if the value is an array of multiple values""" + max: Optional[float] + """Max limit for value, if applicable""" + min: Optional[float] + """Min limit for value, if applicable""" + regex: Optional[str] + """Optional regular expression that needs to be matched to accept values. Expected format: + `/some_reg_ex/g`, with optional "i" flag. + """ + searchable: bool + """If enabled, this field will be searchable through LDtk command palette""" + symmetrical_ref: bool + text_language_mode: Optional[TextLanguageMode] + """Possible values: <`null`>, `LangPython`, `LangRuby`, `LangJS`, `LangLua`, `LangC`, + `LangHaxe`, `LangMarkdown`, `LangJson`, `LangXml`, `LangLog` + """ + tileset_uid: Optional[int] + """UID of the tileset used for a Tile""" + field_definition_type: str + """Internal enum representing the possible field types. Possible values: F_Int, F_Float, + F_String, F_Text, F_Bool, F_Color, F_Enum(...), F_Point, F_Path, F_EntityRef, F_Tile + """ + uid: int + """Unique Int identifier""" + use_for_smart_color: bool + """If TRUE, the color associated with this field will override the Entity or Level default + color in the editor UI. For Enum fields, this would be the color associated to their + values. + """ + + def __init__(self, type: str, accept_file_types: Optional[List[str]], allowed_refs: AllowedRefs, allowed_refs_entity_uid: Optional[int], allowed_ref_tags: List[str], allow_out_of_level_ref: bool, array_max_length: Optional[int], array_min_length: Optional[int], auto_chain_ref: bool, can_be_null: bool, default_override: Any, doc: Optional[str], editor_always_show: bool, editor_cut_long_values: bool, editor_display_color: Optional[str], editor_display_mode: EditorDisplayMode, editor_display_pos: EditorDisplayPos, editor_display_scale: float, editor_link_style: EditorLinkStyle, editor_show_in_world: bool, editor_text_prefix: Optional[str], editor_text_suffix: Optional[str], export_to_toc: bool, identifier: str, is_array: bool, max: Optional[float], min: Optional[float], regex: Optional[str], searchable: bool, symmetrical_ref: bool, text_language_mode: Optional[TextLanguageMode], tileset_uid: Optional[int], field_definition_type: str, uid: int, use_for_smart_color: bool) -> None: + self.type = type + self.accept_file_types = accept_file_types + self.allowed_refs = allowed_refs + self.allowed_refs_entity_uid = allowed_refs_entity_uid + self.allowed_ref_tags = allowed_ref_tags + self.allow_out_of_level_ref = allow_out_of_level_ref + self.array_max_length = array_max_length + self.array_min_length = array_min_length + self.auto_chain_ref = auto_chain_ref + self.can_be_null = can_be_null + self.default_override = default_override + self.doc = doc + self.editor_always_show = editor_always_show + self.editor_cut_long_values = editor_cut_long_values + self.editor_display_color = editor_display_color + self.editor_display_mode = editor_display_mode + self.editor_display_pos = editor_display_pos + self.editor_display_scale = editor_display_scale + self.editor_link_style = editor_link_style + self.editor_show_in_world = editor_show_in_world + self.editor_text_prefix = editor_text_prefix + self.editor_text_suffix = editor_text_suffix + self.export_to_toc = export_to_toc + self.identifier = identifier + self.is_array = is_array + self.max = max + self.min = min + self.regex = regex + self.searchable = searchable + self.symmetrical_ref = symmetrical_ref + self.text_language_mode = text_language_mode + self.tileset_uid = tileset_uid + self.field_definition_type = field_definition_type + self.uid = uid + self.use_for_smart_color = use_for_smart_color + + @staticmethod + def from_dict(obj: Any) -> 'FieldDefinition': + assert isinstance(obj, dict) + type = from_str(obj.get("__type")) + accept_file_types = from_union([from_none, lambda x: from_list(from_str, x)], obj.get("acceptFileTypes")) + allowed_refs = AllowedRefs(obj.get("allowedRefs")) + allowed_refs_entity_uid = from_union([from_none, from_int], obj.get("allowedRefsEntityUid")) + allowed_ref_tags = from_list(from_str, obj.get("allowedRefTags")) + allow_out_of_level_ref = from_bool(obj.get("allowOutOfLevelRef")) + array_max_length = from_union([from_none, from_int], obj.get("arrayMaxLength")) + array_min_length = from_union([from_none, from_int], obj.get("arrayMinLength")) + auto_chain_ref = from_bool(obj.get("autoChainRef")) + can_be_null = from_bool(obj.get("canBeNull")) + default_override = obj.get("defaultOverride") + doc = from_union([from_none, from_str], obj.get("doc")) + editor_always_show = from_bool(obj.get("editorAlwaysShow")) + editor_cut_long_values = from_bool(obj.get("editorCutLongValues")) + editor_display_color = from_union([from_none, from_str], obj.get("editorDisplayColor")) + editor_display_mode = EditorDisplayMode(obj.get("editorDisplayMode")) + editor_display_pos = EditorDisplayPos(obj.get("editorDisplayPos")) + editor_display_scale = from_float(obj.get("editorDisplayScale")) + editor_link_style = EditorLinkStyle(obj.get("editorLinkStyle")) + editor_show_in_world = from_bool(obj.get("editorShowInWorld")) + editor_text_prefix = from_union([from_none, from_str], obj.get("editorTextPrefix")) + editor_text_suffix = from_union([from_none, from_str], obj.get("editorTextSuffix")) + export_to_toc = from_bool(obj.get("exportToToc")) + identifier = from_str(obj.get("identifier")) + is_array = from_bool(obj.get("isArray")) + max = from_union([from_none, from_float], obj.get("max")) + min = from_union([from_none, from_float], obj.get("min")) + regex = from_union([from_none, from_str], obj.get("regex")) + searchable = from_bool(obj.get("searchable")) + symmetrical_ref = from_bool(obj.get("symmetricalRef")) + text_language_mode = from_union([from_none, TextLanguageMode], obj.get("textLanguageMode")) + tileset_uid = from_union([from_none, from_int], obj.get("tilesetUid")) + field_definition_type = from_str(obj.get("type")) + uid = from_int(obj.get("uid")) + use_for_smart_color = from_bool(obj.get("useForSmartColor")) + return FieldDefinition(type, accept_file_types, allowed_refs, allowed_refs_entity_uid, allowed_ref_tags, allow_out_of_level_ref, array_max_length, array_min_length, auto_chain_ref, can_be_null, default_override, doc, editor_always_show, editor_cut_long_values, editor_display_color, editor_display_mode, editor_display_pos, editor_display_scale, editor_link_style, editor_show_in_world, editor_text_prefix, editor_text_suffix, export_to_toc, identifier, is_array, max, min, regex, searchable, symmetrical_ref, text_language_mode, tileset_uid, field_definition_type, uid, use_for_smart_color) + + def to_dict(self) -> dict: + result: dict = {} + result["__type"] = from_str(self.type) + if self.accept_file_types is not None: + result["acceptFileTypes"] = from_union([from_none, lambda x: from_list(from_str, x)], self.accept_file_types) + result["allowedRefs"] = to_enum(AllowedRefs, self.allowed_refs) + if self.allowed_refs_entity_uid is not None: + result["allowedRefsEntityUid"] = from_union([from_none, from_int], self.allowed_refs_entity_uid) + result["allowedRefTags"] = from_list(from_str, self.allowed_ref_tags) + result["allowOutOfLevelRef"] = from_bool(self.allow_out_of_level_ref) + if self.array_max_length is not None: + result["arrayMaxLength"] = from_union([from_none, from_int], self.array_max_length) + if self.array_min_length is not None: + result["arrayMinLength"] = from_union([from_none, from_int], self.array_min_length) + result["autoChainRef"] = from_bool(self.auto_chain_ref) + result["canBeNull"] = from_bool(self.can_be_null) + if self.default_override is not None: + result["defaultOverride"] = self.default_override + if self.doc is not None: + result["doc"] = from_union([from_none, from_str], self.doc) + result["editorAlwaysShow"] = from_bool(self.editor_always_show) + result["editorCutLongValues"] = from_bool(self.editor_cut_long_values) + if self.editor_display_color is not None: + result["editorDisplayColor"] = from_union([from_none, from_str], self.editor_display_color) + result["editorDisplayMode"] = to_enum(EditorDisplayMode, self.editor_display_mode) + result["editorDisplayPos"] = to_enum(EditorDisplayPos, self.editor_display_pos) + result["editorDisplayScale"] = to_float(self.editor_display_scale) + result["editorLinkStyle"] = to_enum(EditorLinkStyle, self.editor_link_style) + result["editorShowInWorld"] = from_bool(self.editor_show_in_world) + if self.editor_text_prefix is not None: + result["editorTextPrefix"] = from_union([from_none, from_str], self.editor_text_prefix) + if self.editor_text_suffix is not None: + result["editorTextSuffix"] = from_union([from_none, from_str], self.editor_text_suffix) + result["exportToToc"] = from_bool(self.export_to_toc) + result["identifier"] = from_str(self.identifier) + result["isArray"] = from_bool(self.is_array) + if self.max is not None: + result["max"] = from_union([from_none, to_float], self.max) + if self.min is not None: + result["min"] = from_union([from_none, to_float], self.min) + if self.regex is not None: + result["regex"] = from_union([from_none, from_str], self.regex) + result["searchable"] = from_bool(self.searchable) + result["symmetricalRef"] = from_bool(self.symmetrical_ref) + if self.text_language_mode is not None: + result["textLanguageMode"] = from_union([from_none, lambda x: to_enum(TextLanguageMode, x)], self.text_language_mode) + if self.tileset_uid is not None: + result["tilesetUid"] = from_union([from_none, from_int], self.tileset_uid) + result["type"] = from_str(self.field_definition_type) + result["uid"] = from_int(self.uid) + result["useForSmartColor"] = from_bool(self.use_for_smart_color) + return result + + +class LimitBehavior(Enum): + """Possible values: `DiscardOldOnes`, `PreventAdding`, `MoveLastOne`""" + DISCARD_OLD_ONES = "DiscardOldOnes" + MOVE_LAST_ONE = "MoveLastOne" + PREVENT_ADDING = "PreventAdding" + + +class LimitScope(Enum): + """If TRUE, the maxCount is a "per world" limit, if FALSE, it's a "per level". Possible + values: `PerLayer`, `PerLevel`, `PerWorld` + """ + PER_LAYER = "PerLayer" + PER_LEVEL = "PerLevel" + PER_WORLD = "PerWorld" + + +class RenderMode(Enum): + """Possible values: `Rectangle`, `Ellipse`, `Tile`, `Cross`""" + CROSS = "Cross" + ELLIPSE = "Ellipse" + RECTANGLE = "Rectangle" + TILE = "Tile" + + +class TilesetRectangle: + """This object represents a custom sub rectangle in a Tileset image.""" + h: int + """Height in pixels""" + tileset_uid: int + """UID of the tileset""" + w: int + """Width in pixels""" + x: int + """X pixels coordinate of the top-left corner in the Tileset image""" + y: int + """Y pixels coordinate of the top-left corner in the Tileset image""" + + def __init__(self, h: int, tileset_uid: int, w: int, x: int, y: int) -> None: + self.h = h + self.tileset_uid = tileset_uid + self.w = w + self.x = x + self.y = y + + @staticmethod + def from_dict(obj: Any) -> 'TilesetRectangle': + assert isinstance(obj, dict) + h = from_int(obj.get("h")) + tileset_uid = from_int(obj.get("tilesetUid")) + w = from_int(obj.get("w")) + x = from_int(obj.get("x")) + y = from_int(obj.get("y")) + return TilesetRectangle(h, tileset_uid, w, x, y) + + def to_dict(self) -> dict: + result: dict = {} + result["h"] = from_int(self.h) + result["tilesetUid"] = from_int(self.tileset_uid) + result["w"] = from_int(self.w) + result["x"] = from_int(self.x) + result["y"] = from_int(self.y) + return result + + +class TileRenderMode(Enum): + """An enum describing how the the Entity tile is rendered inside the Entity bounds. Possible + values: `Cover`, `FitInside`, `Repeat`, `Stretch`, `FullSizeCropped`, + `FullSizeUncropped`, `NineSlice` + """ + COVER = "Cover" + FIT_INSIDE = "FitInside" + FULL_SIZE_CROPPED = "FullSizeCropped" + FULL_SIZE_UNCROPPED = "FullSizeUncropped" + NINE_SLICE = "NineSlice" + REPEAT = "Repeat" + STRETCH = "Stretch" + + +class EntityDefinition: + allow_out_of_bounds: bool + """If enabled, this entity is allowed to stay outside of the current level bounds""" + color: str + """Base entity color""" + doc: Optional[str] + """User defined documentation for this element to provide help/tips to level designers.""" + export_to_toc: bool + """If enabled, all instances of this entity will be listed in the project "Table of content" + object. + """ + field_defs: List[FieldDefinition] + """Array of field definitions""" + fill_opacity: float + height: int + """Pixel height""" + hollow: bool + identifier: str + """User defined unique identifier""" + keep_aspect_ratio: bool + """Only applies to entities resizable on both X/Y. If TRUE, the entity instance width/height + will keep the same aspect ratio as the definition. + """ + limit_behavior: LimitBehavior + """Possible values: `DiscardOldOnes`, `PreventAdding`, `MoveLastOne`""" + limit_scope: LimitScope + """If TRUE, the maxCount is a "per world" limit, if FALSE, it's a "per level". Possible + values: `PerLayer`, `PerLevel`, `PerWorld` + """ + line_opacity: float + max_count: int + """Max instances count""" + max_height: Optional[int] + """Max pixel height (only applies if the entity is resizable on Y)""" + max_width: Optional[int] + """Max pixel width (only applies if the entity is resizable on X)""" + min_height: Optional[int] + """Min pixel height (only applies if the entity is resizable on Y)""" + min_width: Optional[int] + """Min pixel width (only applies if the entity is resizable on X)""" + nine_slice_borders: List[int] + """An array of 4 dimensions for the up/right/down/left borders (in this order) when using + 9-slice mode for `tileRenderMode`.
If the tileRenderMode is not NineSlice, then + this array is empty.
See: https://en.wikipedia.org/wiki/9-slice_scaling + """ + pivot_x: float + """Pivot X coordinate (from 0 to 1.0)""" + pivot_y: float + """Pivot Y coordinate (from 0 to 1.0)""" + render_mode: RenderMode + """Possible values: `rl.Rectangle`, `Ellipse`, `Tile`, `Cross`""" + resizable_x: bool + """If TRUE, the entity instances will be resizable horizontally""" + resizable_y: bool + """If TRUE, the entity instances will be resizable vertically""" + show_name: bool + """Display entity name in editor""" + tags: List[str] + """An array of strings that classifies this entity""" + tile_id: Optional[int] + """**WARNING**: this deprecated value is no longer exported since version 1.2.0 Replaced + by: `tileRect` + """ + tile_opacity: float + tile_rect: Optional[TilesetRectangle] + """An object representing a rectangle from an existing Tileset""" + tile_render_mode: TileRenderMode + """An enum describing how the the Entity tile is rendered inside the Entity bounds. Possible + values: `Cover`, `FitInside`, `Repeat`, `Stretch`, `FullSizeCropped`, + `FullSizeUncropped`, `NineSlice` + """ + tileset_id: Optional[int] + """Tileset ID used for optional tile display""" + uid: int + """Unique Int identifier""" + ui_tile_rect: Optional[TilesetRectangle] + """This tile overrides the one defined in `tileRect` in the UI""" + width: int + """Pixel width""" + + def __init__(self, allow_out_of_bounds: bool, color: str, doc: Optional[str], export_to_toc: bool, field_defs: List[FieldDefinition], fill_opacity: float, height: int, hollow: bool, identifier: str, keep_aspect_ratio: bool, limit_behavior: LimitBehavior, limit_scope: LimitScope, line_opacity: float, max_count: int, max_height: Optional[int], max_width: Optional[int], min_height: Optional[int], min_width: Optional[int], nine_slice_borders: List[int], pivot_x: float, pivot_y: float, render_mode: RenderMode, resizable_x: bool, resizable_y: bool, show_name: bool, tags: List[str], tile_id: Optional[int], tile_opacity: float, tile_rect: Optional[TilesetRectangle], tile_render_mode: TileRenderMode, tileset_id: Optional[int], uid: int, ui_tile_rect: Optional[TilesetRectangle], width: int) -> None: + self.allow_out_of_bounds = allow_out_of_bounds + self.color = color + self.doc = doc + self.export_to_toc = export_to_toc + self.field_defs = field_defs + self.fill_opacity = fill_opacity + self.height = height + self.hollow = hollow + self.identifier = identifier + self.keep_aspect_ratio = keep_aspect_ratio + self.limit_behavior = limit_behavior + self.limit_scope = limit_scope + self.line_opacity = line_opacity + self.max_count = max_count + self.max_height = max_height + self.max_width = max_width + self.min_height = min_height + self.min_width = min_width + self.nine_slice_borders = nine_slice_borders + self.pivot_x = pivot_x + self.pivot_y = pivot_y + self.render_mode = render_mode + self.resizable_x = resizable_x + self.resizable_y = resizable_y + self.show_name = show_name + self.tags = tags + self.tile_id = tile_id + self.tile_opacity = tile_opacity + self.tile_rect = tile_rect + self.tile_render_mode = tile_render_mode + self.tileset_id = tileset_id + self.uid = uid + self.ui_tile_rect = ui_tile_rect + self.width = width + + @staticmethod + def from_dict(obj: Any) -> 'EntityDefinition': + assert isinstance(obj, dict) + allow_out_of_bounds = from_bool(obj.get("allowOutOfBounds")) + color = from_str(obj.get("color")) + doc = from_union([from_none, from_str], obj.get("doc")) + export_to_toc = from_bool(obj.get("exportToToc")) + field_defs = from_list(FieldDefinition.from_dict, obj.get("fieldDefs")) + fill_opacity = from_float(obj.get("fillOpacity")) + height = from_int(obj.get("height")) + hollow = from_bool(obj.get("hollow")) + identifier = from_str(obj.get("identifier")) + keep_aspect_ratio = from_bool(obj.get("keepAspectRatio")) + limit_behavior = LimitBehavior(obj.get("limitBehavior")) + limit_scope = LimitScope(obj.get("limitScope")) + line_opacity = from_float(obj.get("lineOpacity")) + max_count = from_int(obj.get("maxCount")) + max_height = from_union([from_none, from_int], obj.get("maxHeight")) + max_width = from_union([from_none, from_int], obj.get("maxWidth")) + min_height = from_union([from_none, from_int], obj.get("minHeight")) + min_width = from_union([from_none, from_int], obj.get("minWidth")) + nine_slice_borders = from_list(from_int, obj.get("nineSliceBorders")) + pivot_x = from_float(obj.get("pivotX")) + pivot_y = from_float(obj.get("pivotY")) + render_mode = RenderMode(obj.get("renderMode")) + resizable_x = from_bool(obj.get("resizableX")) + resizable_y = from_bool(obj.get("resizableY")) + show_name = from_bool(obj.get("showName")) + tags = from_list(from_str, obj.get("tags")) + tile_id = from_union([from_none, from_int], obj.get("tileId")) + tile_opacity = from_float(obj.get("tileOpacity")) + tile_rect = from_union([from_none, TilesetRectangle.from_dict], obj.get("tileRect")) + tile_render_mode = TileRenderMode(obj.get("tileRenderMode")) + tileset_id = from_union([from_none, from_int], obj.get("tilesetId")) + uid = from_int(obj.get("uid")) + ui_tile_rect = from_union([from_none, TilesetRectangle.from_dict], obj.get("uiTileRect")) + width = from_int(obj.get("width")) + return EntityDefinition(allow_out_of_bounds, color, doc, export_to_toc, field_defs, fill_opacity, height, hollow, identifier, keep_aspect_ratio, limit_behavior, limit_scope, line_opacity, max_count, max_height, max_width, min_height, min_width, nine_slice_borders, pivot_x, pivot_y, render_mode, resizable_x, resizable_y, show_name, tags, tile_id, tile_opacity, tile_rect, tile_render_mode, tileset_id, uid, ui_tile_rect, width) + + def to_dict(self) -> dict: + result: dict = {} + result["allowOutOfBounds"] = from_bool(self.allow_out_of_bounds) + result["color"] = from_str(self.color) + if self.doc is not None: + result["doc"] = from_union([from_none, from_str], self.doc) + result["exportToToc"] = from_bool(self.export_to_toc) + result["fieldDefs"] = from_list(lambda x: to_class(FieldDefinition, x), self.field_defs) + result["fillOpacity"] = to_float(self.fill_opacity) + result["height"] = from_int(self.height) + result["hollow"] = from_bool(self.hollow) + result["identifier"] = from_str(self.identifier) + result["keepAspectRatio"] = from_bool(self.keep_aspect_ratio) + result["limitBehavior"] = to_enum(LimitBehavior, self.limit_behavior) + result["limitScope"] = to_enum(LimitScope, self.limit_scope) + result["lineOpacity"] = to_float(self.line_opacity) + result["maxCount"] = from_int(self.max_count) + if self.max_height is not None: + result["maxHeight"] = from_union([from_none, from_int], self.max_height) + if self.max_width is not None: + result["maxWidth"] = from_union([from_none, from_int], self.max_width) + if self.min_height is not None: + result["minHeight"] = from_union([from_none, from_int], self.min_height) + if self.min_width is not None: + result["minWidth"] = from_union([from_none, from_int], self.min_width) + result["nineSliceBorders"] = from_list(from_int, self.nine_slice_borders) + result["pivotX"] = to_float(self.pivot_x) + result["pivotY"] = to_float(self.pivot_y) + result["renderMode"] = to_enum(RenderMode, self.render_mode) + result["resizableX"] = from_bool(self.resizable_x) + result["resizableY"] = from_bool(self.resizable_y) + result["showName"] = from_bool(self.show_name) + result["tags"] = from_list(from_str, self.tags) + if self.tile_id is not None: + result["tileId"] = from_union([from_none, from_int], self.tile_id) + result["tileOpacity"] = to_float(self.tile_opacity) + if self.tile_rect is not None: + result["tileRect"] = from_union([from_none, lambda x: to_class(TilesetRectangle, x)], self.tile_rect) + result["tileRenderMode"] = to_enum(TileRenderMode, self.tile_render_mode) + if self.tileset_id is not None: + result["tilesetId"] = from_union([from_none, from_int], self.tileset_id) + result["uid"] = from_int(self.uid) + if self.ui_tile_rect is not None: + result["uiTileRect"] = from_union([from_none, lambda x: to_class(TilesetRectangle, x)], self.ui_tile_rect) + result["width"] = from_int(self.width) + return result + + +class EnumValueDefinition: + tile_src_rect: Optional[List[int]] + """**WARNING**: this deprecated value is no longer exported since version 1.4.0 Replaced + by: `tileRect` + """ + color: int + """Optional color""" + id: str + """Enum value""" + tile_id: Optional[int] + """**WARNING**: this deprecated value is no longer exported since version 1.4.0 Replaced + by: `tileRect` + """ + tile_rect: Optional[TilesetRectangle] + """Optional tileset rectangle to represents this value""" + + def __init__(self, tile_src_rect: Optional[List[int]], color: int, id: str, tile_id: Optional[int], tile_rect: Optional[TilesetRectangle]) -> None: + self.tile_src_rect = tile_src_rect + self.color = color + self.id = id + self.tile_id = tile_id + self.tile_rect = tile_rect + + @staticmethod + def from_dict(obj: Any) -> 'EnumValueDefinition': + assert isinstance(obj, dict) + tile_src_rect = from_union([from_none, lambda x: from_list(from_int, x)], obj.get("__tileSrcRect")) + color = from_int(obj.get("color")) + id = from_str(obj.get("id")) + tile_id = from_union([from_none, from_int], obj.get("tileId")) + tile_rect = from_union([from_none, TilesetRectangle.from_dict], obj.get("tileRect")) + return EnumValueDefinition(tile_src_rect, color, id, tile_id, tile_rect) + + def to_dict(self) -> dict: + result: dict = {} + if self.tile_src_rect is not None: + result["__tileSrcRect"] = from_union([from_none, lambda x: from_list(from_int, x)], self.tile_src_rect) + result["color"] = from_int(self.color) + result["id"] = from_str(self.id) + if self.tile_id is not None: + result["tileId"] = from_union([from_none, from_int], self.tile_id) + if self.tile_rect is not None: + result["tileRect"] = from_union([from_none, lambda x: to_class(TilesetRectangle, x)], self.tile_rect) + return result + + +class EnumDefinition: + external_file_checksum: Optional[str] + external_rel_path: Optional[str] + """Relative path to the external file providing this Enum""" + icon_tileset_uid: Optional[int] + """Tileset UID if provided""" + identifier: str + """User defined unique identifier""" + tags: List[str] + """An array of user-defined tags to organize the Enums""" + uid: int + """Unique Int identifier""" + values: List[EnumValueDefinition] + """All possible enum values, with their optional Tile infos.""" + + def __init__(self, external_file_checksum: Optional[str], external_rel_path: Optional[str], icon_tileset_uid: Optional[int], identifier: str, tags: List[str], uid: int, values: List[EnumValueDefinition]) -> None: + self.external_file_checksum = external_file_checksum + self.external_rel_path = external_rel_path + self.icon_tileset_uid = icon_tileset_uid + self.identifier = identifier + self.tags = tags + self.uid = uid + self.values = values + + @staticmethod + def from_dict(obj: Any) -> 'EnumDefinition': + assert isinstance(obj, dict) + external_file_checksum = from_union([from_none, from_str], obj.get("externalFileChecksum")) + external_rel_path = from_union([from_none, from_str], obj.get("externalRelPath")) + icon_tileset_uid = from_union([from_none, from_int], obj.get("iconTilesetUid")) + identifier = from_str(obj.get("identifier")) + tags = from_list(from_str, obj.get("tags")) + uid = from_int(obj.get("uid")) + values = from_list(EnumValueDefinition.from_dict, obj.get("values")) + return EnumDefinition(external_file_checksum, external_rel_path, icon_tileset_uid, identifier, tags, uid, values) + + def to_dict(self) -> dict: + result: dict = {} + if self.external_file_checksum is not None: + result["externalFileChecksum"] = from_union([from_none, from_str], self.external_file_checksum) + if self.external_rel_path is not None: + result["externalRelPath"] = from_union([from_none, from_str], self.external_rel_path) + if self.icon_tileset_uid is not None: + result["iconTilesetUid"] = from_union([from_none, from_int], self.icon_tileset_uid) + result["identifier"] = from_str(self.identifier) + result["tags"] = from_list(from_str, self.tags) + result["uid"] = from_int(self.uid) + result["values"] = from_list(lambda x: to_class(EnumValueDefinition, x), self.values) + return result + + +class Checker(Enum): + """Checker mode Possible values: `None`, `Horizontal`, `Vertical`""" + HORIZONTAL = "Horizontal" + NONE = "None" + VERTICAL = "Vertical" + + +class TileMode(Enum): + """Defines how tileIds array is used Possible values: `Single`, `Stamp`""" + SINGLE = "Single" + STAMP = "Stamp" + + +class AutoLayerRuleDefinition: + """This complex section isn't meant to be used by game devs at all, as these rules are + completely resolved internally by the editor before any saving. You should just ignore + this part. + """ + active: bool + """If FALSE, the rule effect isn't applied, and no tiles are generated.""" + alpha: float + break_on_match: bool + """When TRUE, the rule will prevent other rules to be applied in the same cell if it matches + (TRUE by default). + """ + chance: float + """Chances for this rule to be applied (0 to 1)""" + checker: Checker + """Checker mode Possible values: `None`, `Horizontal`, `Vertical`""" + flip_x: bool + """If TRUE, allow rule to be matched by flipping its pattern horizontally""" + flip_y: bool + """If TRUE, allow rule to be matched by flipping its pattern vertically""" + invalidated: bool + """If TRUE, then the rule should be re-evaluated by the editor at one point""" + out_of_bounds_value: Optional[int] + """Default IntGrid value when checking cells outside of level bounds""" + pattern: List[int] + """Rule pattern (size x size)""" + perlin_active: bool + """If TRUE, enable Perlin filtering to only apply rule on specific random area""" + perlin_octaves: float + perlin_scale: float + perlin_seed: float + pivot_x: float + """X pivot of a tile stamp (0-1)""" + pivot_y: float + """Y pivot of a tile stamp (0-1)""" + size: int + """Pattern width & height. Should only be 1,3,5 or 7.""" + tile_ids: Optional[List[int]] + """**WARNING**: this deprecated value is no longer exported since version 1.5.0 Replaced + by: `tileRectsIds` + """ + tile_mode: TileMode + """Defines how tileIds array is used Possible values: `Single`, `Stamp`""" + tile_random_x_max: int + """Max random offset for X tile pos""" + tile_random_x_min: int + """Min random offset for X tile pos""" + tile_random_y_max: int + """Max random offset for Y tile pos""" + tile_random_y_min: int + """Min random offset for Y tile pos""" + tile_rects_ids: List[List[int]] + """Array containing all the possible tile IDs rectangles (picked randomly).""" + tile_x_offset: int + """Tile X offset""" + tile_y_offset: int + """Tile Y offset""" + uid: int + """Unique Int identifier""" + x_modulo: int + """X cell coord modulo""" + x_offset: int + """X cell start offset""" + y_modulo: int + """Y cell coord modulo""" + y_offset: int + """Y cell start offset""" + + def __init__(self, active: bool, alpha: float, break_on_match: bool, chance: float, checker: Checker, flip_x: bool, flip_y: bool, invalidated: bool, out_of_bounds_value: Optional[int], pattern: List[int], perlin_active: bool, perlin_octaves: float, perlin_scale: float, perlin_seed: float, pivot_x: float, pivot_y: float, size: int, tile_ids: Optional[List[int]], tile_mode: TileMode, tile_random_x_max: int, tile_random_x_min: int, tile_random_y_max: int, tile_random_y_min: int, tile_rects_ids: List[List[int]], tile_x_offset: int, tile_y_offset: int, uid: int, x_modulo: int, x_offset: int, y_modulo: int, y_offset: int) -> None: + self.active = active + self.alpha = alpha + self.break_on_match = break_on_match + self.chance = chance + self.checker = checker + self.flip_x = flip_x + self.flip_y = flip_y + self.invalidated = invalidated + self.out_of_bounds_value = out_of_bounds_value + self.pattern = pattern + self.perlin_active = perlin_active + self.perlin_octaves = perlin_octaves + self.perlin_scale = perlin_scale + self.perlin_seed = perlin_seed + self.pivot_x = pivot_x + self.pivot_y = pivot_y + self.size = size + self.tile_ids = tile_ids + self.tile_mode = tile_mode + self.tile_random_x_max = tile_random_x_max + self.tile_random_x_min = tile_random_x_min + self.tile_random_y_max = tile_random_y_max + self.tile_random_y_min = tile_random_y_min + self.tile_rects_ids = tile_rects_ids + self.tile_x_offset = tile_x_offset + self.tile_y_offset = tile_y_offset + self.uid = uid + self.x_modulo = x_modulo + self.x_offset = x_offset + self.y_modulo = y_modulo + self.y_offset = y_offset + + @staticmethod + def from_dict(obj: Any) -> 'AutoLayerRuleDefinition': + assert isinstance(obj, dict) + active = from_bool(obj.get("active")) + alpha = from_float(obj.get("alpha")) + break_on_match = from_bool(obj.get("breakOnMatch")) + chance = from_float(obj.get("chance")) + checker = Checker(obj.get("checker")) + flip_x = from_bool(obj.get("flipX")) + flip_y = from_bool(obj.get("flipY")) + invalidated = from_bool(obj.get("invalidated")) + out_of_bounds_value = from_union([from_none, from_int], obj.get("outOfBoundsValue")) + pattern = from_list(from_int, obj.get("pattern")) + perlin_active = from_bool(obj.get("perlinActive")) + perlin_octaves = from_float(obj.get("perlinOctaves")) + perlin_scale = from_float(obj.get("perlinScale")) + perlin_seed = from_float(obj.get("perlinSeed")) + pivot_x = from_float(obj.get("pivotX")) + pivot_y = from_float(obj.get("pivotY")) + size = from_int(obj.get("size")) + tile_ids = from_union([from_none, lambda x: from_list(from_int, x)], obj.get("tileIds")) + tile_mode = TileMode(obj.get("tileMode")) + tile_random_x_max = from_int(obj.get("tileRandomXMax")) + tile_random_x_min = from_int(obj.get("tileRandomXMin")) + tile_random_y_max = from_int(obj.get("tileRandomYMax")) + tile_random_y_min = from_int(obj.get("tileRandomYMin")) + tile_rects_ids = from_list(lambda x: from_list(from_int, x), obj.get("tileRectsIds")) + tile_x_offset = from_int(obj.get("tileXOffset")) + tile_y_offset = from_int(obj.get("tileYOffset")) + uid = from_int(obj.get("uid")) + x_modulo = from_int(obj.get("xModulo")) + x_offset = from_int(obj.get("xOffset")) + y_modulo = from_int(obj.get("yModulo")) + y_offset = from_int(obj.get("yOffset")) + return AutoLayerRuleDefinition(active, alpha, break_on_match, chance, checker, flip_x, flip_y, invalidated, out_of_bounds_value, pattern, perlin_active, perlin_octaves, perlin_scale, perlin_seed, pivot_x, pivot_y, size, tile_ids, tile_mode, tile_random_x_max, tile_random_x_min, tile_random_y_max, tile_random_y_min, tile_rects_ids, tile_x_offset, tile_y_offset, uid, x_modulo, x_offset, y_modulo, y_offset) + + def to_dict(self) -> dict: + result: dict = {} + result["active"] = from_bool(self.active) + result["alpha"] = to_float(self.alpha) + result["breakOnMatch"] = from_bool(self.break_on_match) + result["chance"] = to_float(self.chance) + result["checker"] = to_enum(Checker, self.checker) + result["flipX"] = from_bool(self.flip_x) + result["flipY"] = from_bool(self.flip_y) + result["invalidated"] = from_bool(self.invalidated) + if self.out_of_bounds_value is not None: + result["outOfBoundsValue"] = from_union([from_none, from_int], self.out_of_bounds_value) + result["pattern"] = from_list(from_int, self.pattern) + result["perlinActive"] = from_bool(self.perlin_active) + result["perlinOctaves"] = to_float(self.perlin_octaves) + result["perlinScale"] = to_float(self.perlin_scale) + result["perlinSeed"] = to_float(self.perlin_seed) + result["pivotX"] = to_float(self.pivot_x) + result["pivotY"] = to_float(self.pivot_y) + result["size"] = from_int(self.size) + if self.tile_ids is not None: + result["tileIds"] = from_union([from_none, lambda x: from_list(from_int, x)], self.tile_ids) + result["tileMode"] = to_enum(TileMode, self.tile_mode) + result["tileRandomXMax"] = from_int(self.tile_random_x_max) + result["tileRandomXMin"] = from_int(self.tile_random_x_min) + result["tileRandomYMax"] = from_int(self.tile_random_y_max) + result["tileRandomYMin"] = from_int(self.tile_random_y_min) + result["tileRectsIds"] = from_list(lambda x: from_list(from_int, x), self.tile_rects_ids) + result["tileXOffset"] = from_int(self.tile_x_offset) + result["tileYOffset"] = from_int(self.tile_y_offset) + result["uid"] = from_int(self.uid) + result["xModulo"] = from_int(self.x_modulo) + result["xOffset"] = from_int(self.x_offset) + result["yModulo"] = from_int(self.y_modulo) + result["yOffset"] = from_int(self.y_offset) + return result + + +class AutoLayerRuleGroup: + active: bool + biome_requirement_mode: int + collapsed: Optional[bool] + """*This field was removed in 1.0.0 and should no longer be used.*""" + color: Optional[str] + icon: Optional[TilesetRectangle] + is_optional: bool + name: str + required_biome_values: List[str] + rules: List[AutoLayerRuleDefinition] + uid: int + uses_wizard: bool + + def __init__(self, active: bool, biome_requirement_mode: int, collapsed: Optional[bool], color: Optional[str], icon: Optional[TilesetRectangle], is_optional: bool, name: str, required_biome_values: List[str], rules: List[AutoLayerRuleDefinition], uid: int, uses_wizard: bool) -> None: + self.active = active + self.biome_requirement_mode = biome_requirement_mode + self.collapsed = collapsed + self.color = color + self.icon = icon + self.is_optional = is_optional + self.name = name + self.required_biome_values = required_biome_values + self.rules = rules + self.uid = uid + self.uses_wizard = uses_wizard + + @staticmethod + def from_dict(obj: Any) -> 'AutoLayerRuleGroup': + assert isinstance(obj, dict) + active = from_bool(obj.get("active")) + biome_requirement_mode = from_int(obj.get("biomeRequirementMode")) + collapsed = from_union([from_none, from_bool], obj.get("collapsed")) + color = from_union([from_none, from_str], obj.get("color")) + icon = from_union([from_none, TilesetRectangle.from_dict], obj.get("icon")) + is_optional = from_bool(obj.get("isOptional")) + name = from_str(obj.get("name")) + required_biome_values = from_list(from_str, obj.get("requiredBiomeValues")) + rules = from_list(AutoLayerRuleDefinition.from_dict, obj.get("rules")) + uid = from_int(obj.get("uid")) + uses_wizard = from_bool(obj.get("usesWizard")) + return AutoLayerRuleGroup(active, biome_requirement_mode, collapsed, color, icon, is_optional, name, required_biome_values, rules, uid, uses_wizard) + + def to_dict(self) -> dict: + result: dict = {} + result["active"] = from_bool(self.active) + result["biomeRequirementMode"] = from_int(self.biome_requirement_mode) + if self.collapsed is not None: + result["collapsed"] = from_union([from_none, from_bool], self.collapsed) + if self.color is not None: + result["color"] = from_union([from_none, from_str], self.color) + if self.icon is not None: + result["icon"] = from_union([from_none, lambda x: to_class(TilesetRectangle, x)], self.icon) + result["isOptional"] = from_bool(self.is_optional) + result["name"] = from_str(self.name) + result["requiredBiomeValues"] = from_list(from_str, self.required_biome_values) + result["rules"] = from_list(lambda x: to_class(AutoLayerRuleDefinition, x), self.rules) + result["uid"] = from_int(self.uid) + result["usesWizard"] = from_bool(self.uses_wizard) + return result + + +class IntGridValueDefinition: + """IntGrid value definition""" + color: str + group_uid: int + """Parent group identifier (0 if none)""" + identifier: Optional[str] + """User defined unique identifier""" + tile: Optional[TilesetRectangle] + value: int + """The IntGrid value itself""" + + def __init__(self, color: str, group_uid: int, identifier: Optional[str], tile: Optional[TilesetRectangle], value: int) -> None: + self.color = color + self.group_uid = group_uid + self.identifier = identifier + self.tile = tile + self.value = value + + @staticmethod + def from_dict(obj: Any) -> 'IntGridValueDefinition': + assert isinstance(obj, dict) + color = from_str(obj.get("color")) + group_uid = from_int(obj.get("groupUid")) + identifier = from_union([from_none, from_str], obj.get("identifier")) + tile = from_union([from_none, TilesetRectangle.from_dict], obj.get("tile")) + value = from_int(obj.get("value")) + return IntGridValueDefinition(color, group_uid, identifier, tile, value) + + def to_dict(self) -> dict: + result: dict = {} + result["color"] = from_str(self.color) + result["groupUid"] = from_int(self.group_uid) + if self.identifier is not None: + result["identifier"] = from_union([from_none, from_str], self.identifier) + if self.tile is not None: + result["tile"] = from_union([from_none, lambda x: to_class(TilesetRectangle, x)], self.tile) + result["value"] = from_int(self.value) + return result + + +class IntGridValueGroupDefinition: + """IntGrid value group definition""" + color: Optional[str] + """User defined color""" + identifier: Optional[str] + """User defined string identifier""" + uid: int + """Group unique ID""" + + def __init__(self, color: Optional[str], identifier: Optional[str], uid: int) -> None: + self.color = color + self.identifier = identifier + self.uid = uid + + @staticmethod + def from_dict(obj: Any) -> 'IntGridValueGroupDefinition': + assert isinstance(obj, dict) + color = from_union([from_none, from_str], obj.get("color")) + identifier = from_union([from_none, from_str], obj.get("identifier")) + uid = from_int(obj.get("uid")) + return IntGridValueGroupDefinition(color, identifier, uid) + + def to_dict(self) -> dict: + result: dict = {} + if self.color is not None: + result["color"] = from_union([from_none, from_str], self.color) + if self.identifier is not None: + result["identifier"] = from_union([from_none, from_str], self.identifier) + result["uid"] = from_int(self.uid) + return result + + +class TypeEnum(Enum): + """Type of the layer as Haxe Enum Possible values: `IntGrid`, `Entities`, `Tiles`, + `AutoLayer` + """ + AUTO_LAYER = "AutoLayer" + ENTITIES = "Entities" + INT_GRID = "IntGrid" + TILES = "Tiles" + + +class LayerDefinition: + type: str + """Type of the layer (*IntGrid, Entities, Tiles or AutoLayer*)""" + auto_rule_groups: List[AutoLayerRuleGroup] + """Contains all the auto-layer rule definitions.""" + auto_source_layer_def_uid: Optional[int] + auto_tileset_def_uid: Optional[int] + """**WARNING**: this deprecated value is no longer exported since version 1.2.0 Replaced + by: `tilesetDefUid` + """ + auto_tiles_killed_by_other_layer_uid: Optional[int] + biome_field_uid: Optional[int] + can_select_when_inactive: bool + """Allow editor selections when the layer is not currently active.""" + display_opacity: float + """Opacity of the layer (0 to 1.0)""" + doc: Optional[str] + """User defined documentation for this element to provide help/tips to level designers.""" + excluded_tags: List[str] + """An array of tags to forbid some Entities in this layer""" + grid_size: int + """Width and height of the grid in pixels""" + guide_grid_hei: int + """Height of the optional "guide" grid in pixels""" + guide_grid_wid: int + """Width of the optional "guide" grid in pixels""" + hide_fields_when_inactive: bool + hide_in_list: bool + """Hide the layer from the list on the side of the editor view.""" + identifier: str + """User defined unique identifier""" + inactive_opacity: float + """Alpha of this layer when it is not the active one.""" + int_grid_values: List[IntGridValueDefinition] + """An array that defines extra optional info for each IntGrid value.
WARNING: the + array order is not related to actual IntGrid values! As user can re-order IntGrid values + freely, you may value "2" before value "1" in this array. + """ + int_grid_values_groups: List[IntGridValueGroupDefinition] + """Group informations for IntGrid values""" + parallax_factor_x: float + """Parallax horizontal factor (from -1 to 1, defaults to 0) which affects the scrolling + speed of this layer, creating a fake 3D (parallax) effect. + """ + parallax_factor_y: float + """Parallax vertical factor (from -1 to 1, defaults to 0) which affects the scrolling speed + of this layer, creating a fake 3D (parallax) effect. + """ + parallax_scaling: bool + """If true (default), a layer with a parallax factor will also be scaled up/down accordingly.""" + px_offset_x: int + """X offset of the layer, in pixels (IMPORTANT: this should be added to the `LayerInstance` + optional offset) + """ + px_offset_y: int + """Y offset of the layer, in pixels (IMPORTANT: this should be added to the `LayerInstance` + optional offset) + """ + render_in_world_view: bool + """If TRUE, the content of this layer will be used when rendering levels in a simplified way + for the world view + """ + required_tags: List[str] + """An array of tags to filter Entities that can be added to this layer""" + tile_pivot_x: float + """If the tiles are smaller or larger than the layer grid, the pivot value will be used to + position the tile relatively its grid cell. + """ + tile_pivot_y: float + """If the tiles are smaller or larger than the layer grid, the pivot value will be used to + position the tile relatively its grid cell. + """ + tileset_def_uid: Optional[int] + """Reference to the default Tileset UID being used by this layer definition.
+ **WARNING**: some layer *instances* might use a different tileset. So most of the time, + you should probably use the `__tilesetDefUid` value found in layer instances.
Note: + since version 1.0.0, the old `autoTilesetDefUid` was removed and merged into this value. + """ + layer_definition_type: TypeEnum + """Type of the layer as Haxe Enum Possible values: `IntGrid`, `Entities`, `Tiles`, + `AutoLayer` + """ + ui_color: Optional[str] + """User defined color for the UI""" + uid: int + """Unique Int identifier""" + ui_filter_tags: List[str] + """Display tags""" + use_async_render: bool + """Asynchronous rendering option for large/complex layers""" + + def __init__(self, type: str, auto_rule_groups: List[AutoLayerRuleGroup], auto_source_layer_def_uid: Optional[int], auto_tileset_def_uid: Optional[int], auto_tiles_killed_by_other_layer_uid: Optional[int], biome_field_uid: Optional[int], can_select_when_inactive: bool, display_opacity: float, doc: Optional[str], excluded_tags: List[str], grid_size: int, guide_grid_hei: int, guide_grid_wid: int, hide_fields_when_inactive: bool, hide_in_list: bool, identifier: str, inactive_opacity: float, int_grid_values: List[IntGridValueDefinition], int_grid_values_groups: List[IntGridValueGroupDefinition], parallax_factor_x: float, parallax_factor_y: float, parallax_scaling: bool, px_offset_x: int, px_offset_y: int, render_in_world_view: bool, required_tags: List[str], tile_pivot_x: float, tile_pivot_y: float, tileset_def_uid: Optional[int], layer_definition_type: TypeEnum, ui_color: Optional[str], uid: int, ui_filter_tags: List[str], use_async_render: bool) -> None: + self.type = type + self.auto_rule_groups = auto_rule_groups + self.auto_source_layer_def_uid = auto_source_layer_def_uid + self.auto_tileset_def_uid = auto_tileset_def_uid + self.auto_tiles_killed_by_other_layer_uid = auto_tiles_killed_by_other_layer_uid + self.biome_field_uid = biome_field_uid + self.can_select_when_inactive = can_select_when_inactive + self.display_opacity = display_opacity + self.doc = doc + self.excluded_tags = excluded_tags + self.grid_size = grid_size + self.guide_grid_hei = guide_grid_hei + self.guide_grid_wid = guide_grid_wid + self.hide_fields_when_inactive = hide_fields_when_inactive + self.hide_in_list = hide_in_list + self.identifier = identifier + self.inactive_opacity = inactive_opacity + self.int_grid_values = int_grid_values + self.int_grid_values_groups = int_grid_values_groups + self.parallax_factor_x = parallax_factor_x + self.parallax_factor_y = parallax_factor_y + self.parallax_scaling = parallax_scaling + self.px_offset_x = px_offset_x + self.px_offset_y = px_offset_y + self.render_in_world_view = render_in_world_view + self.required_tags = required_tags + self.tile_pivot_x = tile_pivot_x + self.tile_pivot_y = tile_pivot_y + self.tileset_def_uid = tileset_def_uid + self.layer_definition_type = layer_definition_type + self.ui_color = ui_color + self.uid = uid + self.ui_filter_tags = ui_filter_tags + self.use_async_render = use_async_render + + @staticmethod + def from_dict(obj: Any) -> 'LayerDefinition': + assert isinstance(obj, dict) + type = from_str(obj.get("__type")) + auto_rule_groups = from_list(AutoLayerRuleGroup.from_dict, obj.get("autoRuleGroups")) + auto_source_layer_def_uid = from_union([from_none, from_int], obj.get("autoSourceLayerDefUid")) + auto_tileset_def_uid = from_union([from_none, from_int], obj.get("autoTilesetDefUid")) + auto_tiles_killed_by_other_layer_uid = from_union([from_none, from_int], obj.get("autoTilesKilledByOtherLayerUid")) + biome_field_uid = from_union([from_none, from_int], obj.get("biomeFieldUid")) + can_select_when_inactive = from_bool(obj.get("canSelectWhenInactive")) + display_opacity = from_float(obj.get("displayOpacity")) + doc = from_union([from_none, from_str], obj.get("doc")) + excluded_tags = from_list(from_str, obj.get("excludedTags")) + grid_size = from_int(obj.get("gridSize")) + guide_grid_hei = from_int(obj.get("guideGridHei")) + guide_grid_wid = from_int(obj.get("guideGridWid")) + hide_fields_when_inactive = from_bool(obj.get("hideFieldsWhenInactive")) + hide_in_list = from_bool(obj.get("hideInList")) + identifier = from_str(obj.get("identifier")) + inactive_opacity = from_float(obj.get("inactiveOpacity")) + int_grid_values = from_list(IntGridValueDefinition.from_dict, obj.get("intGridValues")) + int_grid_values_groups = from_list(IntGridValueGroupDefinition.from_dict, obj.get("intGridValuesGroups")) + parallax_factor_x = from_float(obj.get("parallaxFactorX")) + parallax_factor_y = from_float(obj.get("parallaxFactorY")) + parallax_scaling = from_bool(obj.get("parallaxScaling")) + px_offset_x = from_int(obj.get("pxOffsetX")) + px_offset_y = from_int(obj.get("pxOffsetY")) + render_in_world_view = from_bool(obj.get("renderInWorldView")) + required_tags = from_list(from_str, obj.get("requiredTags")) + tile_pivot_x = from_float(obj.get("tilePivotX")) + tile_pivot_y = from_float(obj.get("tilePivotY")) + tileset_def_uid = from_union([from_none, from_int], obj.get("tilesetDefUid")) + layer_definition_type = TypeEnum(obj.get("type")) + ui_color = from_union([from_none, from_str], obj.get("uiColor")) + uid = from_int(obj.get("uid")) + ui_filter_tags = from_list(from_str, obj.get("uiFilterTags")) + use_async_render = from_bool(obj.get("useAsyncRender")) + return LayerDefinition(type, auto_rule_groups, auto_source_layer_def_uid, auto_tileset_def_uid, auto_tiles_killed_by_other_layer_uid, biome_field_uid, can_select_when_inactive, display_opacity, doc, excluded_tags, grid_size, guide_grid_hei, guide_grid_wid, hide_fields_when_inactive, hide_in_list, identifier, inactive_opacity, int_grid_values, int_grid_values_groups, parallax_factor_x, parallax_factor_y, parallax_scaling, px_offset_x, px_offset_y, render_in_world_view, required_tags, tile_pivot_x, tile_pivot_y, tileset_def_uid, layer_definition_type, ui_color, uid, ui_filter_tags, use_async_render) + + def to_dict(self) -> dict: + result: dict = {} + result["__type"] = from_str(self.type) + result["autoRuleGroups"] = from_list(lambda x: to_class(AutoLayerRuleGroup, x), self.auto_rule_groups) + if self.auto_source_layer_def_uid is not None: + result["autoSourceLayerDefUid"] = from_union([from_none, from_int], self.auto_source_layer_def_uid) + if self.auto_tileset_def_uid is not None: + result["autoTilesetDefUid"] = from_union([from_none, from_int], self.auto_tileset_def_uid) + if self.auto_tiles_killed_by_other_layer_uid is not None: + result["autoTilesKilledByOtherLayerUid"] = from_union([from_none, from_int], self.auto_tiles_killed_by_other_layer_uid) + if self.biome_field_uid is not None: + result["biomeFieldUid"] = from_union([from_none, from_int], self.biome_field_uid) + result["canSelectWhenInactive"] = from_bool(self.can_select_when_inactive) + result["displayOpacity"] = to_float(self.display_opacity) + if self.doc is not None: + result["doc"] = from_union([from_none, from_str], self.doc) + result["excludedTags"] = from_list(from_str, self.excluded_tags) + result["gridSize"] = from_int(self.grid_size) + result["guideGridHei"] = from_int(self.guide_grid_hei) + result["guideGridWid"] = from_int(self.guide_grid_wid) + result["hideFieldsWhenInactive"] = from_bool(self.hide_fields_when_inactive) + result["hideInList"] = from_bool(self.hide_in_list) + result["identifier"] = from_str(self.identifier) + result["inactiveOpacity"] = to_float(self.inactive_opacity) + result["intGridValues"] = from_list(lambda x: to_class(IntGridValueDefinition, x), self.int_grid_values) + result["intGridValuesGroups"] = from_list(lambda x: to_class(IntGridValueGroupDefinition, x), self.int_grid_values_groups) + result["parallaxFactorX"] = to_float(self.parallax_factor_x) + result["parallaxFactorY"] = to_float(self.parallax_factor_y) + result["parallaxScaling"] = from_bool(self.parallax_scaling) + result["pxOffsetX"] = from_int(self.px_offset_x) + result["pxOffsetY"] = from_int(self.px_offset_y) + result["renderInWorldView"] = from_bool(self.render_in_world_view) + result["requiredTags"] = from_list(from_str, self.required_tags) + result["tilePivotX"] = to_float(self.tile_pivot_x) + result["tilePivotY"] = to_float(self.tile_pivot_y) + if self.tileset_def_uid is not None: + result["tilesetDefUid"] = from_union([from_none, from_int], self.tileset_def_uid) + result["type"] = to_enum(TypeEnum, self.layer_definition_type) + if self.ui_color is not None: + result["uiColor"] = from_union([from_none, from_str], self.ui_color) + result["uid"] = from_int(self.uid) + result["uiFilterTags"] = from_list(from_str, self.ui_filter_tags) + result["useAsyncRender"] = from_bool(self.use_async_render) + return result + + +class TileCustomMetadata: + """In a tileset definition, user defined meta-data of a tile.""" + data: str + tile_id: int + + def __init__(self, data: str, tile_id: int) -> None: + self.data = data + self.tile_id = tile_id + + @staticmethod + def from_dict(obj: Any) -> 'TileCustomMetadata': + assert isinstance(obj, dict) + data = from_str(obj.get("data")) + tile_id = from_int(obj.get("tileId")) + return TileCustomMetadata(data, tile_id) + + def to_dict(self) -> dict: + result: dict = {} + result["data"] = from_str(self.data) + result["tileId"] = from_int(self.tile_id) + return result + + +class EmbedAtlas(Enum): + LDTK_ICONS = "LdtkIcons" + + +class EnumTagValue: + """In a tileset definition, enum based tag infos""" + enum_value_id: str + tile_ids: List[int] + + def __init__(self, enum_value_id: str, tile_ids: List[int]) -> None: + self.enum_value_id = enum_value_id + self.tile_ids = tile_ids + + @staticmethod + def from_dict(obj: Any) -> 'EnumTagValue': + assert isinstance(obj, dict) + enum_value_id = from_str(obj.get("enumValueId")) + tile_ids = from_list(from_int, obj.get("tileIds")) + return EnumTagValue(enum_value_id, tile_ids) + + def to_dict(self) -> dict: + result: dict = {} + result["enumValueId"] = from_str(self.enum_value_id) + result["tileIds"] = from_list(from_int, self.tile_ids) + return result + + +class TilesetDefinition: + """The `Tileset` definition is the most important part among project definitions. It + contains some extra informations about each integrated tileset. If you only had to parse + one definition section, that would be the one. + """ + c_hei: int + """Grid-based height""" + c_wid: int + """Grid-based width""" + cached_pixel_data: Optional[Dict[str, Any]] + """The following data is used internally for various optimizations. It's always synced with + source image changes. + """ + custom_data: List[TileCustomMetadata] + """An array of custom tile metadata""" + embed_atlas: Optional[EmbedAtlas] + """If this value is set, then it means that this atlas uses an internal LDtk atlas image + instead of a loaded one. Possible values: <`null`>, `LdtkIcons` + """ + enum_tags: List[EnumTagValue] + """Tileset tags using Enum values specified by `tagsSourceEnumId`. This array contains 1 + element per Enum value, which contains an array of all Tile IDs that are tagged with it. + """ + identifier: str + """User defined unique identifier""" + padding: int + """Distance in pixels from image borders""" + px_hei: int + """Image height in pixels""" + px_wid: int + """Image width in pixels""" + rel_path: Optional[str] + """Path to the source file, relative to the current project JSON file
It can be null + if no image was provided, or when using an embed atlas. + """ + saved_selections: List[Dict[str, Any]] + """Array of group of tiles selections, only meant to be used in the editor""" + spacing: int + """Space in pixels between all tiles""" + tags: List[str] + """An array of user-defined tags to organize the Tilesets""" + tags_source_enum_uid: Optional[int] + """Optional Enum definition UID used for this tileset meta-data""" + tile_grid_size: int + uid: int + """Unique Intidentifier""" + + def __init__(self, c_hei: int, c_wid: int, cached_pixel_data: Optional[Dict[str, Any]], custom_data: List[TileCustomMetadata], embed_atlas: Optional[EmbedAtlas], enum_tags: List[EnumTagValue], identifier: str, padding: int, px_hei: int, px_wid: int, rel_path: Optional[str], saved_selections: List[Dict[str, Any]], spacing: int, tags: List[str], tags_source_enum_uid: Optional[int], tile_grid_size: int, uid: int) -> None: + self.c_hei = c_hei + self.c_wid = c_wid + self.cached_pixel_data = cached_pixel_data + self.custom_data = custom_data + self.embed_atlas = embed_atlas + self.enum_tags = enum_tags + self.identifier = identifier + self.padding = padding + self.px_hei = px_hei + self.px_wid = px_wid + self.rel_path = rel_path + self.saved_selections = saved_selections + self.spacing = spacing + self.tags = tags + self.tags_source_enum_uid = tags_source_enum_uid + self.tile_grid_size = tile_grid_size + self.uid = uid + + @staticmethod + def from_dict(obj: Any) -> 'TilesetDefinition': + assert isinstance(obj, dict) + c_hei = from_int(obj.get("__cHei")) + c_wid = from_int(obj.get("__cWid")) + cached_pixel_data = from_union([from_none, lambda x: from_dict(lambda x: x, x)], obj.get("cachedPixelData")) + custom_data = from_list(TileCustomMetadata.from_dict, obj.get("customData")) + embed_atlas = from_union([from_none, EmbedAtlas], obj.get("embedAtlas")) + enum_tags = from_list(EnumTagValue.from_dict, obj.get("enumTags")) + identifier = from_str(obj.get("identifier")) + padding = from_int(obj.get("padding")) + px_hei = from_int(obj.get("pxHei")) + px_wid = from_int(obj.get("pxWid")) + rel_path = from_union([from_none, from_str], obj.get("relPath")) + saved_selections = from_list(lambda x: from_dict(lambda x: x, x), obj.get("savedSelections")) + spacing = from_int(obj.get("spacing")) + tags = from_list(from_str, obj.get("tags")) + tags_source_enum_uid = from_union([from_none, from_int], obj.get("tagsSourceEnumUid")) + tile_grid_size = from_int(obj.get("tileGridSize")) + uid = from_int(obj.get("uid")) + return TilesetDefinition(c_hei, c_wid, cached_pixel_data, custom_data, embed_atlas, enum_tags, identifier, padding, px_hei, px_wid, rel_path, saved_selections, spacing, tags, tags_source_enum_uid, tile_grid_size, uid) + + def to_dict(self) -> dict: + result: dict = {} + result["__cHei"] = from_int(self.c_hei) + result["__cWid"] = from_int(self.c_wid) + if self.cached_pixel_data is not None: + result["cachedPixelData"] = from_union([from_none, lambda x: from_dict(lambda x: x, x)], self.cached_pixel_data) + result["customData"] = from_list(lambda x: to_class(TileCustomMetadata, x), self.custom_data) + if self.embed_atlas is not None: + result["embedAtlas"] = from_union([from_none, lambda x: to_enum(EmbedAtlas, x)], self.embed_atlas) + result["enumTags"] = from_list(lambda x: to_class(EnumTagValue, x), self.enum_tags) + result["identifier"] = from_str(self.identifier) + result["padding"] = from_int(self.padding) + result["pxHei"] = from_int(self.px_hei) + result["pxWid"] = from_int(self.px_wid) + if self.rel_path is not None: + result["relPath"] = from_union([from_none, from_str], self.rel_path) + result["savedSelections"] = from_list(lambda x: from_dict(lambda x: x, x), self.saved_selections) + result["spacing"] = from_int(self.spacing) + result["tags"] = from_list(from_str, self.tags) + if self.tags_source_enum_uid is not None: + result["tagsSourceEnumUid"] = from_union([from_none, from_int], self.tags_source_enum_uid) + result["tileGridSize"] = from_int(self.tile_grid_size) + result["uid"] = from_int(self.uid) + return result + + +class Definitions: + """If you're writing your own LDtk importer, you should probably just ignore *most* stuff in + the `defs` section, as it contains data that are mostly important to the editor. To keep + you away from the `defs` section and avoid some unnecessary JSON parsing, important data + from definitions is often duplicated in fields prefixed with a double underscore (eg. + `__identifier` or `__type`). The 2 only definition types you might need here are + **Tilesets** and **Enums**. + + A structure containing all the definitions of this project + """ + entities: List[EntityDefinition] + """All entities definitions, including their custom fields""" + enums: List[EnumDefinition] + """All internal enums""" + external_enums: List[EnumDefinition] + """Note: external enums are exactly the same as `enums`, except they have a `relPath` to + point to an external source file. + """ + layers: List[LayerDefinition] + """All layer definitions""" + level_fields: List[FieldDefinition] + """All custom fields available to all levels.""" + tilesets: List[TilesetDefinition] + """All tilesets""" + + def __init__(self, entities: List[EntityDefinition], enums: List[EnumDefinition], external_enums: List[EnumDefinition], layers: List[LayerDefinition], level_fields: List[FieldDefinition], tilesets: List[TilesetDefinition]) -> None: + self.entities = entities + self.enums = enums + self.external_enums = external_enums + self.layers = layers + self.level_fields = level_fields + self.tilesets = tilesets + + @staticmethod + def from_dict(obj: Any) -> 'Definitions': + assert isinstance(obj, dict) + entities = from_list(EntityDefinition.from_dict, obj.get("entities")) + enums = from_list(EnumDefinition.from_dict, obj.get("enums")) + external_enums = from_list(EnumDefinition.from_dict, obj.get("externalEnums")) + layers = from_list(LayerDefinition.from_dict, obj.get("layers")) + level_fields = from_list(FieldDefinition.from_dict, obj.get("levelFields")) + tilesets = from_list(TilesetDefinition.from_dict, obj.get("tilesets")) + return Definitions(entities, enums, external_enums, layers, level_fields, tilesets) + + def to_dict(self) -> dict: + result: dict = {} + result["entities"] = from_list(lambda x: to_class(EntityDefinition, x), self.entities) + result["enums"] = from_list(lambda x: to_class(EnumDefinition, x), self.enums) + result["externalEnums"] = from_list(lambda x: to_class(EnumDefinition, x), self.external_enums) + result["layers"] = from_list(lambda x: to_class(LayerDefinition, x), self.layers) + result["levelFields"] = from_list(lambda x: to_class(FieldDefinition, x), self.level_fields) + result["tilesets"] = from_list(lambda x: to_class(TilesetDefinition, x), self.tilesets) + return result + + +class Flag(Enum): + DISCARD_PRE_CSV_INT_GRID = "DiscardPreCsvIntGrid" + EXPORT_OLD_TABLE_OF_CONTENT_DATA = "ExportOldTableOfContentData" + EXPORT_PRE_CSV_INT_GRID_FORMAT = "ExportPreCsvIntGridFormat" + IGNORE_BACKUP_SUGGEST = "IgnoreBackupSuggest" + MULTI_WORLDS = "MultiWorlds" + PREPEND_INDEX_TO_LEVEL_FILE_NAMES = "PrependIndexToLevelFileNames" + USE_MULTILINES_TYPE = "UseMultilinesType" + + +class FieldInstance: + identifier: str + """Field definition identifier""" + tile: Optional[TilesetRectangle] + """Optional TilesetRect used to display this field (this can be the field own Tile, or some + other Tile guessed from the value, like an Enum). + """ + type: str + """Type of the field, such as `Int`, `Float`, `String`, `Enum(my_enum_name)`, `Bool`, + etc.
NOTE: if you enable the advanced option **Use Multilines type**, you will have + "*Multilines*" instead of "*String*" when relevant. + """ + value: Any + """Actual value of the field instance. The value type varies, depending on `__type`:
+ - For **classic types** (ie. Integer, Float, Boolean, String, Text and FilePath), you + just get the actual value with the expected type.
- For **rl.Color**, the value is an + hexadecimal string using "#rrggbb" format.
- For **Enum**, the value is a String + representing the selected enum value.
- For **Point**, the value is a + [GridPoint](#ldtk-GridPoint) object.
- For **Tile**, the value is a + [TilesetRect](#ldtk-TilesetRect) object.
- For **EntityRef**, the value is an + [EntityReferenceInfos](#ldtk-EntityReferenceInfos) object.

If the field is an + array, then this `__value` will also be a JSON array. + """ + def_uid: int + """Reference of the **Field definition** UID""" + real_editor_values: List[Any] + """Editor internal raw values""" + + def __init__(self, identifier: str, tile: Optional[TilesetRectangle], type: str, value: Any, def_uid: int, real_editor_values: List[Any]) -> None: + self.identifier = identifier + self.tile = tile + self.type = type + self.value = value + self.def_uid = def_uid + self.real_editor_values = real_editor_values + + @staticmethod + def from_dict(obj: Any) -> 'FieldInstance': + assert isinstance(obj, dict) + identifier = from_str(obj.get("__identifier")) + tile = from_union([from_none, TilesetRectangle.from_dict], obj.get("__tile")) + type = from_str(obj.get("__type")) + value = obj.get("__value") + def_uid = from_int(obj.get("defUid")) + real_editor_values = from_list(lambda x: x, obj.get("realEditorValues")) + return FieldInstance(identifier, tile, type, value, def_uid, real_editor_values) + + def to_dict(self) -> dict: + result: dict = {} + result["__identifier"] = from_str(self.identifier) + if self.tile is not None: + result["__tile"] = from_union([from_none, lambda x: to_class(TilesetRectangle, x)], self.tile) + result["__type"] = from_str(self.type) + result["__value"] = self.value + result["defUid"] = from_int(self.def_uid) + result["realEditorValues"] = from_list(lambda x: x, self.real_editor_values) + return result + + +class EntityInstance: + grid: List[int] + """Grid-based coordinates (`[x,y]` format)""" + identifier: str + """Entity definition identifier""" + pivot: List[float] + """Pivot coordinates (`[x,y]` format, values are from 0 to 1) of the Entity""" + smart_color: str + """The entity "smart" color, guessed from either Entity definition, or one its field + instances. + """ + tags: List[str] + """Array of tags defined in this Entity definition""" + tile: Optional[TilesetRectangle] + """Optional TilesetRect used to display this entity (it could either be the default Entity + tile, or some tile provided by a field value, like an Enum). + """ + world_x: Optional[int] + """X world coordinate in pixels. Only available in GridVania or Free world layouts.""" + world_y: Optional[int] + """Y world coordinate in pixels Only available in GridVania or Free world layouts.""" + def_uid: int + """Reference of the **Entity definition** UID""" + field_instances: List[FieldInstance] + """An array of all custom fields and their values.""" + height: int + """Entity height in pixels. For non-resizable entities, it will be the same as Entity + definition. + """ + iid: str + """Unique instance identifier""" + px: List[int] + """Pixel coordinates (`[x,y]` format) in current level coordinate space. Don't forget + optional layer offsets, if they exist! + """ + width: int + """Entity width in pixels. For non-resizable entities, it will be the same as Entity + definition. + """ + + def __init__(self, grid: List[int], identifier: str, pivot: List[float], smart_color: str, tags: List[str], tile: Optional[TilesetRectangle], world_x: Optional[int], world_y: Optional[int], def_uid: int, field_instances: List[FieldInstance], height: int, iid: str, px: List[int], width: int) -> None: + self.grid = grid + self.identifier = identifier + self.pivot = pivot + self.smart_color = smart_color + self.tags = tags + self.tile = tile + self.world_x = world_x + self.world_y = world_y + self.def_uid = def_uid + self.field_instances = field_instances + self.height = height + self.iid = iid + self.px = px + self.width = width + + @staticmethod + def from_dict(obj: Any) -> 'EntityInstance': + assert isinstance(obj, dict) + grid = from_list(from_int, obj.get("__grid")) + identifier = from_str(obj.get("__identifier")) + pivot = from_list(from_float, obj.get("__pivot")) + smart_color = from_str(obj.get("__smartColor")) + tags = from_list(from_str, obj.get("__tags")) + tile = from_union([from_none, TilesetRectangle.from_dict], obj.get("__tile")) + world_x = from_union([from_none, from_int], obj.get("__worldX")) + world_y = from_union([from_none, from_int], obj.get("__worldY")) + def_uid = from_int(obj.get("defUid")) + field_instances = from_list(FieldInstance.from_dict, obj.get("fieldInstances")) + height = from_int(obj.get("height")) + iid = from_str(obj.get("iid")) + px = from_list(from_int, obj.get("px")) + width = from_int(obj.get("width")) + return EntityInstance(grid, identifier, pivot, smart_color, tags, tile, world_x, world_y, def_uid, field_instances, height, iid, px, width) + + def to_dict(self) -> dict: + result: dict = {} + result["__grid"] = from_list(from_int, self.grid) + result["__identifier"] = from_str(self.identifier) + result["__pivot"] = from_list(to_float, self.pivot) + result["__smartColor"] = from_str(self.smart_color) + result["__tags"] = from_list(from_str, self.tags) + if self.tile is not None: + result["__tile"] = from_union([from_none, lambda x: to_class(TilesetRectangle, x)], self.tile) + if self.world_x is not None: + result["__worldX"] = from_union([from_none, from_int], self.world_x) + if self.world_y is not None: + result["__worldY"] = from_union([from_none, from_int], self.world_y) + result["defUid"] = from_int(self.def_uid) + result["fieldInstances"] = from_list(lambda x: to_class(FieldInstance, x), self.field_instances) + result["height"] = from_int(self.height) + result["iid"] = from_str(self.iid) + result["px"] = from_list(from_int, self.px) + result["width"] = from_int(self.width) + return result + + +class ReferenceToAnEntityInstance: + """This object describes the "location" of an Entity instance in the project worlds. + + IID information of this instance + """ + entity_iid: str + """IID of the refered EntityInstance""" + layer_iid: str + """IID of the LayerInstance containing the refered EntityInstance""" + level_iid: str + """IID of the Level containing the refered EntityInstance""" + world_iid: str + """IID of the World containing the refered EntityInstance""" + + def __init__(self, entity_iid: str, layer_iid: str, level_iid: str, world_iid: str) -> None: + self.entity_iid = entity_iid + self.layer_iid = layer_iid + self.level_iid = level_iid + self.world_iid = world_iid + + @staticmethod + def from_dict(obj: Any) -> 'ReferenceToAnEntityInstance': + assert isinstance(obj, dict) + entity_iid = from_str(obj.get("entityIid")) + layer_iid = from_str(obj.get("layerIid")) + level_iid = from_str(obj.get("levelIid")) + world_iid = from_str(obj.get("worldIid")) + return ReferenceToAnEntityInstance(entity_iid, layer_iid, level_iid, world_iid) + + def to_dict(self) -> dict: + result: dict = {} + result["entityIid"] = from_str(self.entity_iid) + result["layerIid"] = from_str(self.layer_iid) + result["levelIid"] = from_str(self.level_iid) + result["worldIid"] = from_str(self.world_iid) + return result + + +class GridPoint: + """This object is just a grid-based coordinate used in Field values.""" + cx: int + """X grid-based coordinate""" + cy: int + """Y grid-based coordinate""" + + def __init__(self, cx: int, cy: int) -> None: + self.cx = cx + self.cy = cy + + @staticmethod + def from_dict(obj: Any) -> 'GridPoint': + assert isinstance(obj, dict) + cx = from_int(obj.get("cx")) + cy = from_int(obj.get("cy")) + return GridPoint(cx, cy) + + def to_dict(self) -> dict: + result: dict = {} + result["cx"] = from_int(self.cx) + result["cy"] = from_int(self.cy) + return result + + +class IntGridValueInstance: + """IntGrid value instance""" + coord_id: int + """Coordinate ID in the layer grid""" + v: int + """IntGrid value""" + + def __init__(self, coord_id: int, v: int) -> None: + self.coord_id = coord_id + self.v = v + + @staticmethod + def from_dict(obj: Any) -> 'IntGridValueInstance': + assert isinstance(obj, dict) + coord_id = from_int(obj.get("coordId")) + v = from_int(obj.get("v")) + return IntGridValueInstance(coord_id, v) + + def to_dict(self) -> dict: + result: dict = {} + result["coordId"] = from_int(self.coord_id) + result["v"] = from_int(self.v) + return result + + +class TileInstance: + """This structure represents a single tile from a given Tileset.""" + a: float + """Alpha/opacity of the tile (0-1, defaults to 1)""" + d: List[int] + """Internal data used by the editor.
For auto-layer tiles: `[ruleId, coordId]`.
+ For tile-layer tiles: `[coordId]`. + """ + f: int + """"Flip bits", a 2-bits integer to represent the mirror transformations of the tile.
+ - Bit 0 = X flip
- Bit 1 = Y flip
Examples: f=0 (no flip), f=1 (X flip + only), f=2 (Y flip only), f=3 (both flips) + """ + px: List[int] + """Pixel coordinates of the tile in the **layer** (`[x,y]` format). Don't forget optional + layer offsets, if they exist! + """ + src: List[int] + """Pixel coordinates of the tile in the **tileset** (`[x,y]` format)""" + t: int + """The *Tile ID* in the corresponding tileset.""" + + def __init__(self, a: float, d: List[int], f: int, px: List[int], src: List[int], t: int) -> None: + self.a = a + self.d = d + self.f = f + self.px = px + self.src = src + self.t = t + + @staticmethod + def from_dict(obj: Any) -> 'TileInstance': + assert isinstance(obj, dict) + a = from_float(obj.get("a")) + d = from_list(from_int, obj.get("d")) + f = from_int(obj.get("f")) + px = from_list(from_int, obj.get("px")) + src = from_list(from_int, obj.get("src")) + t = from_int(obj.get("t")) + return TileInstance(a, d, f, px, src, t) + + def to_dict(self) -> dict: + result: dict = {} + result["a"] = to_float(self.a) + result["d"] = from_list(from_int, self.d) + result["f"] = from_int(self.f) + result["px"] = from_list(from_int, self.px) + result["src"] = from_list(from_int, self.src) + result["t"] = from_int(self.t) + return result + + +class LayerInstance: + c_hei: int + """Grid-based height""" + c_wid: int + """Grid-based width""" + grid_size: int + """Grid size""" + identifier: str + """Layer definition identifier""" + opacity: float + """Layer opacity as Float [0-1]""" + px_total_offset_x: int + """Total layer X pixel offset, including both instance and definition offsets.""" + px_total_offset_y: int + """Total layer Y pixel offset, including both instance and definition offsets.""" + tileset_def_uid: Optional[int] + """The definition UID of corresponding Tileset, if any.""" + tileset_rel_path: Optional[str] + """The relative path to corresponding Tileset, if any.""" + type: str + """Layer type (possible values: IntGrid, Entities, Tiles or AutoLayer)""" + auto_layer_tiles: List[TileInstance] + """An array containing all tiles generated by Auto-layer rules. The array is already sorted + in display order (ie. 1st tile is beneath 2nd, which is beneath 3rd etc.).

+ Note: if multiple tiles are stacked in the same cell as the result of different rules, + all tiles behind opaque ones will be discarded. + """ + entity_instances: List[EntityInstance] + grid_tiles: List[TileInstance] + iid: str + """Unique layer instance identifier""" + int_grid: Optional[List[IntGridValueInstance]] + """**WARNING**: this deprecated value is no longer exported since version 1.0.0 Replaced + by: `intGridCsv` + """ + int_grid_csv: List[int] + """A list of all values in the IntGrid layer, stored in CSV format (Comma Separated + Values).
Order is from left to right, and top to bottom (ie. first row from left to + right, followed by second row, etc).
`0` means "empty cell" and IntGrid values + start at 1.
The array size is `__cWid` x `__cHei` cells. + """ + layer_def_uid: int + """Reference the Layer definition UID""" + level_id: int + """Reference to the UID of the level containing this layer instance""" + optional_rules: List[int] + """An Array containing the UIDs of optional rules that were enabled in this specific layer + instance. + """ + override_tileset_uid: Optional[int] + """This layer can use another tileset by overriding the tileset UID here.""" + px_offset_x: int + """X offset in pixels to render this layer, usually 0 (IMPORTANT: this should be added to + the `LayerDef` optional offset, so you should probably prefer using `__pxTotalOffsetX` + which contains the total offset value) + """ + px_offset_y: int + """Y offset in pixels to render this layer, usually 0 (IMPORTANT: this should be added to + the `LayerDef` optional offset, so you should probably prefer using `__pxTotalOffsetX` + which contains the total offset value) + """ + seed: int + """Random seed used for Auto-Layers rendering""" + visible: bool + """Layer instance visibility""" + + def __init__(self, c_hei: int, c_wid: int, grid_size: int, identifier: str, opacity: float, px_total_offset_x: int, px_total_offset_y: int, tileset_def_uid: Optional[int], tileset_rel_path: Optional[str], type: str, auto_layer_tiles: List[TileInstance], entity_instances: List[EntityInstance], grid_tiles: List[TileInstance], iid: str, int_grid: Optional[List[IntGridValueInstance]], int_grid_csv: List[int], layer_def_uid: int, level_id: int, optional_rules: List[int], override_tileset_uid: Optional[int], px_offset_x: int, px_offset_y: int, seed: int, visible: bool) -> None: + self.c_hei = c_hei + self.c_wid = c_wid + self.grid_size = grid_size + self.identifier = identifier + self.opacity = opacity + self.px_total_offset_x = px_total_offset_x + self.px_total_offset_y = px_total_offset_y + self.tileset_def_uid = tileset_def_uid + self.tileset_rel_path = tileset_rel_path + self.type = type + self.auto_layer_tiles = auto_layer_tiles + self.entity_instances = entity_instances + self.grid_tiles = grid_tiles + self.iid = iid + self.int_grid = int_grid + self.int_grid_csv = int_grid_csv + self.layer_def_uid = layer_def_uid + self.level_id = level_id + self.optional_rules = optional_rules + self.override_tileset_uid = override_tileset_uid + self.px_offset_x = px_offset_x + self.px_offset_y = px_offset_y + self.seed = seed + self.visible = visible + + @staticmethod + def from_dict(obj: Any) -> 'LayerInstance': + assert isinstance(obj, dict) + c_hei = from_int(obj.get("__cHei")) + c_wid = from_int(obj.get("__cWid")) + grid_size = from_int(obj.get("__gridSize")) + identifier = from_str(obj.get("__identifier")) + opacity = from_float(obj.get("__opacity")) + px_total_offset_x = from_int(obj.get("__pxTotalOffsetX")) + px_total_offset_y = from_int(obj.get("__pxTotalOffsetY")) + tileset_def_uid = from_union([from_none, from_int], obj.get("__tilesetDefUid")) + tileset_rel_path = from_union([from_none, from_str], obj.get("__tilesetRelPath")) + type = from_str(obj.get("__type")) + auto_layer_tiles = from_list(TileInstance.from_dict, obj.get("autoLayerTiles")) + entity_instances = from_list(EntityInstance.from_dict, obj.get("entityInstances")) + grid_tiles = from_list(TileInstance.from_dict, obj.get("gridTiles")) + iid = from_str(obj.get("iid")) + int_grid = from_union([from_none, lambda x: from_list(IntGridValueInstance.from_dict, x)], obj.get("intGrid")) + int_grid_csv = from_list(from_int, obj.get("intGridCsv")) + layer_def_uid = from_int(obj.get("layerDefUid")) + level_id = from_int(obj.get("levelId")) + optional_rules = from_list(from_int, obj.get("optionalRules")) + override_tileset_uid = from_union([from_none, from_int], obj.get("overrideTilesetUid")) + px_offset_x = from_int(obj.get("pxOffsetX")) + px_offset_y = from_int(obj.get("pxOffsetY")) + seed = from_int(obj.get("seed")) + visible = from_bool(obj.get("visible")) + return LayerInstance(c_hei, c_wid, grid_size, identifier, opacity, px_total_offset_x, px_total_offset_y, tileset_def_uid, tileset_rel_path, type, auto_layer_tiles, entity_instances, grid_tiles, iid, int_grid, int_grid_csv, layer_def_uid, level_id, optional_rules, override_tileset_uid, px_offset_x, px_offset_y, seed, visible) + + def to_dict(self) -> dict: + result: dict = {} + result["__cHei"] = from_int(self.c_hei) + result["__cWid"] = from_int(self.c_wid) + result["__gridSize"] = from_int(self.grid_size) + result["__identifier"] = from_str(self.identifier) + result["__opacity"] = to_float(self.opacity) + result["__pxTotalOffsetX"] = from_int(self.px_total_offset_x) + result["__pxTotalOffsetY"] = from_int(self.px_total_offset_y) + if self.tileset_def_uid is not None: + result["__tilesetDefUid"] = from_union([from_none, from_int], self.tileset_def_uid) + if self.tileset_rel_path is not None: + result["__tilesetRelPath"] = from_union([from_none, from_str], self.tileset_rel_path) + result["__type"] = from_str(self.type) + result["autoLayerTiles"] = from_list(lambda x: to_class(TileInstance, x), self.auto_layer_tiles) + result["entityInstances"] = from_list(lambda x: to_class(EntityInstance, x), self.entity_instances) + result["gridTiles"] = from_list(lambda x: to_class(TileInstance, x), self.grid_tiles) + result["iid"] = from_str(self.iid) + if self.int_grid is not None: + result["intGrid"] = from_union([from_none, lambda x: from_list(lambda x: to_class(IntGridValueInstance, x), x)], self.int_grid) + result["intGridCsv"] = from_list(from_int, self.int_grid_csv) + result["layerDefUid"] = from_int(self.layer_def_uid) + result["levelId"] = from_int(self.level_id) + result["optionalRules"] = from_list(from_int, self.optional_rules) + if self.override_tileset_uid is not None: + result["overrideTilesetUid"] = from_union([from_none, from_int], self.override_tileset_uid) + result["pxOffsetX"] = from_int(self.px_offset_x) + result["pxOffsetY"] = from_int(self.px_offset_y) + result["seed"] = from_int(self.seed) + result["visible"] = from_bool(self.visible) + return result + + +class LevelBackgroundPosition: + """Level background image position info""" + crop_rect: List[float] + """An array of 4 float values describing the cropped sub-rectangle of the displayed + background image. This cropping happens when original is larger than the level bounds. + Array format: `[ cropX, cropY, cropWidth, cropHeight ]` + """ + scale: List[float] + """An array containing the `[scaleX,scaleY]` values of the **cropped** background image, + depending on `bgPos` option. + """ + top_left_px: List[int] + """An array containing the `[x,y]` pixel coordinates of the top-left corner of the + **cropped** background image, depending on `bgPos` option. + """ + + def __init__(self, crop_rect: List[float], scale: List[float], top_left_px: List[int]) -> None: + self.crop_rect = crop_rect + self.scale = scale + self.top_left_px = top_left_px + + @staticmethod + def from_dict(obj: Any) -> 'LevelBackgroundPosition': + assert isinstance(obj, dict) + crop_rect = from_list(from_float, obj.get("cropRect")) + scale = from_list(from_float, obj.get("scale")) + top_left_px = from_list(from_int, obj.get("topLeftPx")) + return LevelBackgroundPosition(crop_rect, scale, top_left_px) + + def to_dict(self) -> dict: + result: dict = {} + result["cropRect"] = from_list(to_float, self.crop_rect) + result["scale"] = from_list(to_float, self.scale) + result["topLeftPx"] = from_list(from_int, self.top_left_px) + return result + + +class BgPos(Enum): + CONTAIN = "Contain" + COVER = "Cover" + COVER_DIRTY = "CoverDirty" + REPEAT = "Repeat" + UNSCALED = "Unscaled" + + +class NeighbourLevel: + """Nearby level info""" + dir: str + """A lowercase string tipping on the level location (`n`orth, `s`outh, `w`est, + `e`ast).
Since 1.4.0, this value can also be `<` (neighbour depth is lower), `>` + (neighbour depth is greater) or `o` (levels overlap and share the same world + depth).
Since 1.5.3, this value can also be `nw`,`ne`,`sw` or `se` for levels only + touching corners. + """ + level_iid: str + """Neighbour Instance Identifier""" + level_uid: Optional[int] + """**WARNING**: this deprecated value is no longer exported since version 1.2.0 Replaced + by: `levelIid` + """ + + def __init__(self, dir: str, level_iid: str, level_uid: Optional[int]) -> None: + self.dir = dir + self.level_iid = level_iid + self.level_uid = level_uid + + @staticmethod + def from_dict(obj: Any) -> 'NeighbourLevel': + assert isinstance(obj, dict) + dir = from_str(obj.get("dir")) + level_iid = from_str(obj.get("levelIid")) + level_uid = from_union([from_none, from_int], obj.get("levelUid")) + return NeighbourLevel(dir, level_iid, level_uid) + + def to_dict(self) -> dict: + result: dict = {} + result["dir"] = from_str(self.dir) + result["levelIid"] = from_str(self.level_iid) + if self.level_uid is not None: + result["levelUid"] = from_union([from_none, from_int], self.level_uid) + return result + + +class Level: + """This section contains all the level data. It can be found in 2 distinct forms, depending + on Project current settings: - If "*Separate level files*" is **disabled** (default): + full level data is *embedded* inside the main Project JSON file, - If "*Separate level + files*" is **enabled**: level data is stored in *separate* standalone `.ldtkl` files (one + per level). In this case, the main Project JSON file will still contain most level data, + except heavy sections, like the `layerInstances` array (which will be null). The + `externalRelPath` string points to the `ldtkl` file. A `ldtkl` file is just a JSON file + containing exactly what is described below. + """ + bg_color: str + """Background color of the level (same as `bgColor`, except the default value is + automatically used here if its value is `null`) + """ + bg_pos: Optional[LevelBackgroundPosition] + """Position informations of the background image, if there is one.""" + neighbours: List[NeighbourLevel] + """An array listing all other levels touching this one on the world map. Since 1.4.0, this + includes levels that overlap in the same world layer, or in nearby world layers.
+ Only relevant for world layouts where level spatial positioning is manual (ie. GridVania, + Free). For Horizontal and Vertical layouts, this array is always empty. + """ + smart_color: str + """The "guessed" color for this level in the editor, decided using either the background + color or an existing custom field. + """ + level_bg_color: Optional[str] + """Background color of the level. If `null`, the project `defaultLevelBgColor` should be + used. + """ + bg_pivot_x: float + """Background image X pivot (0-1)""" + bg_pivot_y: float + """Background image Y pivot (0-1)""" + level_bg_pos: Optional[BgPos] + """An enum defining the way the background image (if any) is positioned on the level. See + `__bgPos` for resulting position info. Possible values: <`null`>, `Unscaled`, + `Contain`, `Cover`, `CoverDirty`, `Repeat` + """ + bg_rel_path: Optional[str] + """The *optional* relative path to the level background image.""" + external_rel_path: Optional[str] + """This value is not null if the project option "*Save levels separately*" is enabled. In + this case, this **relative** path points to the level Json file. + """ + field_instances: List[FieldInstance] + """An array containing this level custom field values.""" + identifier: str + """User defined unique identifier""" + iid: str + """Unique instance identifier""" + layer_instances: Optional[List[LayerInstance]] + """An array containing all Layer instances. **IMPORTANT**: if the project option "*Save + levels separately*" is enabled, this field will be `null`.
This array is **sorted + in display order**: the 1st layer is the top-most and the last is behind. + """ + px_hei: int + """Height of the level in pixels""" + px_wid: int + """Width of the level in pixels""" + uid: int + """Unique Int identifier""" + use_auto_identifier: bool + """If TRUE, the level identifier will always automatically use the naming pattern as defined + in `Project.levelNamePattern`. Becomes FALSE if the identifier is manually modified by + user. + """ + world_depth: int + """Index that represents the "depth" of the level in the world. Default is 0, greater means + "above", lower means "below".
This value is mostly used for display only and is + intended to make stacking of levels easier to manage. + """ + world_x: int + """World X coordinate in pixels.
Only relevant for world layouts where level spatial + positioning is manual (ie. GridVania, Free). For Horizontal and Vertical layouts, the + value is always -1 here. + """ + world_y: int + """World Y coordinate in pixels.
Only relevant for world layouts where level spatial + positioning is manual (ie. GridVania, Free). For Horizontal and Vertical layouts, the + value is always -1 here. + """ + + def __init__(self, bg_color: str, bg_pos: Optional[LevelBackgroundPosition], neighbours: List[NeighbourLevel], smart_color: str, level_bg_color: Optional[str], bg_pivot_x: float, bg_pivot_y: float, level_bg_pos: Optional[BgPos], bg_rel_path: Optional[str], external_rel_path: Optional[str], field_instances: List[FieldInstance], identifier: str, iid: str, layer_instances: Optional[List[LayerInstance]], px_hei: int, px_wid: int, uid: int, use_auto_identifier: bool, world_depth: int, world_x: int, world_y: int) -> None: + self.bg_color = bg_color + self.bg_pos = bg_pos + self.neighbours = neighbours + self.smart_color = smart_color + self.level_bg_color = level_bg_color + self.bg_pivot_x = bg_pivot_x + self.bg_pivot_y = bg_pivot_y + self.level_bg_pos = level_bg_pos + self.bg_rel_path = bg_rel_path + self.external_rel_path = external_rel_path + self.field_instances = field_instances + self.identifier = identifier + self.iid = iid + self.layer_instances = layer_instances + self.px_hei = px_hei + self.px_wid = px_wid + self.uid = uid + self.use_auto_identifier = use_auto_identifier + self.world_depth = world_depth + self.world_x = world_x + self.world_y = world_y + + @staticmethod + def from_dict(obj: Any) -> 'Level': + assert isinstance(obj, dict) + bg_color = from_str(obj.get("__bgColor")) + bg_pos = from_union([from_none, LevelBackgroundPosition.from_dict], obj.get("__bgPos")) + neighbours = from_list(NeighbourLevel.from_dict, obj.get("__neighbours")) + smart_color = from_str(obj.get("__smartColor")) + level_bg_color = from_union([from_none, from_str], obj.get("bgColor")) + bg_pivot_x = from_float(obj.get("bgPivotX")) + bg_pivot_y = from_float(obj.get("bgPivotY")) + level_bg_pos = from_union([from_none, BgPos], obj.get("bgPos")) + bg_rel_path = from_union([from_none, from_str], obj.get("bgRelPath")) + external_rel_path = from_union([from_none, from_str], obj.get("externalRelPath")) + field_instances = from_list(FieldInstance.from_dict, obj.get("fieldInstances")) + identifier = from_str(obj.get("identifier")) + iid = from_str(obj.get("iid")) + layer_instances = from_union([from_none, lambda x: from_list(LayerInstance.from_dict, x)], obj.get("layerInstances")) + px_hei = from_int(obj.get("pxHei")) + px_wid = from_int(obj.get("pxWid")) + uid = from_int(obj.get("uid")) + use_auto_identifier = from_bool(obj.get("useAutoIdentifier")) + world_depth = from_int(obj.get("worldDepth")) + world_x = from_int(obj.get("worldX")) + world_y = from_int(obj.get("worldY")) + return Level(bg_color, bg_pos, neighbours, smart_color, level_bg_color, bg_pivot_x, bg_pivot_y, level_bg_pos, bg_rel_path, external_rel_path, field_instances, identifier, iid, layer_instances, px_hei, px_wid, uid, use_auto_identifier, world_depth, world_x, world_y) + + def to_dict(self) -> dict: + result: dict = {} + result["__bgColor"] = from_str(self.bg_color) + if self.bg_pos is not None: + result["__bgPos"] = from_union([from_none, lambda x: to_class(LevelBackgroundPosition, x)], self.bg_pos) + result["__neighbours"] = from_list(lambda x: to_class(NeighbourLevel, x), self.neighbours) + result["__smartColor"] = from_str(self.smart_color) + if self.level_bg_color is not None: + result["bgColor"] = from_union([from_none, from_str], self.level_bg_color) + result["bgPivotX"] = to_float(self.bg_pivot_x) + result["bgPivotY"] = to_float(self.bg_pivot_y) + if self.level_bg_pos is not None: + result["bgPos"] = from_union([from_none, lambda x: to_enum(BgPos, x)], self.level_bg_pos) + if self.bg_rel_path is not None: + result["bgRelPath"] = from_union([from_none, from_str], self.bg_rel_path) + if self.external_rel_path is not None: + result["externalRelPath"] = from_union([from_none, from_str], self.external_rel_path) + result["fieldInstances"] = from_list(lambda x: to_class(FieldInstance, x), self.field_instances) + result["identifier"] = from_str(self.identifier) + result["iid"] = from_str(self.iid) + if self.layer_instances is not None: + result["layerInstances"] = from_union([from_none, lambda x: from_list(lambda x: to_class(LayerInstance, x), x)], self.layer_instances) + result["pxHei"] = from_int(self.px_hei) + result["pxWid"] = from_int(self.px_wid) + result["uid"] = from_int(self.uid) + result["useAutoIdentifier"] = from_bool(self.use_auto_identifier) + result["worldDepth"] = from_int(self.world_depth) + result["worldX"] = from_int(self.world_x) + result["worldY"] = from_int(self.world_y) + return result + + +class LdtkTocInstanceData: + fields: Any + """An object containing the values of all entity fields with the `exportToToc` option + enabled. This object typing depends on actual field value types. + """ + hei_px: int + iids: ReferenceToAnEntityInstance + """IID information of this instance""" + wid_px: int + world_x: int + world_y: int + + def __init__(self, fields: Any, hei_px: int, iids: ReferenceToAnEntityInstance, wid_px: int, world_x: int, world_y: int) -> None: + self.fields = fields + self.hei_px = hei_px + self.iids = iids + self.wid_px = wid_px + self.world_x = world_x + self.world_y = world_y + + @staticmethod + def from_dict(obj: Any) -> 'LdtkTocInstanceData': + assert isinstance(obj, dict) + fields = obj.get("fields") + hei_px = from_int(obj.get("heiPx")) + iids = ReferenceToAnEntityInstance.from_dict(obj.get("iids")) + wid_px = from_int(obj.get("widPx")) + world_x = from_int(obj.get("worldX")) + world_y = from_int(obj.get("worldY")) + return LdtkTocInstanceData(fields, hei_px, iids, wid_px, world_x, world_y) + + def to_dict(self) -> dict: + result: dict = {} + result["fields"] = self.fields + result["heiPx"] = from_int(self.hei_px) + result["iids"] = to_class(ReferenceToAnEntityInstance, self.iids) + result["widPx"] = from_int(self.wid_px) + result["worldX"] = from_int(self.world_x) + result["worldY"] = from_int(self.world_y) + return result + + +class LdtkTableOfContentEntry: + identifier: str + instances: Optional[List[ReferenceToAnEntityInstance]] + """**WARNING**: this deprecated value will be *removed* completely on version 1.7.0+ + Replaced by: `instancesData` + """ + instances_data: List[LdtkTocInstanceData] + + def __init__(self, identifier: str, instances: Optional[List[ReferenceToAnEntityInstance]], instances_data: List[LdtkTocInstanceData]) -> None: + self.identifier = identifier + self.instances = instances + self.instances_data = instances_data + + @staticmethod + def from_dict(obj: Any) -> 'LdtkTableOfContentEntry': + assert isinstance(obj, dict) + identifier = from_str(obj.get("identifier")) + instances = from_union([lambda x: from_list(ReferenceToAnEntityInstance.from_dict, x), from_none], obj.get("instances")) + instances_data = from_list(LdtkTocInstanceData.from_dict, obj.get("instancesData")) + return LdtkTableOfContentEntry(identifier, instances, instances_data) + + def to_dict(self) -> dict: + result: dict = {} + result["identifier"] = from_str(self.identifier) + if self.instances is not None: + result["instances"] = from_union([lambda x: from_list(lambda x: to_class(ReferenceToAnEntityInstance, x), x), from_none], self.instances) + result["instancesData"] = from_list(lambda x: to_class(LdtkTocInstanceData, x), self.instances_data) + return result + + +class WorldLayout(Enum): + FREE = "Free" + GRID_VANIA = "GridVania" + LINEAR_HORIZONTAL = "LinearHorizontal" + LINEAR_VERTICAL = "LinearVertical" + + +class World: + """**IMPORTANT**: this type is available as a preview. You can rely on it to update your + importers, for when it will be officially available. A World contains multiple levels, + and it has its own layout settings. + """ + default_level_height: int + """Default new level height""" + default_level_width: int + """Default new level width""" + identifier: str + """User defined unique identifier""" + iid: str + """Unique instance identifer""" + levels: List[Level] + """All levels from this world. The order of this array is only relevant in + `LinearHorizontal` and `linearVertical` world layouts (see `worldLayout` value). + Otherwise, you should refer to the `worldX`,`worldY` coordinates of each Level. + """ + world_grid_height: int + """Height of the world grid in pixels.""" + world_grid_width: int + """Width of the world grid in pixels.""" + world_layout: Optional[WorldLayout] + """An enum that describes how levels are organized in this project (ie. linearly or in a 2D + space). Possible values: `Free`, `GridVania`, `LinearHorizontal`, `LinearVertical`, `null` + """ + + def __init__(self, default_level_height: int, default_level_width: int, identifier: str, iid: str, levels: List[Level], world_grid_height: int, world_grid_width: int, world_layout: Optional[WorldLayout]) -> None: + self.default_level_height = default_level_height + self.default_level_width = default_level_width + self.identifier = identifier + self.iid = iid + self.levels = levels + self.world_grid_height = world_grid_height + self.world_grid_width = world_grid_width + self.world_layout = world_layout + + @staticmethod + def from_dict(obj: Any) -> 'World': + assert isinstance(obj, dict) + default_level_height = from_int(obj.get("defaultLevelHeight")) + default_level_width = from_int(obj.get("defaultLevelWidth")) + identifier = from_str(obj.get("identifier")) + iid = from_str(obj.get("iid")) + levels = from_list(Level.from_dict, obj.get("levels")) + world_grid_height = from_int(obj.get("worldGridHeight")) + world_grid_width = from_int(obj.get("worldGridWidth")) + world_layout = from_union([from_none, WorldLayout], obj.get("worldLayout")) + return World(default_level_height, default_level_width, identifier, iid, levels, world_grid_height, world_grid_width, world_layout) + + def to_dict(self) -> dict: + result: dict = {} + result["defaultLevelHeight"] = from_int(self.default_level_height) + result["defaultLevelWidth"] = from_int(self.default_level_width) + result["identifier"] = from_str(self.identifier) + result["iid"] = from_str(self.iid) + result["levels"] = from_list(lambda x: to_class(Level, x), self.levels) + result["worldGridHeight"] = from_int(self.world_grid_height) + result["worldGridWidth"] = from_int(self.world_grid_width) + result["worldLayout"] = from_union([from_none, lambda x: to_enum(WorldLayout, x)], self.world_layout) + return result + + +class ForcedRefs: + """This object is not actually used by LDtk. It ONLY exists to force explicit references to + all types, to make sure QuickType finds them and integrate all of them. Otherwise, + Quicktype will drop types that are not explicitely used. + """ + auto_layer_rule_group: Optional[AutoLayerRuleGroup] + auto_rule_def: Optional[AutoLayerRuleDefinition] + custom_command: Optional[LdtkCustomCommand] + definitions: Optional[Definitions] + entity_def: Optional[EntityDefinition] + entity_instance: Optional[EntityInstance] + entity_reference_infos: Optional[ReferenceToAnEntityInstance] + enum_def: Optional[EnumDefinition] + enum_def_values: Optional[EnumValueDefinition] + enum_tag_value: Optional[EnumTagValue] + field_def: Optional[FieldDefinition] + field_instance: Optional[FieldInstance] + grid_point: Optional[GridPoint] + int_grid_value_def: Optional[IntGridValueDefinition] + int_grid_value_group_def: Optional[IntGridValueGroupDefinition] + int_grid_value_instance: Optional[IntGridValueInstance] + layer_def: Optional[LayerDefinition] + layer_instance: Optional[LayerInstance] + level: Optional[Level] + level_bg_pos_infos: Optional[LevelBackgroundPosition] + neighbour_level: Optional[NeighbourLevel] + table_of_content_entry: Optional[LdtkTableOfContentEntry] + tile: Optional[TileInstance] + tile_custom_metadata: Optional[TileCustomMetadata] + tileset_def: Optional[TilesetDefinition] + tileset_rect: Optional[TilesetRectangle] + toc_instance_data: Optional[LdtkTocInstanceData] + world: Optional[World] + + def __init__(self, auto_layer_rule_group: Optional[AutoLayerRuleGroup], auto_rule_def: Optional[AutoLayerRuleDefinition], custom_command: Optional[LdtkCustomCommand], definitions: Optional[Definitions], entity_def: Optional[EntityDefinition], entity_instance: Optional[EntityInstance], entity_reference_infos: Optional[ReferenceToAnEntityInstance], enum_def: Optional[EnumDefinition], enum_def_values: Optional[EnumValueDefinition], enum_tag_value: Optional[EnumTagValue], field_def: Optional[FieldDefinition], field_instance: Optional[FieldInstance], grid_point: Optional[GridPoint], int_grid_value_def: Optional[IntGridValueDefinition], int_grid_value_group_def: Optional[IntGridValueGroupDefinition], int_grid_value_instance: Optional[IntGridValueInstance], layer_def: Optional[LayerDefinition], layer_instance: Optional[LayerInstance], level: Optional[Level], level_bg_pos_infos: Optional[LevelBackgroundPosition], neighbour_level: Optional[NeighbourLevel], table_of_content_entry: Optional[LdtkTableOfContentEntry], tile: Optional[TileInstance], tile_custom_metadata: Optional[TileCustomMetadata], tileset_def: Optional[TilesetDefinition], tileset_rect: Optional[TilesetRectangle], toc_instance_data: Optional[LdtkTocInstanceData], world: Optional[World]) -> None: + self.auto_layer_rule_group = auto_layer_rule_group + self.auto_rule_def = auto_rule_def + self.custom_command = custom_command + self.definitions = definitions + self.entity_def = entity_def + self.entity_instance = entity_instance + self.entity_reference_infos = entity_reference_infos + self.enum_def = enum_def + self.enum_def_values = enum_def_values + self.enum_tag_value = enum_tag_value + self.field_def = field_def + self.field_instance = field_instance + self.grid_point = grid_point + self.int_grid_value_def = int_grid_value_def + self.int_grid_value_group_def = int_grid_value_group_def + self.int_grid_value_instance = int_grid_value_instance + self.layer_def = layer_def + self.layer_instance = layer_instance + self.level = level + self.level_bg_pos_infos = level_bg_pos_infos + self.neighbour_level = neighbour_level + self.table_of_content_entry = table_of_content_entry + self.tile = tile + self.tile_custom_metadata = tile_custom_metadata + self.tileset_def = tileset_def + self.tileset_rect = tileset_rect + self.toc_instance_data = toc_instance_data + self.world = world + + @staticmethod + def from_dict(obj: Any) -> 'ForcedRefs': + assert isinstance(obj, dict) + auto_layer_rule_group = from_union([AutoLayerRuleGroup.from_dict, from_none], obj.get("AutoLayerRuleGroup")) + auto_rule_def = from_union([AutoLayerRuleDefinition.from_dict, from_none], obj.get("AutoRuleDef")) + custom_command = from_union([LdtkCustomCommand.from_dict, from_none], obj.get("CustomCommand")) + definitions = from_union([Definitions.from_dict, from_none], obj.get("Definitions")) + entity_def = from_union([EntityDefinition.from_dict, from_none], obj.get("EntityDef")) + entity_instance = from_union([EntityInstance.from_dict, from_none], obj.get("EntityInstance")) + entity_reference_infos = from_union([ReferenceToAnEntityInstance.from_dict, from_none], obj.get("EntityReferenceInfos")) + enum_def = from_union([EnumDefinition.from_dict, from_none], obj.get("EnumDef")) + enum_def_values = from_union([EnumValueDefinition.from_dict, from_none], obj.get("EnumDefValues")) + enum_tag_value = from_union([EnumTagValue.from_dict, from_none], obj.get("EnumTagValue")) + field_def = from_union([FieldDefinition.from_dict, from_none], obj.get("FieldDef")) + field_instance = from_union([FieldInstance.from_dict, from_none], obj.get("FieldInstance")) + grid_point = from_union([GridPoint.from_dict, from_none], obj.get("GridPoint")) + int_grid_value_def = from_union([IntGridValueDefinition.from_dict, from_none], obj.get("IntGridValueDef")) + int_grid_value_group_def = from_union([IntGridValueGroupDefinition.from_dict, from_none], obj.get("IntGridValueGroupDef")) + int_grid_value_instance = from_union([IntGridValueInstance.from_dict, from_none], obj.get("IntGridValueInstance")) + layer_def = from_union([LayerDefinition.from_dict, from_none], obj.get("LayerDef")) + layer_instance = from_union([LayerInstance.from_dict, from_none], obj.get("LayerInstance")) + level = from_union([Level.from_dict, from_none], obj.get("Level")) + level_bg_pos_infos = from_union([from_none, LevelBackgroundPosition.from_dict], obj.get("LevelBgPosInfos")) + neighbour_level = from_union([NeighbourLevel.from_dict, from_none], obj.get("NeighbourLevel")) + table_of_content_entry = from_union([LdtkTableOfContentEntry.from_dict, from_none], obj.get("TableOfContentEntry")) + tile = from_union([TileInstance.from_dict, from_none], obj.get("Tile")) + tile_custom_metadata = from_union([TileCustomMetadata.from_dict, from_none], obj.get("TileCustomMetadata")) + tileset_def = from_union([TilesetDefinition.from_dict, from_none], obj.get("TilesetDef")) + tileset_rect = from_union([from_none, TilesetRectangle.from_dict], obj.get("TilesetRect")) + toc_instance_data = from_union([LdtkTocInstanceData.from_dict, from_none], obj.get("TocInstanceData")) + world = from_union([World.from_dict, from_none], obj.get("World")) + return ForcedRefs(auto_layer_rule_group, auto_rule_def, custom_command, definitions, entity_def, entity_instance, entity_reference_infos, enum_def, enum_def_values, enum_tag_value, field_def, field_instance, grid_point, int_grid_value_def, int_grid_value_group_def, int_grid_value_instance, layer_def, layer_instance, level, level_bg_pos_infos, neighbour_level, table_of_content_entry, tile, tile_custom_metadata, tileset_def, tileset_rect, toc_instance_data, world) + + def to_dict(self) -> dict: + result: dict = {} + if self.auto_layer_rule_group is not None: + result["AutoLayerRuleGroup"] = from_union([lambda x: to_class(AutoLayerRuleGroup, x), from_none], self.auto_layer_rule_group) + if self.auto_rule_def is not None: + result["AutoRuleDef"] = from_union([lambda x: to_class(AutoLayerRuleDefinition, x), from_none], self.auto_rule_def) + if self.custom_command is not None: + result["CustomCommand"] = from_union([lambda x: to_class(LdtkCustomCommand, x), from_none], self.custom_command) + if self.definitions is not None: + result["Definitions"] = from_union([lambda x: to_class(Definitions, x), from_none], self.definitions) + if self.entity_def is not None: + result["EntityDef"] = from_union([lambda x: to_class(EntityDefinition, x), from_none], self.entity_def) + if self.entity_instance is not None: + result["EntityInstance"] = from_union([lambda x: to_class(EntityInstance, x), from_none], self.entity_instance) + if self.entity_reference_infos is not None: + result["EntityReferenceInfos"] = from_union([lambda x: to_class(ReferenceToAnEntityInstance, x), from_none], self.entity_reference_infos) + if self.enum_def is not None: + result["EnumDef"] = from_union([lambda x: to_class(EnumDefinition, x), from_none], self.enum_def) + if self.enum_def_values is not None: + result["EnumDefValues"] = from_union([lambda x: to_class(EnumValueDefinition, x), from_none], self.enum_def_values) + if self.enum_tag_value is not None: + result["EnumTagValue"] = from_union([lambda x: to_class(EnumTagValue, x), from_none], self.enum_tag_value) + if self.field_def is not None: + result["FieldDef"] = from_union([lambda x: to_class(FieldDefinition, x), from_none], self.field_def) + if self.field_instance is not None: + result["FieldInstance"] = from_union([lambda x: to_class(FieldInstance, x), from_none], self.field_instance) + if self.grid_point is not None: + result["GridPoint"] = from_union([lambda x: to_class(GridPoint, x), from_none], self.grid_point) + if self.int_grid_value_def is not None: + result["IntGridValueDef"] = from_union([lambda x: to_class(IntGridValueDefinition, x), from_none], self.int_grid_value_def) + if self.int_grid_value_group_def is not None: + result["IntGridValueGroupDef"] = from_union([lambda x: to_class(IntGridValueGroupDefinition, x), from_none], self.int_grid_value_group_def) + if self.int_grid_value_instance is not None: + result["IntGridValueInstance"] = from_union([lambda x: to_class(IntGridValueInstance, x), from_none], self.int_grid_value_instance) + if self.layer_def is not None: + result["LayerDef"] = from_union([lambda x: to_class(LayerDefinition, x), from_none], self.layer_def) + if self.layer_instance is not None: + result["LayerInstance"] = from_union([lambda x: to_class(LayerInstance, x), from_none], self.layer_instance) + if self.level is not None: + result["Level"] = from_union([lambda x: to_class(Level, x), from_none], self.level) + if self.level_bg_pos_infos is not None: + result["LevelBgPosInfos"] = from_union([from_none, lambda x: to_class(LevelBackgroundPosition, x)], self.level_bg_pos_infos) + if self.neighbour_level is not None: + result["NeighbourLevel"] = from_union([lambda x: to_class(NeighbourLevel, x), from_none], self.neighbour_level) + if self.table_of_content_entry is not None: + result["TableOfContentEntry"] = from_union([lambda x: to_class(LdtkTableOfContentEntry, x), from_none], self.table_of_content_entry) + if self.tile is not None: + result["Tile"] = from_union([lambda x: to_class(TileInstance, x), from_none], self.tile) + if self.tile_custom_metadata is not None: + result["TileCustomMetadata"] = from_union([lambda x: to_class(TileCustomMetadata, x), from_none], self.tile_custom_metadata) + if self.tileset_def is not None: + result["TilesetDef"] = from_union([lambda x: to_class(TilesetDefinition, x), from_none], self.tileset_def) + if self.tileset_rect is not None: + result["TilesetRect"] = from_union([from_none, lambda x: to_class(TilesetRectangle, x)], self.tileset_rect) + if self.toc_instance_data is not None: + result["TocInstanceData"] = from_union([lambda x: to_class(LdtkTocInstanceData, x), from_none], self.toc_instance_data) + if self.world is not None: + result["World"] = from_union([lambda x: to_class(World, x), from_none], self.world) + return result + + +class IdentifierStyle(Enum): + """Naming convention for Identifiers (first-letter uppercase, full uppercase etc.) Possible + values: `Capitalize`, `Uppercase`, `Lowercase`, `Free` + """ + CAPITALIZE = "Capitalize" + FREE = "Free" + LOWERCASE = "Lowercase" + UPPERCASE = "Uppercase" + + +class ImageExportMode(Enum): + """"Image export" option when saving project. Possible values: `None`, `OneImagePerLayer`, + `OneImagePerLevel`, `LayersAndLevels` + """ + LAYERS_AND_LEVELS = "LayersAndLevels" + NONE = "None" + ONE_IMAGE_PER_LAYER = "OneImagePerLayer" + ONE_IMAGE_PER_LEVEL = "OneImagePerLevel" + + +class LdtkJSON: + """This file is a JSON schema of files created by LDtk level editor (https://ldtk.io). + + This is the root of any Project JSON file. It contains: - the project settings, - an + array of levels, - a group of definitions (that can probably be safely ignored for most + users). + """ + forced_refs: Optional[ForcedRefs] + """This object is not actually used by LDtk. It ONLY exists to force explicit references to + all types, to make sure QuickType finds them and integrate all of them. Otherwise, + Quicktype will drop types that are not explicitely used. + """ + app_build_id: float + """LDtk application build identifier.
This is only used to identify the LDtk version + that generated this particular project file, which can be useful for specific bug fixing. + Note that the build identifier is just the date of the release, so it's not unique to + each user (one single global ID per LDtk public release), and as a result, completely + anonymous. + """ + backup_limit: int + """Number of backup files to keep, if the `backupOnSave` is TRUE""" + backup_on_save: bool + """If TRUE, an extra copy of the project will be created in a sub folder, when saving.""" + backup_rel_path: Optional[str] + """Target relative path to store backup files""" + bg_color: str + """Project background color""" + custom_commands: List[LdtkCustomCommand] + """An array of command lines that can be ran manually by the user""" + default_entity_height: int + """Default height for new entities""" + default_entity_width: int + """Default width for new entities""" + default_grid_size: int + """Default grid size for new layers""" + default_level_bg_color: str + """Default background color of levels""" + default_level_height: Optional[int] + """**WARNING**: this field will move to the `worlds` array after the "multi-worlds" update. + It will then be `null`. You can enable the Multi-worlds advanced project option to enable + the change immediately.

Default new level height + """ + default_level_width: Optional[int] + """**WARNING**: this field will move to the `worlds` array after the "multi-worlds" update. + It will then be `null`. You can enable the Multi-worlds advanced project option to enable + the change immediately.

Default new level width + """ + default_pivot_x: float + """Default X pivot (0 to 1) for new entities""" + default_pivot_y: float + """Default Y pivot (0 to 1) for new entities""" + defs: Definitions + """A structure containing all the definitions of this project""" + dummy_world_iid: str + """If the project isn't in MultiWorlds mode, this is the IID of the internal "dummy" World.""" + export_level_bg: bool + """If TRUE, the exported PNGs will include the level background (color or image).""" + export_png: Optional[bool] + """**WARNING**: this deprecated value is no longer exported since version 0.9.3 Replaced + by: `imageExportMode` + """ + export_tiled: bool + """If TRUE, a Tiled compatible file will also be generated along with the LDtk JSON file + (default is FALSE) + """ + external_levels: bool + """If TRUE, one file will be saved for the project (incl. all its definitions) and one file + in a sub-folder for each level. + """ + flags: List[Flag] + """An array containing various advanced flags (ie. options or other states). Possible + values: `DiscardPreCsvIntGrid`, `ExportOldTableOfContentData`, + `ExportPreCsvIntGridFormat`, `IgnoreBackupSuggest`, `PrependIndexToLevelFileNames`, + `MultiWorlds`, `UseMultilinesType` + """ + identifier_style: IdentifierStyle + """Naming convention for Identifiers (first-letter uppercase, full uppercase etc.) Possible + values: `Capitalize`, `Uppercase`, `Lowercase`, `Free` + """ + iid: str + """Unique project identifier""" + image_export_mode: ImageExportMode + """"Image export" option when saving project. Possible values: `None`, `OneImagePerLayer`, + `OneImagePerLevel`, `LayersAndLevels` + """ + json_version: str + """File format version""" + level_name_pattern: str + """The default naming convention for level identifiers.""" + levels: List[Level] + """All levels. The order of this array is only relevant in `LinearHorizontal` and + `linearVertical` world layouts (see `worldLayout` value).
Otherwise, you should + refer to the `worldX`,`worldY` coordinates of each Level. + """ + minify_json: bool + """If TRUE, the Json is partially minified (no indentation, nor line breaks, default is + FALSE) + """ + next_uid: int + """Next Unique integer ID available""" + png_file_pattern: Optional[str] + """File naming pattern for exported PNGs""" + simplified_export: bool + """If TRUE, a very simplified will be generated on saving, for quicker & easier engine + integration. + """ + toc: List[LdtkTableOfContentEntry] + """All instances of entities that have their `exportToToc` flag enabled are listed in this + array. + """ + tutorial_desc: Optional[str] + """This optional description is used by LDtk Samples to show up some informations and + instructions. + """ + world_grid_height: Optional[int] + """**WARNING**: this field will move to the `worlds` array after the "multi-worlds" update. + It will then be `null`. You can enable the Multi-worlds advanced project option to enable + the change immediately.

Height of the world grid in pixels. + """ + world_grid_width: Optional[int] + """**WARNING**: this field will move to the `worlds` array after the "multi-worlds" update. + It will then be `null`. You can enable the Multi-worlds advanced project option to enable + the change immediately.

Width of the world grid in pixels. + """ + world_layout: Optional[WorldLayout] + """**WARNING**: this field will move to the `worlds` array after the "multi-worlds" update. + It will then be `null`. You can enable the Multi-worlds advanced project option to enable + the change immediately.

An enum that describes how levels are organized in + this project (ie. linearly or in a 2D space). Possible values: <`null`>, `Free`, + `GridVania`, `LinearHorizontal`, `LinearVertical` + """ + worlds: List[World] + """This array will be empty, unless you enable the Multi-Worlds in the project advanced + settings.

- in current version, a LDtk project file can only contain a single + world with multiple levels in it. In this case, levels and world layout related settings + are stored in the root of the JSON.
- with "Multi-worlds" enabled, there will be a + `worlds` array in root, each world containing levels and layout settings. Basically, it's + pretty much only about moving the `levels` array to the `worlds` array, along with world + layout related values (eg. `worldGridWidth` etc).

If you want to start + supporting this future update easily, please refer to this documentation: + https://github.com/deepnight/ldtk/issues/231 + """ + + def __init__(self, forced_refs: Optional[ForcedRefs], app_build_id: float, backup_limit: int, backup_on_save: bool, backup_rel_path: Optional[str], bg_color: str, custom_commands: List[LdtkCustomCommand], default_entity_height: int, default_entity_width: int, default_grid_size: int, default_level_bg_color: str, default_level_height: Optional[int], default_level_width: Optional[int], default_pivot_x: float, default_pivot_y: float, defs: Definitions, dummy_world_iid: str, export_level_bg: bool, export_png: Optional[bool], export_tiled: bool, external_levels: bool, flags: List[Flag], identifier_style: IdentifierStyle, iid: str, image_export_mode: ImageExportMode, json_version: str, level_name_pattern: str, levels: List[Level], minify_json: bool, next_uid: int, png_file_pattern: Optional[str], simplified_export: bool, toc: List[LdtkTableOfContentEntry], tutorial_desc: Optional[str], world_grid_height: Optional[int], world_grid_width: Optional[int], world_layout: Optional[WorldLayout], worlds: List[World]) -> None: + self.forced_refs = forced_refs + self.app_build_id = app_build_id + self.backup_limit = backup_limit + self.backup_on_save = backup_on_save + self.backup_rel_path = backup_rel_path + self.bg_color = bg_color + self.custom_commands = custom_commands + self.default_entity_height = default_entity_height + self.default_entity_width = default_entity_width + self.default_grid_size = default_grid_size + self.default_level_bg_color = default_level_bg_color + self.default_level_height = default_level_height + self.default_level_width = default_level_width + self.default_pivot_x = default_pivot_x + self.default_pivot_y = default_pivot_y + self.defs = defs + self.dummy_world_iid = dummy_world_iid + self.export_level_bg = export_level_bg + self.export_png = export_png + self.export_tiled = export_tiled + self.external_levels = external_levels + self.flags = flags + self.identifier_style = identifier_style + self.iid = iid + self.image_export_mode = image_export_mode + self.json_version = json_version + self.level_name_pattern = level_name_pattern + self.levels = levels + self.minify_json = minify_json + self.next_uid = next_uid + self.png_file_pattern = png_file_pattern + self.simplified_export = simplified_export + self.toc = toc + self.tutorial_desc = tutorial_desc + self.world_grid_height = world_grid_height + self.world_grid_width = world_grid_width + self.world_layout = world_layout + self.worlds = worlds + + @staticmethod + def from_dict(obj: Any) -> 'LdtkJSON': + assert isinstance(obj, dict) + forced_refs = from_union([ForcedRefs.from_dict, from_none], obj.get("__FORCED_REFS")) + app_build_id = from_float(obj.get("appBuildId")) + backup_limit = from_int(obj.get("backupLimit")) + backup_on_save = from_bool(obj.get("backupOnSave")) + backup_rel_path = from_union([from_none, from_str], obj.get("backupRelPath")) + bg_color = from_str(obj.get("bgColor")) + custom_commands = from_list(LdtkCustomCommand.from_dict, obj.get("customCommands")) + default_entity_height = from_int(obj.get("defaultEntityHeight")) + default_entity_width = from_int(obj.get("defaultEntityWidth")) + default_grid_size = from_int(obj.get("defaultGridSize")) + default_level_bg_color = from_str(obj.get("defaultLevelBgColor")) + default_level_height = from_union([from_none, from_int], obj.get("defaultLevelHeight")) + default_level_width = from_union([from_none, from_int], obj.get("defaultLevelWidth")) + default_pivot_x = from_float(obj.get("defaultPivotX")) + default_pivot_y = from_float(obj.get("defaultPivotY")) + defs = Definitions.from_dict(obj.get("defs")) + dummy_world_iid = from_str(obj.get("dummyWorldIid")) + export_level_bg = from_bool(obj.get("exportLevelBg")) + export_png = from_union([from_none, from_bool], obj.get("exportPng")) + export_tiled = from_bool(obj.get("exportTiled")) + external_levels = from_bool(obj.get("externalLevels")) + flags = from_list(Flag, obj.get("flags")) + identifier_style = IdentifierStyle(obj.get("identifierStyle")) + iid = from_str(obj.get("iid")) + image_export_mode = ImageExportMode(obj.get("imageExportMode")) + json_version = from_str(obj.get("jsonVersion")) + level_name_pattern = from_str(obj.get("levelNamePattern")) + levels = from_list(Level.from_dict, obj.get("levels")) + minify_json = from_bool(obj.get("minifyJson")) + next_uid = from_int(obj.get("nextUid")) + png_file_pattern = from_union([from_none, from_str], obj.get("pngFilePattern")) + simplified_export = from_bool(obj.get("simplifiedExport")) + toc = from_list(LdtkTableOfContentEntry.from_dict, obj.get("toc")) + tutorial_desc = from_union([from_none, from_str], obj.get("tutorialDesc")) + world_grid_height = from_union([from_none, from_int], obj.get("worldGridHeight")) + world_grid_width = from_union([from_none, from_int], obj.get("worldGridWidth")) + world_layout = from_union([from_none, WorldLayout], obj.get("worldLayout")) + worlds = from_list(World.from_dict, obj.get("worlds")) + return LdtkJSON(forced_refs, app_build_id, backup_limit, backup_on_save, backup_rel_path, bg_color, custom_commands, default_entity_height, default_entity_width, default_grid_size, default_level_bg_color, default_level_height, default_level_width, default_pivot_x, default_pivot_y, defs, dummy_world_iid, export_level_bg, export_png, export_tiled, external_levels, flags, identifier_style, iid, image_export_mode, json_version, level_name_pattern, levels, minify_json, next_uid, png_file_pattern, simplified_export, toc, tutorial_desc, world_grid_height, world_grid_width, world_layout, worlds) + + def to_dict(self) -> dict: + result: dict = {} + if self.forced_refs is not None: + result["__FORCED_REFS"] = from_union([lambda x: to_class(ForcedRefs, x), from_none], self.forced_refs) + result["appBuildId"] = to_float(self.app_build_id) + result["backupLimit"] = from_int(self.backup_limit) + result["backupOnSave"] = from_bool(self.backup_on_save) + if self.backup_rel_path is not None: + result["backupRelPath"] = from_union([from_none, from_str], self.backup_rel_path) + result["bgColor"] = from_str(self.bg_color) + result["customCommands"] = from_list(lambda x: to_class(LdtkCustomCommand, x), self.custom_commands) + result["defaultEntityHeight"] = from_int(self.default_entity_height) + result["defaultEntityWidth"] = from_int(self.default_entity_width) + result["defaultGridSize"] = from_int(self.default_grid_size) + result["defaultLevelBgColor"] = from_str(self.default_level_bg_color) + if self.default_level_height is not None: + result["defaultLevelHeight"] = from_union([from_none, from_int], self.default_level_height) + if self.default_level_width is not None: + result["defaultLevelWidth"] = from_union([from_none, from_int], self.default_level_width) + result["defaultPivotX"] = to_float(self.default_pivot_x) + result["defaultPivotY"] = to_float(self.default_pivot_y) + result["defs"] = to_class(Definitions, self.defs) + result["dummyWorldIid"] = from_str(self.dummy_world_iid) + result["exportLevelBg"] = from_bool(self.export_level_bg) + if self.export_png is not None: + result["exportPng"] = from_union([from_none, from_bool], self.export_png) + result["exportTiled"] = from_bool(self.export_tiled) + result["externalLevels"] = from_bool(self.external_levels) + result["flags"] = from_list(lambda x: to_enum(Flag, x), self.flags) + result["identifierStyle"] = to_enum(IdentifierStyle, self.identifier_style) + result["iid"] = from_str(self.iid) + result["imageExportMode"] = to_enum(ImageExportMode, self.image_export_mode) + result["jsonVersion"] = from_str(self.json_version) + result["levelNamePattern"] = from_str(self.level_name_pattern) + result["levels"] = from_list(lambda x: to_class(Level, x), self.levels) + result["minifyJson"] = from_bool(self.minify_json) + result["nextUid"] = from_int(self.next_uid) + if self.png_file_pattern is not None: + result["pngFilePattern"] = from_union([from_none, from_str], self.png_file_pattern) + result["simplifiedExport"] = from_bool(self.simplified_export) + result["toc"] = from_list(lambda x: to_class(LdtkTableOfContentEntry, x), self.toc) + if self.tutorial_desc is not None: + result["tutorialDesc"] = from_union([from_none, from_str], self.tutorial_desc) + if self.world_grid_height is not None: + result["worldGridHeight"] = from_union([from_none, from_int], self.world_grid_height) + if self.world_grid_width is not None: + result["worldGridWidth"] = from_union([from_none, from_int], self.world_grid_width) + if self.world_layout is not None: + result["worldLayout"] = from_union([from_none, lambda x: to_enum(WorldLayout, x)], self.world_layout) + result["worlds"] = from_list(lambda x: to_class(World, x), self.worlds) + return result + + +def ldtk_json_from_dict(s: Any) -> LdtkJSON: + return LdtkJSON.from_dict(s) + + +def ldtk_json_to_dict(x: LdtkJSON) -> Any: + return to_class(LdtkJSON, x) diff --git a/py/engine/__init__.py b/py/engine/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/py/engine/__init__.py @@ -0,0 +1 @@ + diff --git a/py/engine/__pycache__/LdtkJson.cpython-313.pyc b/py/engine/__pycache__/LdtkJson.cpython-313.pyc new file mode 100644 index 0000000..d6d8f18 Binary files /dev/null and b/py/engine/__pycache__/LdtkJson.cpython-313.pyc differ diff --git a/py/engine/__pycache__/__init__.cpython-313.pyc b/py/engine/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..e7cb349 Binary files /dev/null and b/py/engine/__pycache__/__init__.cpython-313.pyc differ diff --git a/py/engine/__pycache__/framework.cpython-313.pyc b/py/engine/__pycache__/framework.cpython-313.pyc new file mode 100644 index 0000000..f3ab1a1 Binary files /dev/null and b/py/engine/__pycache__/framework.cpython-313.pyc differ diff --git a/py/engine/__pycache__/math_extensions.cpython-313.pyc b/py/engine/__pycache__/math_extensions.cpython-313.pyc new file mode 100644 index 0000000..e4efc7d Binary files /dev/null and b/py/engine/__pycache__/math_extensions.cpython-313.pyc differ diff --git a/py/engine/__pycache__/physics_debug.cpython-313.pyc b/py/engine/__pycache__/physics_debug.cpython-313.pyc new file mode 100644 index 0000000..e7a5cf1 Binary files /dev/null and b/py/engine/__pycache__/physics_debug.cpython-313.pyc differ diff --git a/py/engine/__pycache__/raycasts.cpython-313.pyc b/py/engine/__pycache__/raycasts.cpython-313.pyc new file mode 100644 index 0000000..368e40b Binary files /dev/null and b/py/engine/__pycache__/raycasts.cpython-313.pyc differ diff --git a/py/engine/framework.py b/py/engine/framework.py new file mode 100644 index 0000000..47f88fa --- /dev/null +++ b/py/engine/framework.py @@ -0,0 +1,629 @@ +from __future__ import annotations + +from typing import Any, Dict, List, Optional, Tuple, Type, TypeVar +import pyray as rl + +T = TypeVar("T") + + +class Component: + """Base class for all game object components. + + Attributes: + owner: The GameObject that owns this component, or None if unassigned. + """ + def __init__(self) -> None: + self.owner: Optional[GameObject] = None + + def init(self) -> None: + """Lifecycle hook called when the component is initialized. + + Returns: + None + """ + pass + + def update(self, delta_time: float) -> None: + """Lifecycle hook called every frame to update the component. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + pass + + def draw(self) -> None: + """Lifecycle hook called every frame to draw the component. + + Returns: + None + """ + pass + + +class GameObject: + """Base class for all game objects (entities) in a scene. + + Attributes: + scene: The Scene this object belongs to. + components: Mapping of component type to component instance. + tags: Set of string tags for lookup/filtering. + is_active: If False, update/draw are skipped. + """ + def __init__(self) -> None: + self.scene: Optional[Scene] = None + self.components: Dict[Type[Any], Component] = {} + self.tags: set[str] = set() + self.is_active: bool = True + + def init(self) -> None: + """Lifecycle hook called when the object is initialized. + + Returns: + None + """ + pass + + def update(self, delta_time: float) -> None: + """Lifecycle hook called every frame to update the object. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + pass + + def draw(self) -> None: + """Lifecycle hook called every frame to draw the object. + + Returns: + None + """ + pass + + def init_object(self) -> None: + """Initialize the object and its components. + + Returns: + None + """ + self.init() + for component in list(self.components.values()): + component.init() + + def update_object(self, delta_time: float) -> None: + """Update the object and its components if active. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + if not self.is_active: + return + self.update(delta_time) + for component in list(self.components.values()): + component.update(delta_time) + + def draw_object(self) -> None: + """Draw the object and its components if active. + + Returns: + None + """ + if not self.is_active: + return + self.draw() + for component in list(self.components.values()): + component.draw() + + def add_component(self, component_or_cls: Any, *args: Any, **kwargs: Any) -> Component: + """Add a component instance or construct one from a class. + + Args: + component_or_cls: A Component instance or a Component class. + *args: Positional args forwarded to the component constructor. + **kwargs: Keyword args forwarded to the component constructor. + + Returns: + The component instance added. + """ + if isinstance(component_or_cls, Component): + component = component_or_cls + else: + component = component_or_cls(*args, **kwargs) + component.owner = self + key = component.__class__ + if key in self.components: + print(f"Duplicate component added: {key.__name__}") + self.components[key] = component + return component + + def get_component(self, cls: Type[T]) -> Optional[T]: + """Get a component by type, if present. + + Args: + cls: Component class to look up. + + Returns: + The component instance if found, otherwise None. + """ + component = self.components.get(cls) + return component if component is None else component # type: ignore[return-value] + + def add_tag(self, tag: str) -> None: + """Add a tag to this object. + + Args: + tag: Tag string to add. + + Returns: + None + """ + self.tags.add(tag) + + def remove_tag(self, tag: str) -> None: + """Remove a tag from this object. + + Args: + tag: Tag string to remove. + + Returns: + None + """ + self.tags.discard(tag) + + def has_tag(self, tag: str) -> bool: + """Check if a tag is present. + + Args: + tag: Tag string to check. + + Returns: + True if the tag is present, otherwise False. + """ + return tag in self.tags + + +class Service: + """Base class for scene-level services. + + Attributes: + scene: The Scene this service is attached to. + is_init: True once init_service has been run. + is_visible: If False, draw_service is skipped. + """ + def __init__(self) -> None: + self.scene: Optional[Scene] = None + self.is_init: bool = False + self.is_visible: bool = True + + def init(self) -> None: + """Lifecycle hook called when the service is initialized. + + Returns: + None + """ + pass + + def update(self, delta_time: float) -> None: + """Lifecycle hook called every frame to update the service. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + pass + + def draw(self) -> None: + """Lifecycle hook called every frame to draw the service. + + Returns: + None + """ + pass + + def init_service(self) -> None: + """Initialize the service once. + + Returns: + None + """ + if self.is_init: + return + self.init() + self.is_init = True + + def draw_service(self) -> None: + """Draw the service if visible. + + Returns: + None + """ + if self.is_visible: + self.draw() + + +class Manager: + """Base class for global managers. + + Attributes: + is_init: True once init_manager has been run. + """ + def __init__(self) -> None: + self.is_init: bool = False + + def init(self) -> None: + """Lifecycle hook called when the manager is initialized. + + Returns: + None + """ + pass + + def init_manager(self) -> None: + """Initialize the manager once. + + Returns: + None + """ + if self.is_init: + return + self.init() + self.is_init = True + + +class Scene: + """Base class for scenes that contain objects and services. + + Attributes: + game_objects: List of GameObjects in the scene. + services: List of (type, Service) pairs. + game: Owning Game instance. + is_init: True once init_scene has been run. + """ + def __init__(self) -> None: + self.game_objects: List[GameObject] = [] + self.services: List[Tuple[Type[Any], Service]] = [] + self.game: Optional[Game] = None + self.is_init: bool = False + + def init_services(self) -> None: + """Hook to add services before scene init. + + Returns: + None + """ + pass + + def init(self) -> None: + """Lifecycle hook called when the scene initializes. + + Returns: + None + """ + pass + + def update(self, delta_time: float) -> None: + """Lifecycle hook called every frame to update the scene. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + pass + + def draw(self) -> None: + """Lifecycle hook called every frame to draw the scene. + + Returns: + None + """ + pass + + def init_scene(self) -> None: + """Initialize services, scene, and objects. + + Returns: + None + """ + if self.is_init: + return + self.init_services() + for _, service in self.services: + service.init_service() + self.init() + for game_object in list(self.game_objects): + game_object.init_object() + self.is_init = True + + def update_scene(self, delta_time: float) -> None: + """Update the scene, services, and objects. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + self.update(delta_time) + for _, service in self.services: + service.update(delta_time) + for game_object in list(self.game_objects): + game_object.update_object(delta_time) + + def draw_scene(self) -> None: + """Draw the scene, services, and objects. + + Returns: + None + """ + self.draw() + for _, service in self.services: + service.draw_service() + for game_object in list(self.game_objects): + game_object.draw_object() + + def on_enter(self) -> None: + """Hook called when the scene becomes active. + + Returns: + None + """ + pass + + def on_exit(self) -> None: + """Hook called when the scene is exited. + + Returns: + None + """ + pass + + def add_game_object(self, game_object: GameObject) -> GameObject: + """Add an existing object to this scene. + + Args: + game_object: The object to add. + + Returns: + The same object, after being attached to the scene. + """ + game_object.scene = self + self.game_objects.append(game_object) + return game_object + + def add_game_object_type(self, cls: Type[T], *args: Any, **kwargs: Any) -> T: + """Create and add a new object of a given type. + + Args: + cls: GameObject class to instantiate. + *args: Positional args forwarded to the constructor. + **kwargs: Keyword args forwarded to the constructor. + + Returns: + The newly created object. + """ + game_object = cls(*args, **kwargs) + self.add_game_object(game_object) + return game_object + + def add_service(self, service_or_cls: Any, *args: Any, **kwargs: Any) -> Service: + """Add a service instance or construct one from a class. + + Args: + service_or_cls: A Service instance or a Service class. + *args: Positional args forwarded to the constructor. + **kwargs: Keyword args forwarded to the constructor. + + Returns: + The service instance added. + """ + if isinstance(service_or_cls, Service): + service = service_or_cls + else: + service = service_or_cls(*args, **kwargs) + service.scene = self + key = service.__class__ + for svc_key, _ in self.services: + if svc_key == key: + print(f"Duplicate service added: {key.__name__}") + return service + self.services.append((key, service)) + return service + + def get_service(self, cls: Type[T]) -> T: + """Get a service by type. + + Args: + cls: Service class to look up. + + Returns: + The service instance. + + Raises: + RuntimeError: If no matching service exists. + """ + for svc_key, svc in self.services: + if svc_key == cls: + if not svc.is_init: + print(f"Service not initialized: {cls.__name__}") + return svc # type: ignore[return-value] + print(f"Service of requested type not found in scene: {cls.__name__}") + raise RuntimeError(f"Service not found: {cls.__name__}") + + def get_game_objects_with_tag(self, tag: str) -> List[GameObject]: + """Get all objects that contain a tag. + + Args: + tag: Tag string to match. + + Returns: + List of matching game objects. + """ + return [obj for obj in self.game_objects if obj.has_tag(tag)] + + +class Game: + """Main game class that owns managers and scenes. + + Attributes: + managers: Mapping of manager type to instance. + scenes: Mapping of scene name to instance. + scene_order: Ordered list of scene names. + current_scene: Active scene. + next_scene: Scene queued for transition. + """ + def __init__(self) -> None: + self.managers: Dict[Type[Any], Manager] = {} + self.scenes: Dict[str, Scene] = {} + self.scene_order: List[str] = [] + self.current_scene: Optional[Scene] = None + self.next_scene: Optional[Scene] = None + + def init(self) -> None: + """Initialize all managers. + + Returns: + None + """ + for manager in self.managers.values(): + manager.init_manager() + + def update(self, delta_time: float) -> None: + """Update the active scene and render it. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + if self.current_scene: + self.current_scene.init_scene() + self.current_scene.update_scene(delta_time) + + rl.begin_drawing() + rl.clear_background(rl.RAYWHITE) + self.current_scene.draw_scene() + rl.end_drawing() + + if self.next_scene: + if self.current_scene: + self.current_scene.on_exit() + self.current_scene = self.next_scene + self.current_scene.on_enter() + self.next_scene = None + + def add_manager(self, manager_or_cls: Any, *args: Any, **kwargs: Any) -> Manager: + """Add a manager instance or construct one from a class. + + Args: + manager_or_cls: A Manager instance or a Manager class. + *args: Positional args forwarded to the constructor. + **kwargs: Keyword args forwarded to the constructor. + + Returns: + The manager instance added. + """ + if isinstance(manager_or_cls, Manager): + manager = manager_or_cls + else: + manager = manager_or_cls(*args, **kwargs) + key = manager.__class__ + if key in self.managers: + print(f"Duplicate manager added: {key.__name__}") + self.managers[key] = manager + return manager + + def get_manager(self, cls: Type[T]) -> T: + """Get a manager by type. + + Args: + cls: Manager class to look up. + + Returns: + The manager instance. + + Raises: + RuntimeError: If no matching manager exists. + """ + manager = self.managers.get(cls) + if manager is None: + print(f"Manager of requested type not found: {cls.__name__}") + raise RuntimeError(f"Manager not found: {cls.__name__}") + if not manager.is_init: + print(f"Manager not initialized: {cls.__name__}") + return manager # type: ignore[return-value] + + def add_scene(self, name: str, scene_or_cls: Any, *args: Any, **kwargs: Any) -> Scene: + """Add a scene instance or construct one from a class. + + Args: + name: Name to register the scene under. + scene_or_cls: A Scene instance or a Scene class. + *args: Positional args forwarded to the constructor. + **kwargs: Keyword args forwarded to the constructor. + + Returns: + The scene instance added. + """ + if isinstance(scene_or_cls, Scene): + scene = scene_or_cls + else: + scene = scene_or_cls(*args, **kwargs) + self.scenes[name] = scene + scene.game = self + self.scene_order.append(name) + if not self.current_scene: + self.current_scene = scene + return scene + + def go_to_scene(self, name: str) -> Optional[Scene]: + """Queue a transition to a named scene. + + Args: + name: Registered name of the scene. + + Returns: + The target scene if found, otherwise None. + """ + scene = self.scenes.get(name) + if not scene: + print(f"Scene not found: {name}") + return None + self.next_scene = scene + return scene + + def go_to_scene_next(self) -> Optional[Scene]: + """Queue a transition to the next scene in order. + + Returns: + The next scene if one is available, otherwise None. + """ + if not self.current_scene: + return None + current_name = None + for name, scene in self.scenes.items(): + if scene == self.current_scene: + current_name = name + break + if current_name is None: + return None + if current_name in self.scene_order: + idx = self.scene_order.index(current_name) + if idx + 1 < len(self.scene_order): + next_name = self.scene_order[idx + 1] + else: + next_name = self.scene_order[0] + self.next_scene = self.scenes[next_name] + return self.next_scene diff --git a/py/engine/math_extensions.py b/py/engine/math_extensions.py new file mode 100644 index 0000000..d2de7ca --- /dev/null +++ b/py/engine/math_extensions.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import math +from typing import Iterable +import pyray as rl + + +def v2(x: float, y: float) -> rl.Vector2: + return rl.Vector2(x, y) + + +def vec_add(a: rl.Vector2, b: rl.Vector2) -> rl.Vector2: + return rl.Vector2(a.x + b.x, a.y + b.y) + + +def vec_sub(a: rl.Vector2, b: rl.Vector2) -> rl.Vector2: + return rl.Vector2(a.x - b.x, a.y - b.y) + + +def vec_mul(a: rl.Vector2, scalar: float) -> rl.Vector2: + return rl.Vector2(a.x * scalar, a.y * scalar) + + +def vec_div(a: rl.Vector2, scalar: float) -> rl.Vector2: + return rl.Vector2(a.x / scalar, a.y / scalar) + + +def vec_neg(a: rl.Vector2) -> rl.Vector2: + return rl.Vector2(-a.x, -a.y) + + +def vec_eq(a: rl.Vector2, b: rl.Vector2) -> bool: + return a.x == b.x and a.y == b.y + + +def vec_len(a: rl.Vector2) -> float: + return math.sqrt(a.x * a.x + a.y * a.y) + + +def vec_normalize(a: rl.Vector2) -> rl.Vector2: + length = vec_len(a) + if length <= 1e-8: + return rl.Vector2(0.0, 0.0) + return rl.Vector2(a.x / length, a.y / length) + + +def vec_from_iter(values: Iterable[float]) -> rl.Vector2: + x, y = values + return rl.Vector2(float(x), float(y)) diff --git a/py/engine/physics_debug.py b/py/engine/physics_debug.py new file mode 100644 index 0000000..dcf1ace --- /dev/null +++ b/py/engine/physics_debug.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Tuple + +from Box2D import b2Color, b2Draw +import pyray as rl + + +@dataclass +class DebugDrawCtx: + meters_to_pixels: float = 30.0 + line_thickness: float = 1.0 + + +def _to_raylib_color(color: b2Color, alpha: float = 1.0) -> rl.Color: + r = int(max(0, min(255, color.r * 255))) + g = int(max(0, min(255, color.g * 255))) + b = int(max(0, min(255, color.b * 255))) + a = int(max(0, min(255, alpha * 255))) + return rl.Color(r, g, b, a) + + +class PhysicsDebugRenderer(b2Draw): + def __init__(self, meters_to_pixels: float = 30.0, line_thickness: float = 1.0) -> None: + super().__init__() + self.ctx = DebugDrawCtx(meters_to_pixels=meters_to_pixels, line_thickness=line_thickness) + + def DrawPolygon(self, vertices, color): + count = len(vertices) + if count < 2: + return + c = _to_raylib_color(color) + for i in range(count): + p0 = vertices[i] + p1 = vertices[(i + 1) % count] + a = rl.Vector2(p0[0] * self.ctx.meters_to_pixels, p0[1] * self.ctx.meters_to_pixels) + b = rl.Vector2(p1[0] * self.ctx.meters_to_pixels, p1[1] * self.ctx.meters_to_pixels) + rl.draw_line_ex(a, b, self.ctx.line_thickness, c) + + def DrawSolidPolygon(self, vertices, color): + count = len(vertices) + if count < 2: + return + fill = _to_raylib_color(color, 0.8) + line = _to_raylib_color(color, 1.0) + pts = [rl.Vector2(v[0] * self.ctx.meters_to_pixels, v[1] * self.ctx.meters_to_pixels) for v in vertices] + center = rl.Vector2(0.0, 0.0) + for p in pts: + center.x += p.x + center.y += p.y + center.x /= count + center.y /= count + for i in range(count - 1): + rl.draw_triangle(pts[i], center, pts[i + 1], fill) + rl.draw_triangle(pts[count - 1], center, pts[0], fill) + for i in range(count): + rl.draw_line_ex(pts[i], pts[(i + 1) % count], self.ctx.line_thickness, line) + + def DrawCircle(self, center, radius, color): + c = _to_raylib_color(color) + rl.draw_circle_lines(int(center[0] * self.ctx.meters_to_pixels), + int(center[1] * self.ctx.meters_to_pixels), + radius * self.ctx.meters_to_pixels, + c) + + def DrawSolidCircle(self, center, radius, axis, color): + fill = _to_raylib_color(color, 0.8) + line = _to_raylib_color(color, 1.0) + c = rl.Vector2(center[0] * self.ctx.meters_to_pixels, center[1] * self.ctx.meters_to_pixels) + rl.draw_circle_v(c, radius * self.ctx.meters_to_pixels, fill) + axis_end = rl.Vector2((center[0] + axis[0] * radius) * self.ctx.meters_to_pixels, + (center[1] + axis[1] * radius) * self.ctx.meters_to_pixels) + rl.draw_line_ex(c, axis_end, self.ctx.line_thickness, line) + + def DrawSegment(self, p1, p2, color): + c = _to_raylib_color(color) + a = rl.Vector2(p1[0] * self.ctx.meters_to_pixels, p1[1] * self.ctx.meters_to_pixels) + b = rl.Vector2(p2[0] * self.ctx.meters_to_pixels, p2[1] * self.ctx.meters_to_pixels) + rl.draw_line_ex(a, b, self.ctx.line_thickness, c) + + def DrawTransform(self, xf): + p = xf.position + x_axis = xf.R.x_axis + y_axis = xf.R.y_axis + origin = rl.Vector2(p[0] * self.ctx.meters_to_pixels, p[1] * self.ctx.meters_to_pixels) + x_end = rl.Vector2((p[0] + x_axis[0]) * self.ctx.meters_to_pixels, (p[1] + x_axis[1]) * self.ctx.meters_to_pixels) + y_end = rl.Vector2((p[0] + y_axis[0]) * self.ctx.meters_to_pixels, (p[1] + y_axis[1]) * self.ctx.meters_to_pixels) + rl.draw_line_ex(origin, x_end, self.ctx.line_thickness, rl.RED) + rl.draw_line_ex(origin, y_end, self.ctx.line_thickness, rl.GREEN) + + def DrawPoint(self, p, size, color): + c = _to_raylib_color(color) + rl.draw_circle_v(rl.Vector2(p[0] * self.ctx.meters_to_pixels, p[1] * self.ctx.meters_to_pixels), size, c) diff --git a/py/engine/prefabs/__init__.py b/py/engine/prefabs/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/py/engine/prefabs/__init__.py @@ -0,0 +1 @@ + diff --git a/py/engine/prefabs/__pycache__/__init__.cpython-313.pyc b/py/engine/prefabs/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..74ce241 Binary files /dev/null and b/py/engine/prefabs/__pycache__/__init__.cpython-313.pyc differ diff --git a/py/engine/prefabs/__pycache__/components.cpython-313.pyc b/py/engine/prefabs/__pycache__/components.cpython-313.pyc new file mode 100644 index 0000000..dccee03 Binary files /dev/null and b/py/engine/prefabs/__pycache__/components.cpython-313.pyc differ diff --git a/py/engine/prefabs/__pycache__/game_objects.cpython-313.pyc b/py/engine/prefabs/__pycache__/game_objects.cpython-313.pyc new file mode 100644 index 0000000..c541a81 Binary files /dev/null and b/py/engine/prefabs/__pycache__/game_objects.cpython-313.pyc differ diff --git a/py/engine/prefabs/__pycache__/includes.cpython-313.pyc b/py/engine/prefabs/__pycache__/includes.cpython-313.pyc new file mode 100644 index 0000000..07cfbd6 Binary files /dev/null and b/py/engine/prefabs/__pycache__/includes.cpython-313.pyc differ diff --git a/py/engine/prefabs/__pycache__/managers.cpython-313.pyc b/py/engine/prefabs/__pycache__/managers.cpython-313.pyc new file mode 100644 index 0000000..cbdab72 Binary files /dev/null and b/py/engine/prefabs/__pycache__/managers.cpython-313.pyc differ diff --git a/py/engine/prefabs/__pycache__/services.cpython-313.pyc b/py/engine/prefabs/__pycache__/services.cpython-313.pyc new file mode 100644 index 0000000..b5fda48 Binary files /dev/null and b/py/engine/prefabs/__pycache__/services.cpython-313.pyc differ diff --git a/py/engine/prefabs/components.h b/py/engine/prefabs/components.h new file mode 100644 index 0000000..ff44f81 --- /dev/null +++ b/py/engine/prefabs/components.h @@ -0,0 +1,1392 @@ +#pragma once + +#include "engine/framework.h" +#include "engine/prefabs/managers.h" +#include "engine/prefabs/services.h" +#include "engine/raycasts.h" + +/** + * For when you want a GameObject to have multiple of the same component. + */ +template +class MultiComponent : public Component +{ +public: + std::unordered_map> components; + + MultiComponent() {} + + /** + * Initialize all components. + */ + void init() override + { + for (auto& component : components) + { + component.second->init(); + } + } + + /** + * Update all components. + * + * @param delta_time The time elapsed since the last frame. + */ + void update(float delta_time) override + { + for (auto& component : components) + { + component.second->update(delta_time); + } + } + + /** + * Draw all components. + */ + void draw() override + { + for (auto& component : components) + { + component.second->draw(); + } + } + + /** + * Add a component to the MultiComponent. + * + * @param name The name to give the component. + * @param component The component to add. + */ + void add_component(std::string name, std::unique_ptr component) + { + static_assert(std::is_base_of::value, "T must derive from Component"); + components[name] = std::move(component); + components[name]->owner = owner; + } + + /** + * Create a component and add it to the MultiComponent. + * + * @param name The name to give the component. + * @param args The arguments to forward to the component constructor. + * @return A pointer to the added component. + */ + template + T* add_component(std::string name, TArgs&&... args) + { + static_assert(std::is_base_of::value, "T must derive from Component"); + auto new_component = std::make_unique(std::forward(args)...); + T* component_ptr = new_component.get(); + add_component(name, std::move(new_component)); + return component_ptr; + } + + /** + * Get a component by name. + * + * @param name The name of the component. + * @return A pointer to the component. + */ + T* get_component(std::string name) + { + return components[name].get(); + } +}; + +/** + * A component for rendering text. + * Depends on FontManager. + */ +class TextComponent : public Component +{ +public: + FontManager* font_manager; + std::string text; + std::string font_name; + int font_size = 20; + Color color = WHITE; + Vector2 position = {0, 0}; + float rotation = 0.0f; + + /** + * Constructor for TextComponent. + * + * @param text The text to display. + * @param font_name The name of the font to use. + * @param font_size The size of the font. + * @param color The color of the text. + */ + TextComponent(std::string text, std::string font_name = "default", int font_size = 20, Color color = WHITE) : + text(text), + font_name(font_name), + font_size(font_size), + color(color) + { + } + + /** + * Initialize the text component. + */ + void init() override + { + font_manager = owner->scene->game->get_manager(); + } + + /** + * Draw the text. + */ + void draw() override + { + DrawTextEx(font_manager->get_font(font_name), + text.c_str(), + position, + static_cast(font_size), + 1.0f, + color); + } + + /** + * Set the text to display. + * + * @param text The text to display. + */ + void set_text(const std::string& text) + { + this->text = text; + } + + /** + * Set the color of the text. + * + * @param color The color to set. + */ + void set_color(Color color) + { + this->color = color; + } + + /** + * Set the font size. + * + * @param font_size The font size to set. + */ + void set_font_size(int font_size) + { + this->font_size = font_size; + } + + /** + * Set the font by name. + * + * @param font_name The name of the font to set. + */ + void set_font(const std::string& font_name) + { + this->font_name = font_name; + } + + /** + * Set the position of the text. + * + * @param position The position to set. + */ + void set_position(Vector2 position) + { + this->position = position; + } + + /** + * Set the rotation of the text. + * + * @param rotation The rotation to set. + */ + void set_rotation(float rotation) + { + this->rotation = rotation; + } +}; + +/** + * A component for playing sounds. + * Depends on SoundService. + */ +class SoundComponent : public Component +{ +public: + std::string filename; + Sound sound; + float volume = 1.0f; + float pitch = 1.0f; + float pan = 0.5f; + + /** + * Constructor for SoundComponent. + * + * @param filename The filename of the sound to load. + * @param volume The initial volume of the sound. + * @param pitch The initial pitch of the sound. + */ + SoundComponent(std::string filename, float volume = 1.0f, float pitch = 1.0f, float pan = 0.5f) : + filename(filename), + volume(volume), + pitch(pitch), + pan(pan) + { + } + + /** + * Initialize the sound component. + */ + void init() override + { + auto sound_service = owner->scene->get_service(); + sound = sound_service->get_sound(filename); + } + + /** + * Play the sound. + */ + void play() + { + PlaySound(sound); + } + + /** + * Stop the sound. + */ + void stop() + { + StopSound(sound); + } + + /** + * Set the volume of the sound. + * + * @param volume The volume to set. + */ + void set_volume(float volume) + { + this->volume = volume; + SetSoundVolume(sound, volume); + } + + /** + * Set the pitch of the sound. + * + * @param pitch The pitch to set. + */ + void set_pitch(float pitch) + { + this->pitch = pitch; + SetSoundPitch(sound, pitch); + } + + /** + * Set the pan of the sound. + * + * @param pan The pan to set, between 0.0 (left) and 1.0 (right). + */ + void set_pan(float pan) + { + this->pan = pan; + SetSoundPan(sound, pan); + } + + /** + * Check if the sound is currently playing. + * + * @return True if the sound is playing, false otherwise. + */ + bool is_playing() + { + return IsSoundPlaying(sound); + } +}; + +/** + * A component for a Box2D physics body. + * Depends on PhysicsService. + */ +class BodyComponent : public Component +{ +public: + b2BodyId id = b2_nullBodyId; + std::function build; + PhysicsService* physics; + + BodyComponent() {} + + /** + * Constructor for BodyComponent with existing body ID. + * + * @param id The Box2D body ID. + */ + BodyComponent(b2BodyId id) : id(id) {} + + /** + * Specify a lambda for creating the physics body which will be called during init. + * It is the user's responsibility to assign the body id to id in this function. + * + * @param build A user provided function for creating a physics body. + */ + BodyComponent(std::function build = {}) : build(std::move(build)) {} + + ~BodyComponent() + { + if (b2Body_IsValid(id)) + { + b2DestroyBody(id); + } + } + + /** + * Initialize the body component. + */ + void init() override + { + physics = owner->scene->get_service(); + if (build) + { + build(*this); + } + } + + /** + * Enable the body in the physics simulation. + */ + void enable() + { + b2Body_Enable(id); + } + + /** + * Disable the body in the physics simulation. + */ + void disable() + { + b2Body_Disable(id); + } + + /** + * Get the position of the body in meters. + */ + b2Vec2 get_position_meters() const + { + return b2Body_GetPosition(id); + } + + /** + * Get the position of the body in pixels. + */ + Vector2 get_position_pixels() const + { + return physics->convert_to_pixels(get_position_meters()); + } + + /** + * Set the position of the body in meters. + * + * @param meters The position in meters. + */ + void set_position(b2Vec2 meters) + { + b2Rot rotation = b2Body_GetRotation(id); + b2Body_SetTransform(id, meters, rotation); + } + + /** + * Set the position of the body in pixels. + * + * @param pixels The position in pixels. + */ + void set_position(Vector2 pixels) + { + set_position(physics->convert_to_meters(pixels)); + } + + /** + * Set the rotation of the body in degrees. + * + * @param degrees The rotation in degrees. + */ + void set_rotation(float degrees) + { + b2Vec2 position = b2Body_GetPosition(id); + b2Rot rotation = b2MakeRot(degrees * DEG2RAD); + b2Body_SetTransform(id, position, rotation); + } + + /** + * Get the velocity of the body in meters per second. + * + * @return The velocity in meters per second. + */ + b2Vec2 get_velocity_meters() const + { + return b2Body_GetLinearVelocity(id); + } + + /** + * Get the velocity of the body in pixels per second. + * + * @return The velocity in pixels per second. + */ + Vector2 get_velocity_pixels() const + { + return physics->convert_to_pixels(get_velocity_meters()); + } + + /** + * Set the velocity of the body in meters per second. + * + * @param meters_per_second The velocity in meters per second. + */ + void set_velocity(b2Vec2 meters_per_second) + { + b2Body_SetLinearVelocity(id, meters_per_second); + } + + /** + * Set the velocity of the body in pixels per second. + * + * @param pixels_per_second The velocity in pixels per second. + */ + void set_velocity(Vector2 pixels_per_second) + { + set_velocity(physics->convert_to_meters(pixels_per_second)); + } + + /** + * Get the rotation of the body in degrees. + * + * @return The rotation in degrees. + */ + float get_rotation() const + { + auto rot = b2Body_GetRotation(id); + return b2Rot_GetAngle(rot) * RAD2DEG; + } + + /** + * Get a list of all bodies colliding with this one. + * https://box2d.org/documentation/md_simulation.html#autotoc_md94 + * + * @return A list of b2BodyIds that are touching this one. Combine with User Data to get your objects. + */ + std::vector get_contacts() + { + // Choose 10 as an arbitrary max number of contacts on the body. + constexpr int capacity = 10; + b2ContactData contact_data[capacity]; + + int count = b2Body_GetContactData(id, contact_data, capacity); + std::vector contacts; + for (int i = 0; i < count; i++) + { + auto contact = contact_data[i]; + auto body_a = b2Shape_GetBody(contact.shapeIdA); + auto body_b = b2Shape_GetBody(contact.shapeIdB); + auto body = body_a == id ? body_b : body_a; + contacts.push_back(body); + } + + // Remove duplicate bodies. + std::sort(contacts.begin(), contacts.end()); + contacts.erase(std::unique(contacts.begin(), contacts.end()), contacts.end()); + return contacts; + } + + /** + * Get a list of all bodies overlapping with sensors in this body. + * The shape definitions must have isSensor and enableSensorEvents set. + * https://box2d.org/documentation/md_simulation.html#autotoc_md81 + * + * @return A list of b2BodyIds that are overlapping the sensor shapes in this body. Combine with User Data to get + * your objects. + */ + std::vector get_sensor_overlaps() + { + // Choose 10 as an arbitrary max number of shapes on the body. + constexpr int shape_capacity = 10; + b2ShapeId shapes[shape_capacity]; + int shape_count = b2Body_GetShapes(id, shapes, shape_capacity); + + std::vector contacts; + for (int i = 0; i < shape_count; i++) + { + auto shape = shapes[i]; + if (b2Shape_IsSensor(shape)) + { + // Choose 10 as an arbitrary max number of contacts on the sensor shape. + constexpr int shape_capacity = 10; + b2ShapeId shapes[shape_capacity]; + int shape_count = b2Shape_GetSensorOverlaps(shape, shapes, shape_capacity); + + for (int j = 0; j < shape_count; j++) + { + auto shape = shapes[j]; + auto body = b2Shape_GetBody(shape); + // Check if body is already in contacts to avoid duplicates. + if (std::find(contacts.begin(), contacts.end(), body) == contacts.end()) + { + contacts.push_back(body); + } + } + } + } + + // Remove duplicate bodies. + std::sort(contacts.begin(), contacts.end()); + contacts.erase(std::unique(contacts.begin(), contacts.end()), contacts.end()); + return contacts; + } +}; + +/** + * A component for rendering a sprite. + * Depends on TextureService. + */ +class SpriteComponent : public Component +{ +public: + std::string filename; + BodyComponent* body = nullptr; + + Texture2D sprite; + Vector2 position = {0, 0}; + float rotation = 0.0f; + float scale = 1.0f; + Color tint = WHITE; + bool is_active = true; + + /** + * Constructor for SpriteComponent. + * + * @param filename The filename of the texture to load. + */ + SpriteComponent(std::string filename) : filename(filename) {} + + /** + * Constructor for SpriteComponent with optional BodyComponent to follow. + * + * @param body The BodyComponent to follow for position and rotation. + * @param filename The filename of the texture to load. + */ + SpriteComponent(std::string filename, BodyComponent* body) : filename(filename), body(body) {} + + /** + * Initialize the sprite component. + */ + void init() override + { + auto texture_service = owner->scene->get_service(); + sprite = texture_service->get_texture(filename); + } + + /** + * Draw the sprite. + */ + void draw() override + { + if (!is_active) + { + return; + } + + if (body) + { + position = body->get_position_pixels(); + rotation = body->get_rotation(); + } + + Rectangle source = {0, 0, (float)sprite.width, (float)sprite.height}; + Rectangle dest = {position.x, position.y, (float)sprite.width * scale, (float)sprite.height * scale}; + Vector2 origin = {sprite.width / 2.0f * scale, sprite.height / 2.0f * scale}; + + DrawTexturePro(sprite, source, dest, origin, rotation, tint); + } + + /** + * Set the position of the sprite. + * + * @param position The position to set. + */ + void set_position(Vector2 position) + { + this->position = position; + } + + /** + * Set the rotation of the sprite. + * + * @param rotation The rotation to set in degrees. + */ + void set_rotation(float rotation) + { + this->rotation = rotation; + } + + /** + * Set the scale of the sprite. + * + * @param scale The scale to set. + */ + void set_scale(float scale) + { + this->scale = scale; + } + + /** + * Set the tint color of the sprite. + * + * @param tint The tint color to set. + */ + void set_tint(Color tint) + { + this->tint = tint; + } + + /** + * Set whether the sprite is active or not. + * The sprite will not be drawn if inactive. + * + * @param active True to make the sprite active, false to deactivate it. + */ + void set_active(bool active) + { + is_active = active; + } +}; + +/** + * A class for handling frame-based animations. + * Depends on TextureService. + */ +class Animation +{ +public: + std::vector frames; + float fps = 15.0f; + float frame_timer = 0.0f; + bool loop = true; + + int current_frame = 0; + bool playing = true; + bool is_active = true; + + /** + * Constructor for Animation. + * + * @param frames The frames of the animation as Texture2D objects. + * @param fps The frames per second of the animation. + * @param loop Whether the animation should loop or not. + */ + Animation(const std::vector& frames, float fps = 15.0f, bool loop = true) : + frames(frames), + fps(fps), + frame_timer(1.0f / fps), + loop(loop) + { + } + + /** + * Constructor for Animation that loads frames from filenames. + * + * @param texture_service The TextureService to load textures from. + * @param filenames The filenames of the frames of the animation. + * @param fps The frames per second of the animation. + * @param loop Whether the animation should loop or not. + */ + Animation(TextureService* texture_service, + const std::vector& filenames, + float fps = 15.0f, + bool loop = true) : + fps(fps), + frame_timer(1.0f / fps), + loop(loop) + { + for (const auto& filename : filenames) + { + frames.push_back(texture_service->get_texture(filename)); + } + } + + /** + * Update the animation. + * + * @param delta_time The time elapsed since the last frame. + */ + void update(float delta_time) + { + if (frames.empty()) + { + return; + } + if (!playing || !is_active) + { + return; + } + + frame_timer -= delta_time; + if (frame_timer <= 0.0f) + { + frame_timer = 1.0f / fps; + current_frame++; + } + + if (current_frame > frames.size() - 1) + { + if (loop) + current_frame = 0; + else + { + current_frame = (int)frames.size() - 1; + } + } + } + + /** + * Draw the animation. + * + * @param position The position to draw the animation at. + * @param rotation The rotation of the animation in degrees. + * @param tint The tint color to apply to the animation. + */ + void draw(Vector2 position, float rotation = 0.0f, Color tint = WHITE) + { + if (!is_active) + { + return; + } + + auto sprite = frames[current_frame]; + DrawTexturePro(sprite, + {0.0f, 0.0f, static_cast(sprite.width), static_cast(sprite.height)}, + {position.x, position.y, static_cast(sprite.width), static_cast(sprite.height)}, + {static_cast(sprite.width) / 2.0f, static_cast(sprite.height) / 2.0f}, + rotation, + tint); + } + + /** + * Draw the animation with a specific origin. + * + * @param position The position to draw the animation at. + * @param origin The origin point for rotation and scaling. + * @param rotation The rotation of the animation in degrees. + * @param scale The scale of the animation. + * @param flip_x Whether to flip the animation horizontally. + * @param flip_y Whether to flip the animation vertically. + * @param tint The tint color to apply to the animation. + */ + void draw(Vector2 position, + Vector2 origin, + float rotation = 0.0f, + float scale = 1.0f, + bool flip_x = false, + bool flip_y = false, + Color tint = WHITE) + { + if (!is_active) + { + return; + } + + auto sprite = frames[current_frame]; + DrawTexturePro(sprite, + {0.0f, + 0.0f, + static_cast(sprite.width) * (flip_x ? -1.0f : 1.0f), + static_cast(sprite.height) * (flip_y ? -1.0f : 1.0f)}, + {position.x, + position.y, + static_cast(sprite.width) * scale, + static_cast(sprite.height) * scale}, + origin * scale, + rotation, + tint); + } + + /** + * Play the animation. + */ + void play() + { + playing = true; + } + + /** + * Pause the animation. + */ + void pause() + { + playing = false; + } + + /** + * Stop the animation and reset to the first frame. + */ + void stop() + { + playing = false; + frame_timer = 1.0f / fps; + current_frame = 0; + } +}; + +/** + * A component for controlling animations. + * Depends on TextureService. + */ +class AnimationController : public Component +{ +public: + std::unordered_map> animations; + Animation* current_animation = nullptr; + Vector2 position = {0.0f, 0.0f}; + float rotation = 0.0f; + Vector2 origin = {0.0f, 0.0f}; + float scale = 1.0f; + bool flip_x = false; + bool flip_y = false; + BodyComponent* body = nullptr; + + AnimationController() = default; + + /** + * Constructor for AnimationController that follows a BodyComponent. + * + * @param body The BodyComponent to follow for position and rotation. + */ + AnimationController(BodyComponent* body) : body(body) {} + + /** + * Update the animation controller. + * + * @param delta_time The time elapsed since the last frame. + */ + void update(float delta_time) override + { + if (current_animation) + { + current_animation->update(delta_time); + } + } + + /** + * Draw the current animation. + */ + void draw() override + { + if (body) + { + position = body->get_position_pixels(); + rotation = body->get_rotation(); + } + + if (current_animation) + { + current_animation->draw(position, origin, rotation, scale, flip_x, flip_y); + } + } + + /** + * Add an existing animation to the controller. + * + * @param name The name to give the animation. + * @param animation The animation to add. + */ + void add_animation(const std::string& name, std::unique_ptr animation) + { + animations[name] = std::move(animation); + if (!current_animation) + { + current_animation = animations[name].get(); + auto sprite = current_animation->frames[current_animation->current_frame]; + origin = {sprite.width / 2.0f, sprite.height / 2.0f}; + } + } + + /** + * Create an animation and add it to the controller. + * + * @param name The name to give the animation. + * @param args The arguments to forward to the Animation constructor. + * @return A pointer to the added animation. + */ + template + Animation* add_animation(const std::string& name, TArgs&&... args) + { + auto texture_service = owner->scene->get_service(); + auto new_animation = std::make_unique(texture_service, std::forward(args)...); + Animation* animation_ptr = new_animation.get(); + add_animation(name, std::move(new_animation)); + return animation_ptr; + } + + /** + * Get an animation by name. + * + * @param name The name of the animation. + * @return A pointer to the animation. + */ + Animation* get_animation(const std::string& name) + { + return animations[name].get(); + } + + /** + * Play the current animation. + */ + void play() + { + if (current_animation) + { + current_animation->play(); + } + } + + /** + * Play an animation by name. + * + * @param name The name of the animation to play. + */ + void play(const std::string& name) + { + auto it = animations.find(name); + if (it != animations.end()) + { + current_animation = it->second.get(); + current_animation->play(); + auto sprite = current_animation->frames[current_animation->current_frame]; + } + } + + /** + * Pause the current animation. + */ + void pause() + { + if (current_animation) + { + current_animation->pause(); + } + } + + /** + * Set whether the current animation is playing or paused. + * + * @param play True to play the animation, false to pause it. + */ + void set_play(bool play) + { + if (current_animation) + { + if (play) + { + current_animation->play(); + } + else + { + current_animation->pause(); + } + } + } + + /** + * Stop the current animation. + */ + void stop() + { + if (current_animation) + { + current_animation->stop(); + } + } + + /** + * Set the position of the animation. + * + * @param pos The position to set. + */ + void set_position(Vector2 pos) + { + position = pos; + } + + /** + * Set the rotation of the animation. + * + * @param rot The rotation to set in degrees. + */ + void set_rotation(float rot) + { + rotation = rot; + } + + /** + * Set the origin of the animation. + * + * @param orig The origin to set. + */ + void set_origin(Vector2 orig) + { + origin = orig; + } + + /** + * Set the scale of the animation. + * + * @param s The scale to set. + */ + void set_scale(float s) + { + scale = s; + } + + /** + * Set whether to flip the animation horizontally. + * + * @param fx True to flip horizontally, false otherwise. + */ + void set_flip_x(bool fx) + { + flip_x = fx; + } + + /** + * Set whether to flip the animation vertically. + * + * @param fy True to flip vertically, false otherwise. + */ + void set_flip_y(bool fy) + { + flip_y = fy; + } +}; + +/** + * Parameters for PlatformerMovementComponent. + */ +struct PlatformerMovementParams +{ + float width = 24.0f; // pixels + float height = 40.0f; // pixels + + // Movement + float max_speed = 220.0f; // pixels / second + float accel = 2000.0f; // pixels / second / second + float decel = 2500.0f; // pixels / second / second + + // Gravity / jump + float gravity = 1400.0f; // pixels / second / second + float jump_speed = 520.0f; // pixels / second + float fall_speed = 1200.0f; // pixels / second + float jump_cutoff_multiplier = 0.45f; // jump multiplier when the jump button is released early + + // Forgiveness + float coyote_time = 0.08f; // seconds + float jump_buffer = 0.10f; // seconds +}; + +/** + * A component for 2D platformer movement. + * Depends on PhysicsService and BodyComponent. + */ +class PlatformerMovementComponent : public Component +{ +public: + PlatformerMovementParams p; + PhysicsService* physics; + BodyComponent* body; + + bool grounded = false; + bool on_wall_left = false; + bool on_wall_right = false; + float coyote_timer = 0.0f; + float jump_buffer_timer = 0.0f; + + float move_x = 0; + bool jump_pressed = false; + bool jump_held = false; + + /** + * Constructor for PlatformerMovementComponent. + * + * @param p The movement parameters. + */ + PlatformerMovementComponent(PlatformerMovementParams p) : p(p) {} + + /** + * Initialize the movement component. + */ + void init() override + { + physics = owner->scene->get_service(); + body = owner->get_component(); + } + + /** + * Update the movement component. + * + * @param delta_time The time elapsed since the last frame. + */ + void update(float delta_time) override + { + if (!b2Body_IsValid(body->id)) + { + return; + } + + coyote_timer = std::max(0.0f, coyote_timer - delta_time); + jump_buffer_timer = std::max(0.0f, jump_buffer_timer - delta_time); + + if (jump_pressed) + { + jump_buffer_timer = p.jump_buffer; + } + + // Grounded check + grounded = false; + on_wall_left = false; + on_wall_right = false; + + // Convert probe distances to meters + float ray_length = physics->convert_to_meters(4.0f); + + float half_width = physics->convert_to_meters(p.width) / 2.0f; + float half_height = physics->convert_to_meters(p.height) / 2.0f; + + // Ground: cast down from two points near the feet (left/right) + auto pos = body->get_position_meters(); + b2Vec2 ground_left_start = {pos.x - half_width, pos.y + half_height}; + b2Vec2 ground_right_start = {pos.x + half_width, pos.y + half_height}; + b2Vec2 ground_translation = {0, ray_length}; + const b2WorldId world = physics->world; + + RayHit left_ground_hit = raycast_closest(world, body->id, ground_left_start, ground_translation); + RayHit right_ground_hit = raycast_closest(world, body->id, ground_right_start, ground_translation); + grounded = left_ground_hit.hit || right_ground_hit.hit; + + // Walls: cast left/right at mid-body height + b2Vec2 mid = {pos.x, pos.y}; + b2Vec2 wall_left_start = {pos.x - half_width, mid.y}; + b2Vec2 wall_left_translation = {-ray_length, 0}; + b2Vec2 wall_right_start = {pos.x + half_width, mid.y}; + b2Vec2 wall_right_translation = {ray_length, 0}; + + RayHit left_wall_hit = raycast_closest(world, body->id, wall_left_start, wall_left_translation); + RayHit right_wall_hit = raycast_closest(world, body->id, wall_right_start, wall_right_translation); + + on_wall_left = left_wall_hit.hit; + on_wall_right = right_wall_hit.hit; + if (grounded) + { + coyote_timer = p.coyote_time; + } + + float target_vx = move_x * p.max_speed; + + auto v = body->get_velocity_pixels(); + + if (std::fabs(target_vx) > 0.001f) + { + float a = p.accel; + v.x = move_towards(v.x, target_vx, a * delta_time); + } + else + { + float a = p.decel; + v.x = move_towards(v.x, 0.0f, a * delta_time); + } + + // Gravity (custom) + v.y += p.gravity * delta_time; + v.y = std::max(-p.fall_speed, std::min(p.fall_speed, v.y)); + + // Jump + const bool can_jump = (grounded || coyote_timer > 0.0f); + if (jump_buffer_timer > 0.0f && can_jump) + { + v.y = -p.jump_speed; + jump_buffer_timer = 0.0f; + coyote_timer = 0.0f; + grounded = false; + } + + // Variable jump height: cut upward velocity when jump released + if (!jump_held && v.y < 0.0f) + { + v.y *= p.jump_cutoff_multiplier; + } + + // Write velocity back + body->set_velocity(v); + } + + /** + * Calculates a value moved towards a target by a maximum delta. + * + * @param current The current value. + * @param target The target value. + * @param max_delta The maximum change that can be applied. + * @return The new value after moving towards the target. + */ + static float move_towards(float current, float target, float max_delta) + { + float delta = target - current; + if (std::fabs(delta) <= max_delta) + return target; + return current + (delta > 0 ? max_delta : -max_delta); + } + + /** + * Set the input for movement. + * + * @param horizontal_speed The horizontal speed input (-1.0 to 1.0). + * @param jump_pressed Whether the jump button was pressed this frame. + * @param jump_held Whether the jump button is currently held down. + */ + void set_input(float horizontal_speed, bool jump_pressed, bool jump_held) + { + move_x = horizontal_speed; + this->jump_pressed = jump_pressed; + this->jump_held = jump_held; + } +}; + +struct TopDownMovementParams +{ + float max_speed = 300.0f; // max speed in px/s + float accel = 1200.0f; // accel when holding input + float friction = 1200.0f; // decel when no input + float deadzone = 0.1f; // input deadzone +}; + +/** + * A component for 2D top-down movement. + * Depends on PhysicsService and BodyComponent. + * + * Movement is controlled by setting a 2D input vector (move_x, move_y), + * and this component accelerates/decelerates the body towards a target + * velocity using simple acceleration + friction. + */ +class TopDownMovementComponent : public Component +{ +public: + TopDownMovementParams p; + PhysicsService* physics = nullptr; + BodyComponent* body = nullptr; + + // Raw input in [-1, 1] range for each axis. + float move_x = 0.0f; + float move_y = 0.0f; + + // Store last facing direction for aiming/animation. + float facing_dir = 0.0f; + + TopDownMovementComponent(TopDownMovementParams p) : p(p) {} + + void init() override + { + physics = owner->scene->get_service(); + body = owner->get_component(); + } + + void update(float delta_time) override + { + if (!b2Body_IsValid(body->id)) + { + return; + } + + // Current velocity in pixels/sec (assuming your BodyComponent uses this). + Vector2 v = body->get_velocity_pixels(); + + // Build desired movement input vector. + Vector2 input = {move_x, move_y}; + float input_len_sq = input.x * input.x + input.y * input.y; + + Vector2 desired_vel = {0.0f, 0.0f}; + + // Deadzone. + if (input_len_sq > p.deadzone * p.deadzone) + { + desired_vel.x = input.x * p.max_speed; + desired_vel.y = input.y * p.max_speed; + + // Update facing direction. + facing_dir = atan2f(input.y, input.x) * RAD2DEG; + + // Accelerate towards desired velocity. + v = move_towards_vec(v, desired_vel, p.accel * delta_time); + } + else + { + // No input: apply friction to slow down. + v = apply_friction(v, p.friction * delta_time); + } + + // Clamp to max speed just in case. + float speed_sq = v.x * v.x + v.y * v.y; + float max_speed_sq = p.max_speed * p.max_speed; + if (speed_sq > max_speed_sq) + { + float speed = std::sqrt(speed_sq); + float scale = p.max_speed / speed; + v.x *= scale; + v.y *= scale; + } + + body->set_velocity(v); + } + + /** + * Move a velocity vector towards a target vector by at most max_delta length. + */ + static Vector2 move_towards_vec(const Vector2& current, const Vector2& target, float max_delta) + { + Vector2 delta = {target.x - current.x, target.y - current.y}; + float len = std::sqrt(delta.x * delta.x + delta.y * delta.y); + if (len <= max_delta || len < 1e-5f) + { + return target; + } + float scale = max_delta / len; + return Vector2{current.x + delta.x * scale, current.y + delta.y * scale}; + } + + /** + * Apply friction to a velocity vector (reduce its magnitude). + * `friction_delta` is how much speed we remove this frame. + */ + static Vector2 apply_friction(const Vector2& v, float friction_delta) + { + float speed = std::sqrt(v.x * v.x + v.y * v.y); + if (speed < 1e-5f) + { + return Vector2{0.0f, 0.0f}; + } + + float new_speed = speed - friction_delta; + if (new_speed <= 0.0f) + { + return Vector2{0.0f, 0.0f}; + } + + float scale = new_speed / speed; + return Vector2{v.x * scale, v.y * scale}; + } + + /** + * Set the input for movement. + * + * @param horizontal Horizontal input (-1.0 to 1.0). + * @param vertical Vertical input (-1.0 to 1.0). + */ + void set_input(float horizontal, float vertical) + { + move_x = horizontal; + move_y = vertical; + } +}; diff --git a/py/engine/prefabs/components.py b/py/engine/prefabs/components.py new file mode 100644 index 0000000..e9db4ba --- /dev/null +++ b/py/engine/prefabs/components.py @@ -0,0 +1,1214 @@ +from __future__ import annotations + +import math +from typing import Any, Dict, List, Optional + +from Box2D import (b2Body, b2CircleShape, b2FixtureDef, b2PolygonShape, + b2Vec2) +import pyray as rl + +from engine.framework import Component +from engine.math_extensions import vec_add, vec_div, vec_len, vec_mul, vec_normalize, vec_sub, v2 +from engine.raycasts import raycast_closest +from engine.prefabs.managers import FontManager +from engine.prefabs.services import PhysicsService, SoundService, TextureService + + +class MultiComponent(Component): + """Container component that allows multiple components of the same type.""" + def __init__(self) -> None: + """ init . + + Returns: + None + """ + super().__init__() + self.components: Dict[str, Component] = {} + + def init(self) -> None: + """Initialize all contained components. + + Returns: + None + """ + for component in self.components.values(): + component.init() + + def update(self, delta_time: float) -> None: + """Update all contained components. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + for component in self.components.values(): + component.update(delta_time) + + def draw(self) -> None: + """Draw all contained components. + + Returns: + None + """ + for component in self.components.values(): + component.draw() + + def add_component(self, name: str, component_or_cls: Any, *args: Any, **kwargs: Any) -> Component: + """Add a component under a name. + + Args: + name: Component name key. + component_or_cls: Component instance or class. + *args: Positional args forwarded to constructor. + **kwargs: Keyword args forwarded to constructor. + + Returns: + The component instance added. + """ + if isinstance(component_or_cls, Component): + component = component_or_cls + else: + component = component_or_cls(*args, **kwargs) + component.owner = self.owner + self.components[name] = component + return component + + def get_component(self, name: str) -> Optional[Component]: + """Get a component by name. + + Args: + name: Component name key. + + Returns: + The component if present, otherwise None. + """ + return self.components.get(name) + + +class TextComponent(Component): + """Component for rendering text. Depends on FontManager.""" + def __init__(self, text: str, font_name: str = "default", font_size: int = 20, color: rl.Color = rl.WHITE) -> None: + """ init . + + Args: + text: Parameter. + font_name: Parameter. + font_size: Parameter. + color: Parameter. + + Returns: + None + """ + super().__init__() + self.font_manager: Optional[FontManager] = None + self.text = text + self.font_name = font_name + self.font_size = font_size + self.color = color + self.position = v2(0.0, 0.0) + self.rotation = 0.0 + + def init(self) -> None: + """Resolve FontManager from the owning scene. + + Returns: + None + """ + if self.owner and self.owner.scene and self.owner.scene.game: + self.font_manager = self.owner.scene.game.get_manager(FontManager) + + def draw(self) -> None: + """Draw the text if a font is available. + + Returns: + None + """ + if not self.font_manager: + return + rl.draw_text_ex(self.font_manager.get_font(self.font_name), + self.text, + self.position, + float(self.font_size), + 1.0, + self.color) + + def set_text(self, text: str) -> None: + """Set the displayed text. + + Args: + text: New text string. + + Returns: + None + """ + self.text = text + + def set_color(self, color: rl.Color) -> None: + """Set the text color. + + Args: + color: Raylib color. + + Returns: + None + """ + self.color = color + + def set_font_size(self, font_size: int) -> None: + """Set the font size. + + Args: + font_size: New font size. + + Returns: + None + """ + self.font_size = font_size + + def set_font(self, font_name: str) -> None: + """Set the font by name. + + Args: + font_name: Registered font name. + + Returns: + None + """ + self.font_name = font_name + + def set_position(self, position: rl.Vector2) -> None: + """Set the text position. + + Args: + position: Vector2 in pixels. + + Returns: + None + """ + self.position = position + + def set_rotation(self, rotation: float) -> None: + """Set the text rotation. + + Args: + rotation: Rotation in degrees. + + Returns: + None + """ + self.rotation = rotation + + +class SoundComponent(Component): + """Component for playing sounds. Depends on SoundService.""" + def __init__(self, filename: str, volume: float = 1.0, pitch: float = 1.0, pan: float = 0.5) -> None: + """ init . + + Args: + filename: Parameter. + volume: Parameter. + pitch: Parameter. + pan: Parameter. + + Returns: + None + """ + super().__init__() + self.filename = filename + self.sound = None + self.volume = volume + self.pitch = pitch + self.pan = pan + + def init(self) -> None: + """Load the sound from SoundService. + + Returns: + None + """ + if self.owner and self.owner.scene: + sound_service = self.owner.scene.get_service(SoundService) + self.sound = sound_service.get_sound(self.filename) + + def play(self) -> None: + """Play the sound. + + Returns: + None + """ + if self.sound: + rl.play_sound(self.sound) + + def stop(self) -> None: + """Stop the sound. + + Returns: + None + """ + if self.sound: + rl.stop_sound(self.sound) + + def set_volume(self, volume: float) -> None: + """Set playback volume. + + Args: + volume: Volume scalar. + + Returns: + None + """ + self.volume = volume + if self.sound: + rl.set_sound_volume(self.sound, volume) + + def set_pitch(self, pitch: float) -> None: + """Set playback pitch. + + Args: + pitch: Pitch scalar. + + Returns: + None + """ + self.pitch = pitch + if self.sound: + rl.set_sound_pitch(self.sound, pitch) + + def set_pan(self, pan: float) -> None: + """Set playback pan. + + Args: + pan: Pan value from 0.0 (left) to 1.0 (right). + + Returns: + None + """ + self.pan = pan + if self.sound: + rl.set_sound_pan(self.sound, pan) + + def is_playing(self) -> bool: + """Check if the sound is currently playing. + + Returns: + True if playing, otherwise False. + """ + return bool(self.sound and rl.is_sound_playing(self.sound)) + + +class BodyComponent(Component): + """Component that owns a Box2D body. Depends on PhysicsService.""" + def __init__(self, body: Optional[b2Body] = None, build: Optional[Any] = None) -> None: + """ init . + + Args: + body: Parameter. + build: Parameter. + + Returns: + None + """ + super().__init__() + self.body = body + self.build = build + self.physics: Optional[PhysicsService] = None + + def init(self) -> None: + """Resolve PhysicsService and build the body if provided. + + Returns: + None + """ + if not self.owner or not self.owner.scene: + return + self.physics = self.owner.scene.get_service(PhysicsService) + if self.build: + self.build(self) + + def enable(self) -> None: + """Enable the body in the physics simulation. + + Returns: + None + """ + if self.body: + self.body.awake = True + self.body.active = True + + def disable(self) -> None: + """Disable the body in the physics simulation. + + Returns: + None + """ + if self.body: + self.body.active = False + + def get_position_meters(self) -> b2Vec2: + """Get position in meters. + + Returns: + b2Vec2 position in meters. + """ + return self.body.position if self.body else b2Vec2(0.0, 0.0) + + def get_position_pixels(self) -> rl.Vector2: + """Get position in pixels. + + Returns: + Vector2 position in pixels. + """ + if not self.physics or not self.body: + return v2(0.0, 0.0) + pos = self.physics.convert_to_pixels(self.body.position) + return v2(pos.x, pos.y) + + def set_position(self, pos) -> None: + """Set position (meters if b2Vec2, else pixels). + + Args: + pos: b2Vec2 in meters or Vector2 in pixels. + + Returns: + None + """ + if not self.body: + return + if isinstance(pos, b2Vec2): + self.body.position = pos + else: + if not self.physics: + return + self.body.position = self.physics.convert_to_meters(pos) + + def set_rotation(self, degrees: float) -> None: + """Set rotation in degrees. + + Args: + degrees: Rotation in degrees. + + Returns: + None + """ + if self.body: + self.body.angle = math.radians(degrees) + + def get_velocity_meters(self) -> b2Vec2: + """Get linear velocity in meters/sec. + + Returns: + b2Vec2 velocity in meters/sec. + """ + return self.body.linearVelocity if self.body else b2Vec2(0.0, 0.0) + + def get_velocity_pixels(self) -> rl.Vector2: + """Get linear velocity in pixels/sec. + + Returns: + Vector2 velocity in pixels/sec. + """ + if not self.physics or not self.body: + return v2(0.0, 0.0) + vel = self.physics.convert_to_pixels(self.body.linearVelocity) + return v2(vel.x, vel.y) + + def set_velocity(self, vel) -> None: + """Set linear velocity (meters if b2Vec2, else pixels). + + Args: + vel: b2Vec2 in meters/sec or Vector2 in pixels/sec. + + Returns: + None + """ + if not self.body: + return + if isinstance(vel, b2Vec2): + self.body.linearVelocity = vel + else: + if not self.physics: + return + self.body.linearVelocity = self.physics.convert_to_meters(vel) + + def get_rotation(self) -> float: + """Get rotation in degrees. + + Returns: + Rotation in degrees. + """ + return math.degrees(self.body.angle) if self.body else 0.0 + + def get_contacts(self) -> List[b2Body]: + """Get bodies currently touching this body. + + Returns: + List of bodies in contact. + """ + if not self.body: + return [] + contacts: List[b2Body] = [] + for edge in self.body.contacts: + contact = edge.contact + if contact.touching: + other = edge.other + if other not in contacts: + contacts.append(other) + return contacts + + def get_sensor_overlaps(self) -> List[b2Body]: + """Get bodies overlapping sensor fixtures on this body. + + Returns: + List of bodies overlapping sensor fixtures. + """ + if not self.body: + return [] + contacts: List[b2Body] = [] + for edge in self.body.contacts: + contact = edge.contact + if not contact.touching: + continue + fixture_a = contact.fixtureA + fixture_b = contact.fixtureB + if fixture_a.body == self.body and fixture_a.sensor: + if fixture_b.body not in contacts: + contacts.append(fixture_b.body) + elif fixture_b.body == self.body and fixture_b.sensor: + if fixture_a.body not in contacts: + contacts.append(fixture_a.body) + return contacts + + +class SpriteComponent(Component): + """Component for rendering a sprite. Depends on TextureService.""" + def __init__(self, filename: str, body: Optional[BodyComponent] = None) -> None: + """ init . + + Args: + filename: Parameter. + body: Parameter. + + Returns: + None + """ + super().__init__() + self.filename = filename + self.body = body + self.sprite: Optional[rl.Texture2D] = None + self.position = v2(0.0, 0.0) + self.rotation = 0.0 + self.scale = 1.0 + self.tint = rl.WHITE + self.is_active = True + + def init(self) -> None: + """Load the sprite texture via TextureService. + + Returns: + None + """ + if self.owner and self.owner.scene: + texture_service = self.owner.scene.get_service(TextureService) + self.sprite = texture_service.get_texture(self.filename) + + def draw(self) -> None: + """Draw the sprite if active. + + Returns: + None + """ + if not self.is_active or not self.sprite: + return + if self.body: + self.position = self.body.get_position_pixels() + self.rotation = self.body.get_rotation() + source = rl.Rectangle(0.0, 0.0, float(self.sprite.width), float(self.sprite.height)) + dest = rl.Rectangle(self.position.x, self.position.y, + float(self.sprite.width) * self.scale, + float(self.sprite.height) * self.scale) + origin = v2(float(self.sprite.width) / 2.0 * self.scale, + float(self.sprite.height) / 2.0 * self.scale) + rl.draw_texture_pro(self.sprite, source, dest, origin, self.rotation, self.tint) + + def set_position(self, position: rl.Vector2) -> None: + """Set the sprite position in pixels. + + Args: + position: Vector2 position. + + Returns: + None + """ + self.position = position + + def set_rotation(self, rotation: float) -> None: + """Set the sprite rotation in degrees. + + Args: + rotation: Rotation in degrees. + + Returns: + None + """ + self.rotation = rotation + + def set_scale(self, scale: float) -> None: + """Set the sprite scale. + + Args: + scale: Scale multiplier. + + Returns: + None + """ + self.scale = scale + + def set_tint(self, tint: rl.Color) -> None: + """Set the sprite tint color. + + Args: + tint: Raylib color. + + Returns: + None + """ + self.tint = tint + + def set_active(self, active: bool) -> None: + """Enable or disable sprite rendering. + + Args: + active: True to render, False to hide. + + Returns: + None + """ + self.is_active = active + + +class Animation: + """Frame-based animation helper.""" + def __init__(self, frames: List[rl.Texture2D], fps: float = 15.0, loop: bool = True) -> None: + """ init . + + Args: + frames: Parameter. + fps: Parameter. + loop: Parameter. + + Returns: + None + """ + self.frames = frames + self.fps = fps + self.frame_timer = 1.0 / fps if fps > 0 else 0.0 + self.loop = loop + self.current_frame = 0 + self.playing = True + self.is_active = True + + @classmethod + def from_files(cls, texture_service: TextureService, filenames: List[str], fps: float = 15.0, loop: bool = True): + """From files. + + Args: + texture_service: Parameter. + filenames: Parameter. + fps: Parameter. + loop: Parameter. + + Returns: + Result of the operation. + """ + frames = [texture_service.get_texture(name) for name in filenames] + return cls(frames, fps, loop) + + def update(self, delta_time: float) -> None: + """Advance the animation by delta time. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + if not self.frames or not self.playing or not self.is_active or self.fps <= 0: + return + self.frame_timer -= delta_time + if self.frame_timer <= 0.0: + self.frame_timer = 1.0 / self.fps + self.current_frame += 1 + if self.current_frame > len(self.frames) - 1: + self.current_frame = 0 if self.loop else len(self.frames) - 1 + + def draw(self, position: rl.Vector2, rotation: float = 0.0, tint: rl.Color = rl.WHITE) -> None: + """Draw the animation at a position. + + Args: + position: Position in pixels. + rotation: Rotation in degrees. + tint: Color tint. + + Returns: + None + """ + if not self.is_active or not self.frames: + return + sprite = self.frames[self.current_frame] + rl.draw_texture_pro(sprite, + rl.Rectangle(0.0, 0.0, float(sprite.width), float(sprite.height)), + rl.Rectangle(position.x, position.y, float(sprite.width), float(sprite.height)), + v2(float(sprite.width) / 2.0, float(sprite.height) / 2.0), + rotation, + tint) + + def draw_with_origin(self, position: rl.Vector2, origin: rl.Vector2, rotation: float = 0.0, + scale: float = 1.0, flip_x: bool = False, flip_y: bool = False, + tint: rl.Color = rl.WHITE) -> None: + """Draw the animation with origin, scale, and flip options. + + Args: + position: Position in pixels. + origin: Origin for rotation/scaling. + rotation: Rotation in degrees. + scale: Scale multiplier. + flip_x: True to flip horizontally. + flip_y: True to flip vertically. + tint: Color tint. + + Returns: + None + """ + if not self.is_active or not self.frames: + return + sprite = self.frames[self.current_frame] + src = rl.Rectangle(0.0, 0.0, + float(sprite.width) * (-1.0 if flip_x else 1.0), + float(sprite.height) * (-1.0 if flip_y else 1.0)) + dest = rl.Rectangle(position.x, position.y, + float(sprite.width) * scale, + float(sprite.height) * scale) + rl.draw_texture_pro(sprite, src, dest, vec_mul(origin, scale), rotation, tint) + + def play(self) -> None: + """Start or resume playback. + + Returns: + None + """ + self.playing = True + + def pause(self) -> None: + """Pause playback. + + Returns: + None + """ + self.playing = False + + def stop(self) -> None: + """Stop playback and reset to the first frame. + + Returns: + None + """ + self.playing = False + self.frame_timer = 1.0 / self.fps if self.fps > 0 else 0.0 + self.current_frame = 0 + + +class AnimationController(Component): + """Component for controlling animations. Depends on TextureService.""" + def __init__(self, body: Optional[BodyComponent] = None) -> None: + """ init . + + Args: + body: Parameter. + + Returns: + None + """ + super().__init__() + self.animations: Dict[str, Animation] = {} + self.current_animation: Optional[Animation] = None + self.position = v2(0.0, 0.0) + self.rotation = 0.0 + self.origin = v2(0.0, 0.0) + self.scale = 1.0 + self.flip_x = False + self.flip_y = False + self.body = body + + def update(self, delta_time: float) -> None: + """Update the current animation. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + if self.current_animation: + self.current_animation.update(delta_time) + + def draw(self) -> None: + """Draw the current animation. + + Returns: + None + """ + if self.body: + self.position = self.body.get_position_pixels() + self.rotation = self.body.get_rotation() + if self.current_animation: + self.current_animation.draw_with_origin(self.position, self.origin, self.rotation, self.scale, + self.flip_x, self.flip_y) + + def add_animation(self, name: str, animation: Animation) -> None: + """Add an Animation to the controller. + + Args: + name: Animation name. + animation: Animation instance. + + Returns: + None + """ + self.animations[name] = animation + if not self.current_animation: + self.current_animation = animation + sprite = animation.frames[animation.current_frame] + self.origin = v2(float(sprite.width) / 2.0, float(sprite.height) / 2.0) + + def add_animation_from_files(self, name: str, filenames: List[str], fps: float = 15.0, loop: bool = True) -> Animation: + """Create an Animation from files and add it. + + Args: + name: Animation name. + filenames: List of frame image paths. + fps: Frames per second. + loop: True to loop. + + Returns: + The created Animation. + """ + texture_service = self.owner.scene.get_service(TextureService) if self.owner and self.owner.scene else None + if not texture_service: + raise RuntimeError("TextureService not available") + animation = Animation.from_files(texture_service, filenames, fps, loop) + self.add_animation(name, animation) + return animation + + def get_animation(self, name: str) -> Optional[Animation]: + """Get an animation by name. + + Args: + name: Animation name. + + Returns: + The Animation or None. + """ + return self.animations.get(name) + + def play(self, name: Optional[str] = None) -> None: + """Play the current animation or switch by name then play. + + Args: + name: Optional animation name to switch to. + + Returns: + None + """ + if name: + animation = self.animations.get(name) + if animation: + self.current_animation = animation + if self.current_animation: + self.current_animation.play() + + def pause(self) -> None: + """Pause the current animation. + + Returns: + None + """ + if self.current_animation: + self.current_animation.pause() + + def set_play(self, play: bool) -> None: + """Set play/pause state for the current animation. + + Args: + play: True to play, False to pause. + + Returns: + None + """ + if self.current_animation: + self.current_animation.play() if play else self.current_animation.pause() + + def stop(self) -> None: + """Stop the current animation. + + Returns: + None + """ + if self.current_animation: + self.current_animation.stop() + + def set_position(self, position: rl.Vector2) -> None: + """Set animation draw position. + + Args: + position: Vector2 in pixels. + + Returns: + None + """ + self.position = position + + def set_rotation(self, rotation: float) -> None: + """Set animation rotation in degrees. + + Args: + rotation: Rotation in degrees. + + Returns: + None + """ + self.rotation = rotation + + def set_origin(self, origin: rl.Vector2) -> None: + """Set animation origin point. + + Args: + origin: Vector2 origin. + + Returns: + None + """ + self.origin = origin + + def set_scale(self, scale: float) -> None: + """Set animation scale. + + Args: + scale: Scale multiplier. + + Returns: + None + """ + self.scale = scale + + def set_flip_x(self, flip: bool) -> None: + """Set horizontal flip. + + Args: + flip: True to flip horizontally. + + Returns: + None + """ + self.flip_x = flip + + def set_flip_y(self, flip: bool) -> None: + """Set vertical flip. + + Args: + flip: True to flip vertically. + + Returns: + None + """ + self.flip_y = flip + + +class PlatformerMovementParams: + """Parameter bag for platformer movement.""" + def __init__(self) -> None: + """ init . + + Returns: + None + """ + self.width = 24.0 + self.height = 40.0 + self.max_speed = 220.0 + self.accel = 2000.0 + self.decel = 2500.0 + self.gravity = 1400.0 + self.jump_speed = 520.0 + self.fall_speed = 1200.0 + self.jump_cutoff_multiplier = 0.45 + self.coyote_time = 0.08 + self.jump_buffer = 0.10 + + +class PlatformerMovementComponent(Component): + """Component for 2D platformer movement.""" + def __init__(self, params: PlatformerMovementParams) -> None: + """ init . + + Args: + params: Parameter. + + Returns: + None + """ + super().__init__() + self.p = params + self.physics: Optional[PhysicsService] = None + self.body: Optional[BodyComponent] = None + self.grounded = False + self.on_wall_left = False + self.on_wall_right = False + self.coyote_timer = 0.0 + self.jump_buffer_timer = 0.0 + self.move_x = 0.0 + self.jump_pressed = False + self.jump_held = False + + def init(self) -> None: + """Resolve PhysicsService and BodyComponent. + + Returns: + None + """ + if not self.owner or not self.owner.scene: + return + self.physics = self.owner.scene.get_service(PhysicsService) + self.body = self.owner.get_component(BodyComponent) + + def update(self, delta_time: float) -> None: + """Update movement and apply velocity to the body. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + if not self.physics or not self.body or not self.body.body: + return + self.coyote_timer = max(0.0, self.coyote_timer - delta_time) + self.jump_buffer_timer = max(0.0, self.jump_buffer_timer - delta_time) + if self.jump_pressed: + self.jump_buffer_timer = self.p.jump_buffer + + self.grounded = False + self.on_wall_left = False + self.on_wall_right = False + + ray_length = self.physics.convert_length_to_meters(4.0) + half_width = self.physics.convert_length_to_meters(self.p.width) / 2.0 + half_height = self.physics.convert_length_to_meters(self.p.height) / 2.0 + + pos = self.body.get_position_meters() + ground_left_start = b2Vec2(pos.x - half_width, pos.y + half_height) + ground_right_start = b2Vec2(pos.x + half_width, pos.y + half_height) + ground_translation = b2Vec2(0.0, ray_length) + + left_ground_hit = raycast_closest(self.physics.world, self.body.body, ground_left_start, ground_translation) + right_ground_hit = raycast_closest(self.physics.world, self.body.body, ground_right_start, ground_translation) + self.grounded = left_ground_hit.hit or right_ground_hit.hit + + mid = b2Vec2(pos.x, pos.y) + wall_left_start = b2Vec2(pos.x - half_width, mid.y) + wall_left_translation = b2Vec2(-ray_length, 0.0) + wall_right_start = b2Vec2(pos.x + half_width, mid.y) + wall_right_translation = b2Vec2(ray_length, 0.0) + + left_wall_hit = raycast_closest(self.physics.world, self.body.body, wall_left_start, wall_left_translation) + right_wall_hit = raycast_closest(self.physics.world, self.body.body, wall_right_start, wall_right_translation) + self.on_wall_left = left_wall_hit.hit + self.on_wall_right = right_wall_hit.hit + + if self.grounded: + self.coyote_timer = self.p.coyote_time + + target_vx = self.move_x * self.p.max_speed + v = self.body.get_velocity_pixels() + + if abs(target_vx) > 0.001: + v.x = self.move_towards(v.x, target_vx, self.p.accel * delta_time) + else: + v.x = self.move_towards(v.x, 0.0, self.p.decel * delta_time) + + v.y += self.p.gravity * delta_time + v.y = max(-self.p.fall_speed, min(self.p.fall_speed, v.y)) + + can_jump = self.grounded or self.coyote_timer > 0.0 + if self.jump_buffer_timer > 0.0 and can_jump: + v.y = -self.p.jump_speed + self.jump_buffer_timer = 0.0 + self.coyote_timer = 0.0 + self.grounded = False + + if not self.jump_held and v.y < 0.0: + v.y *= self.p.jump_cutoff_multiplier + + self.body.set_velocity(v) + + @staticmethod + def move_towards(current: float, target: float, max_delta: float) -> float: + """Move a value toward a target by at most max_delta. + + Args: + current: Current value. + target: Target value. + max_delta: Maximum change allowed. + + Returns: + The updated value. + """ + delta = target - current + if abs(delta) <= max_delta: + return target + return current + (max_delta if delta > 0 else -max_delta) + + def set_input(self, horizontal_speed: float, jump_pressed: bool, jump_held: bool) -> None: + """Set movement input for this frame. + + Args: + horizontal_speed: Horizontal input (-1 to 1). + jump_pressed: True if jump pressed this frame. + jump_held: True if jump is held. + + Returns: + None + """ + self.move_x = horizontal_speed + self.jump_pressed = jump_pressed + self.jump_held = jump_held + + +class TopDownMovementParams: + """Parameter bag for top-down movement.""" + def __init__(self) -> None: + """ init . + + Returns: + None + """ + self.max_speed = 300.0 + self.accel = 1200.0 + self.friction = 1200.0 + self.deadzone = 0.1 + + +class TopDownMovementComponent(Component): + """Component for 2D top-down movement.""" + def __init__(self, params: TopDownMovementParams) -> None: + """ init . + + Args: + params: Parameter. + + Returns: + None + """ + super().__init__() + self.p = params + self.physics: Optional[PhysicsService] = None + self.body: Optional[BodyComponent] = None + self.move_x = 0.0 + self.move_y = 0.0 + self.facing_dir = 0.0 + + def init(self) -> None: + """Resolve PhysicsService and BodyComponent. + + Returns: + None + """ + if not self.owner or not self.owner.scene: + return + self.physics = self.owner.scene.get_service(PhysicsService) + self.body = self.owner.get_component(BodyComponent) + + def update(self, delta_time: float) -> None: + """Update movement and apply velocity to the body. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + if not self.body or not self.body.body: + return + v = self.body.get_velocity_pixels() + input_vec = v2(self.move_x, self.move_y) + input_len_sq = input_vec.x * input_vec.x + input_vec.y * input_vec.y + desired = v2(0.0, 0.0) + + if input_len_sq > self.p.deadzone * self.p.deadzone: + desired = v2(input_vec.x * self.p.max_speed, input_vec.y * self.p.max_speed) + self.facing_dir = math.degrees(math.atan2(input_vec.y, input_vec.x)) + v = self.move_towards_vec(v, desired, self.p.accel * delta_time) + else: + v = self.apply_friction(v, self.p.friction * delta_time) + + speed_sq = v.x * v.x + v.y * v.y + max_speed_sq = self.p.max_speed * self.p.max_speed + if speed_sq > max_speed_sq: + speed = math.sqrt(speed_sq) + scale = self.p.max_speed / speed + v.x *= scale + v.y *= scale + + self.body.set_velocity(v) + + @staticmethod + def move_towards_vec(current: rl.Vector2, target: rl.Vector2, max_delta: float) -> rl.Vector2: + """Move a vector toward a target by at most max_delta. + + Args: + current: Current vector. + target: Target vector. + max_delta: Maximum change length. + + Returns: + The updated vector. + """ + delta = v2(target.x - current.x, target.y - current.y) + length = math.sqrt(delta.x * delta.x + delta.y * delta.y) + if length <= max_delta or length < 1e-5: + return target + scale = max_delta / length + return v2(current.x + delta.x * scale, current.y + delta.y * scale) + + @staticmethod + def apply_friction(v: rl.Vector2, friction_delta: float) -> rl.Vector2: + """Apply friction to reduce vector magnitude. + + Args: + v: Current velocity vector. + friction_delta: Speed to subtract this frame. + + Returns: + The updated velocity vector. + """ + speed = math.sqrt(v.x * v.x + v.y * v.y) + if speed < 1e-5: + return v2(0.0, 0.0) + new_speed = speed - friction_delta + if new_speed <= 0.0: + return v2(0.0, 0.0) + scale = new_speed / speed + return v2(v.x * scale, v.y * scale) + + def set_input(self, horizontal: float, vertical: float) -> None: + """Set movement input for this frame. + + Args: + horizontal: Horizontal input (-1 to 1). + vertical: Vertical input (-1 to 1). + + Returns: + None + """ + self.move_x = horizontal + self.move_y = vertical diff --git a/py/engine/prefabs/game_objects.h b/py/engine/prefabs/game_objects.h new file mode 100644 index 0000000..776ce16 --- /dev/null +++ b/py/engine/prefabs/game_objects.h @@ -0,0 +1,619 @@ +#pragma once + +#include "engine/framework.h" +#include "engine/prefabs/components.h" +#include "engine/prefabs/services.h" + +/** + * A simple static box. + */ +class StaticBox : public GameObject +{ +public: + b2BodyId body = b2_nullBodyId; + float x, y, width, height; + bool is_visible = true; + + /** + * Constructor for StaticBox. + * + * @param x The center x position in pixels. + * @param y The center y position in pixels. + * @param width The width of the box in pixels. + * @param height The height of the box in pixels. + */ + StaticBox(float x, float y, float width, float height) : x(x), y(y), width(width), height(height) {} + + /** + * Constructor for StaticBox that takes Vector2s. + * + * @param position The center of the box in pixels. + * @param size The size of the box in pixels. + */ + StaticBox(Vector2 position, Vector2 size) : x(position.x), y(position.y), width(size.x), height(size.y) {} + + /** + * Initialize the StaticBox. + */ + void init() override + { + auto physics = scene->get_service(); + const float pixels_to_meters = physics->pixels_to_meters; + auto world = physics->world; + + b2BodyDef body_def = b2DefaultBodyDef(); + body_def.type = b2_staticBody; + body_def.position = b2Vec2{x * pixels_to_meters, y * pixels_to_meters}; + body = b2CreateBody(world, &body_def); + + b2Polygon body_polygon = b2MakeBox(width / 2.0f * pixels_to_meters, height / 2.0f * pixels_to_meters); + b2ShapeDef box_shape_def = b2DefaultShapeDef(); + b2CreatePolygonShape(body, &box_shape_def, &body_polygon); + + add_component(body); + } + + /** + * Draw the StaticBox as a blue rectangle. + */ + void draw() override + { + if (is_visible) + { + DrawRectangle((int)(x - width / 2.0f), (int)(y - height / 2.0f), (int)width, (int)height, BLUE); + } + } +}; + +/** + * A simple dynamic rigid body box. + */ +class DynamicBox : public GameObject +{ +public: + b2BodyId body = b2_nullBodyId; + float x, y, width, height, rot_deg; + PhysicsService* physics; + + /** + * Constructor for DynamicBox. + * + * @param x The center x position in pixels. + * @param y The center y position in pixels. + * @param width The width of the box in pixels. + * @param height The height of the box in pixels. + * @param rotation The angle of the box in degrees. + */ + DynamicBox(float x, float y, float width, float height, float rotation = 0) : + x(x), + y(y), + width(width), + height(height), + rot_deg(rotation) + { + } + + /** + * Constructor for DynamicBox that takes Vector2s. + * + * @param position The center of the box in pixels. + * @param size The size of the box in pixels. + * @param rotation The angle of the box in degrees. + */ + DynamicBox(Vector2 position, Vector2 size, float rotation = 0) : + x(position.x), + y(position.y), + width(size.x), + height(size.y), + rot_deg(rotation) + { + } + + /** + * Initialize the DynamicBody. + */ + void init() override + { + physics = scene->get_service(); + const float pixels_to_meters = physics->pixels_to_meters; + auto world = physics->world; + + b2BodyDef body_def = b2DefaultBodyDef(); + body_def.type = b2_dynamicBody; + body_def.position = b2Vec2{x * pixels_to_meters, y * pixels_to_meters}; + body_def.rotation = b2MakeRot(rot_deg * DEG2RAD); + body = b2CreateBody(world, &body_def); + + b2Polygon body_polygon = b2MakeBox(width / 2.0f * pixels_to_meters, height / 2.0f * pixels_to_meters); + b2ShapeDef box_shape_def = b2DefaultShapeDef(); + b2SurfaceMaterial body_material = b2DefaultSurfaceMaterial(); + body_material.friction = 0.3f; + box_shape_def.density = 1.0f; + box_shape_def.material = body_material; + b2CreatePolygonShape(body, &box_shape_def, &body_polygon); + + auto body_component = add_component(body); + add_component("assets/character_green_idle.png", body_component); + } + + /** + * Draw the DynamicBody as a red rectangle. + */ + void draw() override + { + float meters_to_pixels = physics->meters_to_pixels; + b2Vec2 pos = b2Body_GetPosition(body); + b2Rot rot = b2Body_GetRotation(body); + float angle = b2Rot_GetAngle(rot) * RAD2DEG; + + DrawRectanglePro({physics->convert_to_pixels(pos.x), physics->convert_to_pixels(pos.y), width, height}, + {width / 2.0f, height / 2.0f}, + angle, + RED); + } +}; + +/** + * A 2D camera that controls the view of the scene. + */ +class CameraObject : public GameObject +{ +public: + Camera2D camera; + + // The target position to follow, in pixels. + Vector2 target = {0, 0}; + + // The size of the screen. + Vector2 size = {0, 0}; + + // The size of the level in pixels. The camera will clamp to this size. + Vector2 level_size = {0, 0}; + + // Tracking speed in pixels per second. + Vector2 follow_speed = {1000, 1000}; + + // Deadzone bounds in pixels relative to the center. + float offset_left = 150.0f; + float offset_right = 150.0f; + float offset_top = 100.0f; + float offset_bottom = 100.0f; + + /** + * Constructor for CameraObject. + * + * @param size The size of the camera view. + * @param level_size The size of the level. + * @param follow_speed The speed at which the camera follows the target. + * @param offset_left The left deadzone offset in pixels. + * @param offset_right The right deadzone offset in pixels. + * @param offset_top The top deadzone offset in pixels. + * @param offset_bottom The bottom deadzone offset in pixels. + */ + CameraObject(Vector2 size, + Vector2 level_size = {0, 0}, + Vector2 follow_speed = {1000, 1000}, + float offset_left = 70, + float offset_right = 70, + float offset_top = 40, + float offset_bottom = 40) : + size(size), + level_size(level_size), + follow_speed(follow_speed), + offset_left(offset_left), + offset_right(offset_right), + offset_top(offset_top), + offset_bottom(offset_bottom) + { + } + + /** + * Initialize the camera. + */ + void init() override + { + camera.zoom = 1.0f; + camera.offset = {size.x / 2.0f, size.y / 2.0f}; + camera.rotation = 0.0f; + + camera.target = target; + } + + /** + * Update the camera position based on the target and deadzone. + * + * @param delta_time The delta time since the last frame. + */ + void update(float delta_time) override + { + // Desired camera.target after applying deadzone. + Vector2 desired = camera.target; + + // Convert deadzone from SCREEN pixels to WORLD pixels (depends on zoom). + // Because camera.target is in world units. + float inv_zoom = (camera.zoom != 0.0f) ? (1.0f / camera.zoom) : 1.0f; + + float dz_left_w = offset_left * inv_zoom; + float dz_right_w = offset_right * inv_zoom; + float dz_top_w = offset_top * inv_zoom; + float dz_bottom_w = offset_bottom * inv_zoom; + + // Compute target displacement from current camera center (world-space). + float dx = target.x - camera.target.x; + float dy = target.y - camera.target.y; + + // If target is outside deadzone, shift desired camera center just enough to bring it back. + if (dx < -dz_left_w) + { + desired.x = target.x + dz_left_w; + } + else if (dx > dz_right_w) + { + desired.x = target.x - dz_right_w; + } + + if (dy < -dz_top_w) + { + desired.y = target.y + dz_top_w; + } + else if (dy > dz_bottom_w) + { + desired.y = target.y - dz_bottom_w; + } + + // Apply tracking speed per axis. + if (follow_speed.x < 0) + { + camera.target.x = desired.x; + } + else + { + camera.target.x = move_towards(camera.target.x, desired.x, follow_speed.x * delta_time); + } + + if (follow_speed.y < 0) + { + camera.target.y = desired.y; + } + else + { + camera.target.y = move_towards(camera.target.y, desired.y, follow_speed.y * delta_time); + } + + Vector2 half_view = {size.x / 2.0f * inv_zoom, size.y / 2.0f * inv_zoom}; + if (level_size.x > size.x) + { + camera.target.x = std::max(half_view.x, std::min(level_size.x - half_view.x, camera.target.x)); + } + if (level_size.y > size.y) + { + camera.target.y = std::max(half_view.y, std::min(level_size.y - half_view.y, camera.target.y)); + } + } + + /** + * Calculate a value moved towards a target by a maximum delta. + * + * @param current The current value. + * @param target The target value. + * @param max_delta The maximum change that can be applied. + * @return The new value after moving towards the target. + */ + float move_towards(float current, float target, float max_delta) + { + float d = target - current; + if (d > max_delta) + return current + max_delta; + if (d < -max_delta) + return current - max_delta; + return target; + } + + /** + * Set the target position for the camera to follow. + * + * @param target The target position in pixels. + */ + void set_target(Vector2 target) + { + this->target = target; + } + + /** + * Set the zoom level of the camera. + * + * @param zoom The zoom level. + */ + void set_zoom(float zoom) + { + camera.zoom = zoom; + } + + /** + * Set the rotation angle of the camera. + * + * @param angle The rotation angle in degrees. + */ + void set_rotation(float angle) + { + camera.rotation = angle; + } + + /** + * Begin drawing with the camera. + * The rest of the Scene should be drawn between draw_begin() and draw_end(). + */ + void draw_begin() + { + BeginMode2D(camera); + } + + /** + * End drawing with the camera. + */ + void draw_end() + { + EndMode2D(); + } + + /** + * Draw the camera's deadzone for debugging. + * + * @param c The color to draw the deadzone rectangle. + */ + void draw_debug(Color c = {0, 255, 0, 120}) const + { + float inv_zoom = (camera.zoom != 0.0f) ? (1.0f / camera.zoom) : 1.0f; + float dz_left_w = offset_left * inv_zoom; + float dz_right_w = offset_right * inv_zoom; + float dz_top_w = offset_top * inv_zoom; + float dz_bottom_w = offset_bottom * inv_zoom; + + Rectangle r; + r.x = camera.target.x - dz_left_w; + r.y = camera.target.y - dz_top_w; + r.width = dz_left_w + dz_right_w; + r.height = dz_top_w + dz_bottom_w; + + DrawRectangleLinesEx(r, 2.0f * inv_zoom, c); + } + + /** + * Convert screen coordinates to world coordinates. + * + * @param point The screen coordinates. + * @return The corresponding world coordinates. + */ + Vector2 screen_to_world(Vector2 point) + { + return GetScreenToWorld2D(point, camera); + } +}; + +/** + * A split-screen camera that renders to a texture. + */ +class SplitCamera : public CameraObject +{ +public: + RenderTexture2D renderer; + + /** + * Constructor for SplitCamera. + * + * @param size The size of the camera view. + * @param level_size The size of the level. + * @param follow_speed The speed at which the camera follows the target. + * @param offset_left The left deadzone offset in pixels. + * @param offset_right The right deadzone offset in pixels. + * @param offset_top The top deadzone offset in pixels. + * @param offset_bottom The bottom deadzone offset in pixels. + */ + SplitCamera(Vector2 size, + Vector2 level_size = {0, 0}, + Vector2 follow_speed = {1000, 1000}, + float offset_left = 70, + float offset_right = 70, + float offset_top = 40, + float offset_bottom = 40) : + CameraObject(size, level_size, follow_speed, offset_left, offset_right, offset_top, offset_bottom) + { + } + + ~SplitCamera() + { + UnloadRenderTexture(renderer); + } + + /** + * Initialize the SplitCamera. + */ + void init() override + { + renderer = LoadRenderTexture((int)size.x, (int)size.y); + CameraObject::init(); + } + + /** + * Begin drawing to the camera's texture. + * The rest of the Scene should be drawn between draw_begin() and draw_end(). + */ + void draw_begin() + { + BeginTextureMode(renderer); + ClearBackground(WHITE); + BeginMode2D(camera); + } + + /** + * End drawing to the camera's texture. + */ + void draw_end() + { + EndMode2D(); + EndTextureMode(); + } + + /** + * Draw the camera's texture at the specified position. + * + * @param x The x position to draw the texture. + * @param y The y position to draw the texture. + */ + void draw_texture(float x, float y) + { + DrawTextureRec(renderer.texture, + {0, 0, static_cast(renderer.texture.width), static_cast(-renderer.texture.height)}, + {x, y}, + WHITE); + } + + void draw_texture_pro(float x, float y, float width, float height) + { + DrawTexturePro(renderer.texture, + {0, 0, static_cast(renderer.texture.width), static_cast(-renderer.texture.height)}, + {x, y, width, height}, + {0, 0}, + 0.0f, + WHITE); + } + + /** + * Convert screen coordinates to world coordinates relative to a draw position. + * + * @param draw_position The position where the texture is drawn. + * @param point The screen coordinates. + * @return The corresponding world coordinates. + */ + Vector2 screen_to_world(Vector2 draw_position, Vector2 point) + { + auto local_point = point - draw_position; + return GetScreenToWorld2D(local_point, camera); + } +}; + +/** + * Parameters for the PlatformerCharacter game object. + */ +struct CharacterParams +{ + // Geometry in pixels + float width = 24.0f; + float height = 40.0f; + + // Initial position in pixels + Vector2 position; + + // Surface behavior + float friction = 0.0f; + float restitution = 0.0f; + float density = 1.0f; +}; + +/** + * A simple platformer character with movement and animation. + */ +class PlatformerCharacter : public GameObject +{ +public: + CharacterParams p; + PhysicsService* physics; + BodyComponent* body; + PlatformerMovementComponent* movement; + + bool grounded = false; + bool on_wall_left = false; + bool on_wall_right = false; + float coyote_timer = 0.0f; + float jump_buffer_timer = 0.0f; + int gamepad = 0; + + /** + * Constructor for PlatformerCharacter. + * + * @param p The parameters for the character. + */ + PlatformerCharacter(CharacterParams p, int gamepad = 0) : p(p), gamepad(gamepad) {} + + /** + * Initialize the PlatformerCharacter. + */ + void init() override + { + physics = scene->get_service(); + + body = add_component( + [=](BodyComponent& b) + { + b2BodyDef body_def = b2DefaultBodyDef(); + body_def.type = b2_dynamicBody; + body_def.fixedRotation = true; + // body_def.isBullet = true; + body_def.linearDamping = 0.0f; + body_def.angularDamping = 0.0f; + body_def.position = physics->convert_to_meters(p.position); + body_def.userData = this; + b.id = b2CreateBody(physics->world, &body_def); + + b2SurfaceMaterial body_material = b2DefaultSurfaceMaterial(); + body_material.friction = p.friction; + body_material.restitution = p.restitution; + + b2ShapeDef box_shape_def = b2DefaultShapeDef(); + box_shape_def.density = p.density; + box_shape_def.material = body_material; + + // Needed to presolve one-way behavior. + box_shape_def.enablePreSolveEvents = true; + + b2Polygon body_polygon = b2MakeRoundedBox(physics->convert_to_meters(p.width / 2.0f), + physics->convert_to_meters(p.height / 2.0f), + physics->convert_to_meters(0.25)); + b2CreatePolygonShape(b.id, &box_shape_def, &body_polygon); + }); + + PlatformerMovementParams mp; + mp.width = p.width; + mp.height = p.height; + movement = add_component(mp); + } + + /** + * Update the PlatformerCharacter. + */ + void update(float delta_time) override + { + float deadzone = 0.1f; + + const bool jump_pressed = + IsKeyPressed(KEY_W) || IsGamepadButtonPressed(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_DOWN); + const bool jump_held = IsKeyDown(KEY_W) || IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_DOWN); + + float move_x = 0.0f; + move_x = GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_LEFT_X); + if (fabsf(move_x) < deadzone) + { + move_x = 0.0f; + } + if (IsKeyDown(KEY_D) || IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)) + { + move_x = 1.0f; + } + else if (IsKeyDown(KEY_A) || IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_LEFT)) + { + move_x = -1.0f; + } + + movement->set_input(move_x, jump_pressed, jump_held); + } + + /** + * Draw the PlatformerCharacter as a rectangle. + */ + void draw() override + { + Color color = movement->grounded ? GREEN : BLUE; + auto pos = body->get_position_pixels(); + DrawRectanglePro({pos.x, pos.y, p.width, p.height}, {p.width / 2.0f, p.height / 2.0f}, 0.0f, color); + } +}; diff --git a/py/engine/prefabs/game_objects.py b/py/engine/prefabs/game_objects.py new file mode 100644 index 0000000..2c96b4f --- /dev/null +++ b/py/engine/prefabs/game_objects.py @@ -0,0 +1,518 @@ +from __future__ import annotations + +import math +from dataclasses import dataclass +from typing import Optional + +from Box2D import b2PolygonShape, b2Vec2 +import pyray as rl + +from engine.framework import GameObject +from engine.math_extensions import v2, vec_sub +from engine.prefabs.components import BodyComponent, PlatformerMovementComponent, PlatformerMovementParams, SpriteComponent +from engine.prefabs.services import PhysicsService + + +class StaticBox(GameObject): + """Simple static box collider with optional debug drawing.""" + def __init__(self, x: float, y: float, width: float, height: float) -> None: + """ init . + + Args: + x: Parameter. + y: Parameter. + width: Parameter. + height: Parameter. + + Returns: + None + """ + super().__init__() + self.x = x + self.y = y + self.width = width + self.height = height + self.body = None + self.is_visible = True + + @classmethod + def from_vectors(cls, position: rl.Vector2, size: rl.Vector2): + """From vectors. + + Args: + position: Parameter. + size: Parameter. + + Returns: + Result of the operation. + """ + return cls(position.x, position.y, size.x, size.y) + + def init(self) -> None: + """Initialize the object. + + Returns: + None + """ + physics = self.scene.get_service(PhysicsService) + world = physics.world + if not world: + return + self.body = world.CreateStaticBody(position=(self.x * physics.pixels_to_meters, self.y * physics.pixels_to_meters)) + shape = b2PolygonShape(box=(self.width / 2.0 * physics.pixels_to_meters, + self.height / 2.0 * physics.pixels_to_meters)) + self.body.CreateFixture(shape=shape) + self.add_component(BodyComponent(self.body)) + + def draw(self) -> None: + """Draw the object. + + Returns: + None + """ + if self.is_visible: + rl.draw_rectangle(int(self.x - self.width / 2.0), int(self.y - self.height / 2.0), int(self.width), int(self.height), rl.Color(0, 121, 241, 255)) + + +class DynamicBox(GameObject): + """Simple dynamic rigid body box.""" + def __init__(self, x: float, y: float, width: float, height: float, rotation: float = 0.0) -> None: + """ init . + + Args: + x: Parameter. + y: Parameter. + width: Parameter. + height: Parameter. + rotation: Parameter. + + Returns: + None + """ + super().__init__() + self.x = x + self.y = y + self.width = width + self.height = height + self.rot_deg = rotation + self.physics: Optional[PhysicsService] = None + self.body = None + + @classmethod + def from_vectors(cls, position: rl.Vector2, size: rl.Vector2, rotation: float = 0.0): + """From vectors. + + Args: + position: Parameter. + size: Parameter. + rotation: Parameter. + + Returns: + Result of the operation. + """ + return cls(position.x, position.y, size.x, size.y, rotation) + + def init(self) -> None: + """Initialize the object. + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + world = self.physics.world + if not world: + return + self.body = world.CreateDynamicBody(position=(self.x * self.physics.pixels_to_meters, + self.y * self.physics.pixels_to_meters), + angle=math.radians(self.rot_deg)) + shape = b2PolygonShape(box=(self.width / 2.0 * self.physics.pixels_to_meters, + self.height / 2.0 * self.physics.pixels_to_meters)) + self.body.CreateFixture(shape=shape, density=1.0, friction=0.3) + body_component = self.add_component(BodyComponent(self.body)) + self.add_component(SpriteComponent("assets/character_green_idle.png", body_component)) + + def draw(self) -> None: + """Draw the object. + + Returns: + None + """ + if not self.physics or not self.body: + return + pos = self.body.position + angle = math.degrees(self.body.angle) + rl.draw_rectangle_pro(rl.Rectangle(self.physics.convert_length_to_pixels(pos.x), + self.physics.convert_length_to_pixels(pos.y), + self.width, self.height), + v2(self.width / 2.0, self.height / 2.0), + angle, + rl.Color(230, 41, 55, 255)) + + +class CameraObject(GameObject): + """2D camera that follows a target with deadzone and clamp.""" + def __init__(self, + size: rl.Vector2, + level_size: rl.Vector2 = v2(0.0, 0.0), + follow_speed: rl.Vector2 = v2(1000.0, 1000.0), + offset_left: float = 70.0, + offset_right: float = 70.0, + offset_top: float = 40.0, + offset_bottom: float = 40.0) -> None: + super().__init__() + + self.camera = rl.Camera2D() + self.target = v2(0.0, 0.0) + self.size = size + self.level_size = level_size + self.follow_speed = follow_speed + self.offset_left = offset_left + self.offset_right = offset_right + self.offset_top = offset_top + self.offset_bottom = offset_bottom + + def init(self) -> None: + """Initialize the object. + + Returns: + None + """ + self.camera.zoom = 1.0 + self.camera.offset = v2(self.size.x / 2.0, self.size.y / 2.0) + self.camera.rotation = 0.0 + self.camera.target = self.target + + def update(self, delta_time: float) -> None: + """Update the object. + + Args: + delta_time: Parameter. + + Returns: + None + """ + desired = self.camera.target + inv_zoom = 1.0 / self.camera.zoom if self.camera.zoom != 0.0 else 1.0 + dz_left_w = self.offset_left * inv_zoom + dz_right_w = self.offset_right * inv_zoom + dz_top_w = self.offset_top * inv_zoom + dz_bottom_w = self.offset_bottom * inv_zoom + + dx = self.target.x - self.camera.target.x + dy = self.target.y - self.camera.target.y + + if dx < -dz_left_w: + desired.x = self.target.x + dz_left_w + elif dx > dz_right_w: + desired.x = self.target.x - dz_right_w + + if dy < -dz_top_w: + desired.y = self.target.y + dz_top_w + elif dy > dz_bottom_w: + desired.y = self.target.y - dz_bottom_w + + if self.follow_speed.x < 0: + self.camera.target.x = desired.x + else: + self.camera.target.x = self.move_towards(self.camera.target.x, desired.x, self.follow_speed.x * delta_time) + + if self.follow_speed.y < 0: + self.camera.target.y = desired.y + else: + self.camera.target.y = self.move_towards(self.camera.target.y, desired.y, self.follow_speed.y * delta_time) + + half_view = v2(self.size.x / 2.0 * inv_zoom, self.size.y / 2.0 * inv_zoom) + if self.level_size.x > self.size.x: + self.camera.target.x = max(half_view.x, min(self.level_size.x - half_view.x, self.camera.target.x)) + if self.level_size.y > self.size.y: + self.camera.target.y = max(half_view.y, min(self.level_size.y - half_view.y, self.camera.target.y)) + + @staticmethod + def move_towards(current: float, target: float, max_delta: float) -> float: + """Move towards. + + Args: + current: Parameter. + target: Parameter. + max_delta: Parameter. + + Returns: + Result of the operation. + """ + delta = target - current + if delta > max_delta: + return current + max_delta + if delta < -max_delta: + return current - max_delta + return target + + def set_target(self, target: rl.Vector2) -> None: + """Set target. + + Args: + target: Parameter. + + Returns: + None + """ + self.target = target + + def set_zoom(self, zoom: float) -> None: + """Set zoom. + + Args: + zoom: Parameter. + + Returns: + None + """ + self.camera.zoom = zoom + + def set_rotation(self, angle: float) -> None: + """Set rotation. + + Args: + angle: Parameter. + + Returns: + None + """ + self.camera.rotation = angle + + def draw_begin(self) -> None: + """Draw begin. + + Returns: + None + """ + rl.begin_mode_2d(self.camera) + + def draw_end(self) -> None: + """Draw end. + + Returns: + None + """ + rl.end_mode_2d() + + def draw_debug(self, color: rl.Color = rl.Color(0, 255, 0, 120)) -> None: + """TODO""" + inv_zoom = 1.0 / self.camera.zoom if self.camera.zoom != 0.0 else 1.0 + dz_left_w = self.offset_left * inv_zoom + dz_right_w = self.offset_right * inv_zoom + dz_top_w = self.offset_top * inv_zoom + dz_bottom_w = self.offset_bottom * inv_zoom + rect = rl.Rectangle(self.camera.target.x - dz_left_w, + self.camera.target.y - dz_top_w, + dz_left_w + dz_right_w, + dz_top_w + dz_bottom_w) + rl.draw_rectangle_lines_ex(rect, 2.0 * inv_zoom, color) + + def screen_to_world(self, point: rl.Vector2) -> rl.Vector2: + """Convert screen coordinates to world coordinates. + + Args: + point: Parameter. + + Returns: + Result of the operation. + """ + return rl.get_screen_to_world_2d(point, self.camera) + + +class SplitCamera(CameraObject): + """Split-screen camera that renders to a texture.""" + def __init__(self, size: rl.Vector2, level_size: rl.Vector2 = v2(0.0, 0.0), + follow_speed: rl.Vector2 = v2(1000.0, 1000.0), + offset_left: float = 70.0, offset_right: float = 70.0, + offset_top: float = 40.0, offset_bottom: float = 40.0) -> None: + super().__init__(size, level_size, follow_speed, offset_left, offset_right, offset_top, offset_bottom) + self.renderer: Optional[rl.RenderTexture] = None + + def init(self) -> None: + """Initialize the object. + + Returns: + None + """ + self.renderer = rl.load_render_texture(int(self.size.x), int(self.size.y)) + super().init() + + def draw_begin(self) -> None: + """Draw begin. + + Returns: + None + """ + if not self.renderer: + return + rl.begin_texture_mode(self.renderer) + rl.clear_background(rl.WHITE) + rl.begin_mode_2d(self.camera) + + def draw_end(self) -> None: + """Draw end. + + Returns: + None + """ + rl.end_mode_2d() + rl.end_texture_mode() + + def draw_texture(self, x: float, y: float) -> None: + """Draw texture. + + Args: + x: Parameter. + y: Parameter. + + Returns: + None + """ + if not self.renderer: + return + rl.draw_texture_pro(self.renderer.texture, + rl.Rectangle(0.0, 0.0, float(self.renderer.texture.width), -float(self.renderer.texture.height)), + rl.Rectangle(x, y, float(self.renderer.texture.width), float(self.renderer.texture.height)), + v2(0.0, 0.0), + 0.0, + rl.WHITE) + + def draw_texture_pro(self, x: float, y: float, width: float, height: float) -> None: + """Draw texture pro. + + Args: + x: Parameter. + y: Parameter. + width: Parameter. + height: Parameter. + + Returns: + None + """ + if not self.renderer: + return + rl.draw_texture_pro(self.renderer.texture, + rl.Rectangle(0.0, 0.0, float(self.renderer.texture.width), -float(self.renderer.texture.height)), + rl.Rectangle(x, y, width, height), + v2(0.0, 0.0), + 0.0, + rl.WHITE) + + def screen_to_world_with_offset(self, draw_position: rl.Vector2, point: rl.Vector2) -> rl.Vector2: + """Convert screen coordinates to world coordinates. + + Args: + draw_position: Parameter. + point: Parameter. + + Returns: + Result of the operation. + """ + local_point = vec_sub(point, draw_position) + return rl.get_screen_to_world_2d(local_point, self.camera) + + +@dataclass +class CharacterParams: + """Parameter bag for a platformer character.""" + width: float = 24.0 + height: float = 40.0 + position: rl.Vector2 = v2(0.0, 0.0) + friction: float = 0.0 + restitution: float = 0.0 + density: float = 1.0 + + +class PlatformerCharacter(GameObject): + """Simple platformer character with movement.""" + def __init__(self, params: CharacterParams, gamepad: int = 0) -> None: + """ init . + + Args: + params: Parameter. + gamepad: Parameter. + + Returns: + None + """ + super().__init__() + self.p = params + self.physics: Optional[PhysicsService] = None + self.body: Optional[BodyComponent] = None + self.movement: Optional[PlatformerMovementComponent] = None + self.gamepad = gamepad + + def init(self) -> None: + """Initialize the object. + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + + def build_body(component: BodyComponent): + """Build body. + + Args: + component: Parameter. + + Returns: + Result of the operation. + """ + world = self.physics.world + body = world.CreateDynamicBody(position=(self.physics.convert_to_meters(self.p.position).x, + self.physics.convert_to_meters(self.p.position).y), + fixedRotation=True) + body.userData = self + shape = b2PolygonShape(box=(self.physics.convert_length_to_meters(self.p.width / 2.0), + self.physics.convert_length_to_meters(self.p.height / 2.0))) + body.CreateFixture(shape=shape, density=self.p.density, friction=self.p.friction, restitution=self.p.restitution) + component.body = body + + self.body = self.add_component(BodyComponent(build=build_body)) + params = PlatformerMovementParams() + params.width = self.p.width + params.height = self.p.height + self.movement = self.add_component(PlatformerMovementComponent(params)) + + def update(self, delta_time: float) -> None: + + """Update the object. + + Args: + delta_time: Parameter. + + Returns: + None + """ + deadzone = 0.1 + jump_pressed = rl.is_key_pressed(rl.KEY_W) or rl.is_gamepad_button_pressed(self.gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_DOWN) + jump_held = rl.is_key_down(rl.KEY_W) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_DOWN) + + move_x = rl.get_gamepad_axis_movement(self.gamepad, rl.GAMEPAD_AXIS_LEFT_X) + if abs(move_x) < deadzone: + move_x = 0.0 + if rl.is_key_down(rl.KEY_D) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_RIGHT): + move_x = 1.0 + elif rl.is_key_down(rl.KEY_A) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_LEFT): + move_x = -1.0 + + if self.movement: + self.movement.set_input(move_x, jump_pressed, jump_held) + + def draw(self) -> None: + + """Draw the object. + + Returns: + None + """ + if not self.body or not self.movement: + return + color = rl.GREEN if self.movement.grounded else rl.BLUE + pos = self.body.get_position_pixels() + rl.draw_rectangle_pro(rl.Rectangle(pos.x, pos.y, self.p.width, self.p.height), + v2(self.p.width / 2.0, self.p.height / 2.0), + 0.0, + color) diff --git a/py/engine/prefabs/includes.h b/py/engine/prefabs/includes.h new file mode 100644 index 0000000..0bfd025 --- /dev/null +++ b/py/engine/prefabs/includes.h @@ -0,0 +1,6 @@ +#pragma once + +#include "engine/prefabs/components.h" +#include "engine/prefabs/game_objects.h" +#include "engine/prefabs/managers.h" +#include "engine/prefabs/services.h" diff --git a/py/engine/prefabs/includes.py b/py/engine/prefabs/includes.py new file mode 100644 index 0000000..2956c8a --- /dev/null +++ b/py/engine/prefabs/includes.py @@ -0,0 +1,4 @@ +from engine.prefabs.components import * +from engine.prefabs.game_objects import * +from engine.prefabs.managers import * +from engine.prefabs.services import * diff --git a/py/engine/prefabs/managers.h b/py/engine/prefabs/managers.h new file mode 100644 index 0000000..ae92645 --- /dev/null +++ b/py/engine/prefabs/managers.h @@ -0,0 +1,217 @@ +#pragma once + +#include "engine/framework.h" + +/** + * For when you want multiple of the same manager. + */ +template +class MultiManager : public Manager +{ +public: + std::unordered_map> managers; + + MultiManager() = default; + + /** + * Initialize all managers. + */ + void init() override + { + for (auto& manager : managers) + { + manager.second->init_manager(); + } + Manager::init(); + } + + /** + * Add a manager to the MultiManager. + * + * @param name The name to give the manager. + * @param manager The manager to add. + */ + void add_manager(std::string name, std::unique_ptr manager) + { + static_assert(std::is_base_of::value, "T must derive from Manager"); + managers[name] = std::move(manager); + } + + /** + * Create a manager and add it to the MultiManager. + * + * @param name The name to give the manager. + * @param args The arguments to forward to the manager constructor. + * @return A pointer to the added manager. + */ + template + T* add_manager(std::string name, TArgs&&... args) + { + static_assert(std::is_base_of::value, "T must derive from Manager"); + auto new_manager = std::make_unique(std::forward(args)...); + T* manager_ptr = new_manager.get(); + add_manager(name, std::move(new_manager)); + return manager_ptr; + } + + /** + * Get a manager by name. + * + * @param name The name of the manager. + * @return A pointer to the manager. + */ + T* get_manager(std::string name) + { + return managers[name].get(); + } +}; + +/** + * Manager for handling fonts so they are not loaded multiple times. + */ +class FontManager : public Manager +{ +public: + std::unordered_map fonts; + + /** + * Constructor for FontManager. + * Loads the default font. + */ + FontManager() + { + fonts["default"] = GetFontDefault(); + } + + ~FontManager() + { + for (auto& pair : fonts) + { + UnloadFont(pair.second); + } + } + + /** + * Load a font from a file. + * + * @param name The name to associate with the font. + * @param filename The filename of the font to load. + * @param size The font size to save the font texture as. + * + * @return A reference to the loaded font. + */ + Font& load_font(const std::string& name, const std::string& filename, int size = 32) + { + if (fonts.find(name) != fonts.end()) + { + return fonts[name]; + } + + Font font = LoadFontEx(filename.c_str(), size, nullptr, 0); + fonts[name] = font; + return fonts[name]; + } + + /** + * Get a font by name. + * + * @param name The name of the font. + * @return A reference to the font. + */ + Font& get_font(const std::string& name) + { + return fonts[name]; + } + + /** + * Set the texture filter for a font. + * + * @param name The name of the font. + * @param filter The filter to set. + */ + void set_texture_filter(const std::string& name, int filter) + { + if (fonts.find(name) != fonts.end()) + { + SetTextureFilter(fonts[name].texture, filter); + } + } +}; + +/** + * Manager for handling the application window. + */ +class WindowManager : public Manager +{ +public: + int width = 1280; + int height = 720; + std::string title = "My Game"; + int target_fps = 60; + + WindowManager(int w, int h, const std::string& t, int fps = 60) : width(w), height(h), title(t), target_fps(fps) {} + + /** + * Initialize the window. + */ + void init() override + { + SetConfigFlags(FLAG_WINDOW_RESIZABLE); + InitWindow(width, height, title.c_str()); + InitAudioDevice(); + SetTargetFPS(target_fps); + + char* mappings = LoadFileText("assets/gamecontrollerdb.txt"); + SetGamepadMappings(mappings); + Manager::init(); + } + + /** + * Set the window title. + * + * @param t The new title. + */ + void set_title(const std::string& t) + { + title = t; + SetWindowTitle(title.c_str()); + } + + /** + * Get the window width. + * + * @return The window width. + */ + float get_width() const + { + return static_cast(width); + } + + /** + * Get the window height. + */ + float get_height() const + { + return static_cast(height); + } + + /** + * Get the window size. + * + * @return The window size as a Vector2. + */ + Vector2 get_size() const + { + return Vector2{(float)width, (float)height}; + } + + /** + * Get the window aspect ratio. + * + * @return The window aspect ratio. + */ + float get_aspect_ratio() const + { + return static_cast(width) / static_cast(height); + } +}; \ No newline at end of file diff --git a/py/engine/prefabs/managers.py b/py/engine/prefabs/managers.py new file mode 100644 index 0000000..dce3eab --- /dev/null +++ b/py/engine/prefabs/managers.py @@ -0,0 +1,174 @@ +from __future__ import annotations + +from typing import Any, Dict, Optional, Type +import pyray as rl + +from engine.framework import Manager + + +class MultiManager(Manager): + """Manager container for multiple managers of the same base type.""" + def __init__(self) -> None: + super().__init__() + self.managers: Dict[str, Manager] = {} + + def init(self) -> None: + """Initialize all contained managers. + + Returns: + None + """ + for manager in self.managers.values(): + manager.init_manager() + super().init() + + def add_manager(self, name: str, manager_or_cls: Any, *args: Any, **kwargs: Any) -> Manager: + """Add a manager instance or construct one from a class. + + Args: + name: Name to register the manager under. + manager_or_cls: Manager instance or Manager class. + *args: Positional args forwarded to the constructor. + **kwargs: Keyword args forwarded to the constructor. + + Returns: + The manager instance added. + """ + if isinstance(manager_or_cls, Manager): + manager = manager_or_cls + else: + manager = manager_or_cls(*args, **kwargs) + self.managers[name] = manager + return manager + + def get_manager(self, name: str) -> Optional[Manager]: + """Get a manager by name. + + Args: + name: Manager name. + + Returns: + The manager instance, or None if missing. + """ + return self.managers.get(name) + + +class FontManager(Manager): + """Manager for handling fonts so they are not loaded multiple times.""" + def __init__(self) -> None: + super().__init__() + self.fonts: Dict[str, Any] = {"default": rl.get_font_default()} + + def load_font(self, name: str, filename: str, size: int = 32) -> Any: + """Load a font from a file (cached by name). + + Args: + name: Name to register the font under. + filename: Path to the font file. + size: Font size used for the texture atlas. + + Returns: + The loaded font instance. + """ + if name in self.fonts: + return self.fonts[name] + + font = rl.load_font_ex(filename, size, None, 0) + self.fonts[name] = font + return font + + def get_font(self, name: str) -> Any: + """Get a font by name. + + Args: + name: Font name. + + Returns: + The font instance. + """ + return self.fonts[name] + + def set_texture_filter(self, name: str, texture_filter: int) -> None: + """Set the texture filter for a font. + + Args: + name: Font name. + texture_filter: Raylib texture filter enum value. + + Returns: + None + """ + if name in self.fonts: + rl.set_texture_filter(self.fonts[name].texture, texture_filter) + + +class WindowManager(Manager): + """Manager for handling the application window and audio device.""" + def __init__(self, width: int = 1280, height: int = 720, title: str = "My Game", fps: int = 60) -> None: + super().__init__() + self.width = width + self.height = height + self.title = title + self.target_fps = fps + + def init(self) -> None: + """Initialize the window and audio device. + + Returns: + None + """ + rl.set_config_flags(rl.FLAG_WINDOW_RESIZABLE) + rl.init_window(self.width, self.height, self.title) + rl.init_audio_device() + rl.set_target_fps(self.target_fps) + mappings = rl.load_file_text("assets/gamecontrollerdb.txt") + if mappings: + try: + rl.set_gamepad_mappings(mappings) + except Exception: + print("Failed to set gamepad mappings") + super().init() + + def set_title(self, title: str) -> None: + """Set the window title. + + Args: + title: New title string. + + Returns: + None + """ + self.title = title + rl.set_window_title(title) + + def get_width(self) -> float: + """Get the window width. + + Returns: + Window width in pixels. + """ + return float(self.width) + + def get_height(self) -> float: + """Get the window height. + + Returns: + Window height in pixels. + """ + return float(self.height) + + def get_size(self): + """Get the window size as a Vector2. + + Returns: + Vector2 containing width and height. + """ + return rl.Vector2(float(self.width), float(self.height)) + + def get_aspect_ratio(self) -> float: + """Get the window aspect ratio. + + Returns: + Width divided by height. + """ + return float(self.width) / float(self.height) diff --git a/py/engine/prefabs/services.h b/py/engine/prefabs/services.h new file mode 100644 index 0000000..de72906 --- /dev/null +++ b/py/engine/prefabs/services.h @@ -0,0 +1,1159 @@ +#pragma once + +#include + +#include "engine/framework.h" +#include "engine/physics_debug.h" +#include "engine/raycasts.h" + +/** + * For when you want multiple of the same service. + */ +template +class MultiService : public Service +{ +public: + std::unordered_map> services; + + MultiService() = default; + + /** + * Initialize all services. + */ + void init_service() override + { + for (auto& service : services) + { + service.second->init(); + } + Service::init_service(); + } + + /** + * Update all services. + */ + void update(float delta_time) override + { + for (auto& service : services) + { + service.second->update(); + } + Service::update(delta_time); + } + + /** + * Draw all services. + */ + void draw() override + { + for (auto& service : services) + { + service.second->draw(); + } + } + + /** + * Add a service to the MultiService. + * + * @param name The name to give the service. + * @param service The service to add. + */ + void add_service(std::string name, std::unique_ptr service) + { + static_assert(std::is_base_of::value, "T must derive from Service"); + services[name] = std::move(service); + } + + /** + * Create a service and add it to the MultiService. + * + * @param name The name to give the service. + * @param args The arguments to forward to the service constructor. + * @return A pointer to the added service. + */ + template + T* add_service(std::string name, TArgs&&... args) + { + static_assert(std::is_base_of::value, "T must derive from Service"); + auto new_service = std::make_unique(std::forward(args)...); + T* service_ptr = new_service.get(); + add_service(name, std::move(new_service)); + return service_ptr; + } + + /** + * Get a service by name. + * + * @param name The name of the service. + * @return A pointer to the service. + */ + T* get_service(std::string name) + { + return services[name].get(); + } +}; + +/** + * Service for managing textures. + * Useful when you don't want to load the same texture multiple times. + */ +class TextureService : public Service +{ +public: + std::unordered_map textures; + + TextureService() = default; + ~TextureService() + { + for (auto& pair : textures) + { + UnloadTexture(pair.second); + } + } + + /** + * Get a texture by filename. + * Loads the texture if it is not already loaded. + * + * @param filename The filename of the texture. + * @return A reference to the texture. + */ + Texture2D& get_texture(const std::string& filename) + { + if (textures.find(filename) == textures.end()) + { + Texture2D texture = LoadTexture(filename.c_str()); + textures[filename] = texture; + } + return textures[filename]; + } +}; + +/** + * Service for managing sounds. + * Useful when you don't want to load the same sound multiple times and want to play overlapping sounds. + */ +class SoundService : public Service +{ +public: + std::unordered_map> sounds; + + SoundService() = default; + ~SoundService() + { + for (auto& pair : sounds) + { + // The first sound is a real sound. + UnloadSound(pair.second[0]); + for (int i = 1; i < pair.second.size(); i++) + { + UnloadSoundAlias(pair.second[i]); + } + } + } + + /** + * Get a sound by filename. + * Loads the sound if it is not already loaded. + * Creates a new alias if the sound is already loaded to allow overlapping sounds. + * + * @param filename The filename of the sound. + * @return A reference to the sound. + */ + Sound& get_sound(const std::string& filename) + { + if (sounds.find(filename) == sounds.end()) + { + Sound sound = LoadSound(filename.c_str()); + sounds[filename] = {sound}; + } + else + { + // Create a new alias to allow overlapping sounds. + Sound sound = LoadSoundAlias(sounds[filename][0]); + sounds[filename].push_back(sound); + } + return sounds[filename].back(); + } +}; + +/** + * Service for managing the physics world. + */ +class PhysicsService : public Service +{ +public: + b2WorldId world = b2_nullWorldId; + b2Vec2 gravity = {0.0f, 10.0f}; + float time_step = 1.0f / 60.0f; + int sub_steps = 6; + float meters_to_pixels = 30.0f; + float pixels_to_meters = 1.0f / meters_to_pixels; + PhysicsDebugRenderer debug_draw; + + /** + * Constructor for PhysicsService. + * + * @param gravity The gravity vector for the physics world. + * @param time_step The time step for the physics simulation. + * @param sub_steps The number of sub-steps for the physics simulation. + * @param meters_to_pixels The scale factor from meters to pixels. + */ + PhysicsService(b2Vec2 gravity = b2Vec2{0.0f, 10.0f}, + float time_step = 1.0f / 60.0f, + int sub_steps = 6, + float meters_to_pixels = 30.0f) : + gravity(gravity), + time_step(time_step), + sub_steps(sub_steps), + meters_to_pixels(meters_to_pixels), + pixels_to_meters(1.0f / meters_to_pixels) + { + } + + ~PhysicsService() + { + if (b2World_IsValid(world)) + { + b2DestroyWorld(world); + } + } + + /** + * Initialize the physics world. + */ + void init() override + { + b2WorldDef world_def = b2DefaultWorldDef(); + world_def.gravity = gravity; + world_def.contactHertz = 120; + world = b2CreateWorld(&world_def); + debug_draw.init(meters_to_pixels); + } + + /** + * Update the physics world. + * + * @param delta_time The time elapsed since the last frame. + */ + void update(float delta_time) override + { + if (!b2World_IsValid(world)) + { + return; + } + b2World_Step(world, time_step, sub_steps); + } + + /** + * Draw the physics debug information. + */ + void draw_debug() + { + debug_draw.draw_debug(world); + } + + /** + * Convert between pixels and meters. + * + * @param meters The value in meters. + * @return The value in pixels. + */ + Vector2 convert_to_pixels(b2Vec2 meters) const + { + const auto converted = meters * meters_to_pixels; + return {converted.x, converted.y}; + } + + /** + * Convert between pixels and meters. + * + * @param pixels The value in pixels. + * @return The value in meters. + */ + b2Vec2 convert_to_meters(Vector2 pixels) const + { + const auto converted = pixels * pixels_to_meters; + return {converted.x, converted.y}; + } + + /** + * Convert a length from meters to pixels. + * + * @param meters The length in meters. + * @return The length in pixels. + */ + float convert_to_pixels(float meters) const + { + return meters * meters_to_pixels; + } + + /** + * Convert a length from pixels to meters. + * + * @param pixels The length in pixels. + * @return The length in meters. + */ + float convert_to_meters(float pixels) const + { + return pixels * pixels_to_meters; + } + + /** + * Raycast in pixels. + * + * @param ignore Box2d body to ignore. + * @param from The start point of the ray. + * @param to The end point of the ray. + * @return A RayHit struct describing the hit. + */ + RayHit raycast(b2BodyId ignore, Vector2 from, Vector2 to) + { + auto start = convert_to_meters(from); + auto translation = convert_to_meters(to - from); + + return raycast_closest(world, ignore, start, translation); + } + + /** + * Check for circle shape overlaps in pixels. + * + * @param center The center of the circle. + * @param radius The radius of the circle. + * @param ignore_body The body to ignore. + * @return A vector of body IDs that overlap with the circle. + */ + std::vector circle_overlap(Vector2 center, float radius, b2BodyId ignore_body = b2_nullBodyId) + { + auto center_m = convert_to_meters(center); + auto radius_m = convert_to_meters(radius); + return circle_hit(world, ignore_body, center_m, radius_m); + } + + /** + * Check for rectangle shape overlaps in pixels. + * + * @param rectangle The rectangle to check. + * @param rotation The rotation of the rectangle in degrees. + * @param ignore_body The body to ignore. + * @return A vector of body IDs that overlap with the rectangle. + */ + std::vector rectangle_overlap(Rectangle rectangle, + float rotation = 0.0f, + b2BodyId ignore_body = b2_nullBodyId) + { + Vector2 size = {rectangle.width, rectangle.height}; + Vector2 center = {rectangle.x + size.x / 2.0f, rectangle.y + size.y / 2.0f}; + auto size_m = convert_to_meters(size); + auto center_m = convert_to_meters(center); + return rectangle_hit(world, ignore_body, center_m, size_m, rotation); + } +}; + +/** + * Hash for ldtk::IntPoint to be used in unordered_map/set. + */ +struct IntPointHash +{ + size_t operator()(const ldtk::IntPoint& p) const noexcept + { + std::size_t h1 = std::hash{}(p.x); + std::size_t h2 = std::hash{}(p.y); + return h1 ^ (h2 << 1); + } +}; + +/** + * Undirected edge between two IntPoints, stored canonically (a < b). + */ +struct Edge +{ + ldtk::IntPoint a, b; +}; + +/** + * Equality operator for Edge. + * + * @param e1 The first edge. + * @param e2 The second edge. + * @return True if the edges are equal, false otherwise. + */ +static inline bool operator==(const Edge& e1, const Edge& e2) +{ + return e1.a == e2.a && e1.b == e2.b; +} + +/** + * Hash for Edge to be used in unordered_map/set. + */ +struct EdgeHash +{ + size_t operator()(const Edge& e) const noexcept + { + IntPointHash h; + std::size_t h1 = h(e.a); + std::size_t h2 = h(e.b); + return h1 ^ (h2 << 1); + } +}; + +struct LayerRenderer +{ + RenderTexture2D renderer; + ldtk::IID layer_iid; + bool visible = true; +}; + +/** + * Service for managing LDtk levels. + * Depends on TextureService and PhysicsService. + */ +class LevelService : public Service +{ +public: + ldtk::Project project; + std::string project_file; + std::string level_name; + std::vector collision_names; + std::vector renderers; + std::vector layer_bodies; + float scale = 1.0f; + PhysicsService* physics; + + /** + * Constructor for LevelService. + * + * @param project_file The path to the LDtk project file. + * @param level_name The name of the level to load. + * @param collision_names The names of the layers to create collision bodies for. + * @param scale The scale factor for the level. + */ + LevelService(std::string project_file, + std::string level_name, + std::vector collision_names, + float scale = 1.0f) : + project_file(project_file), + level_name(level_name), + collision_names(collision_names), + scale(scale) + { + } + + virtual ~LevelService() + { + for (auto& renderer : renderers) + { + UnloadRenderTexture(renderer.renderer); + } + + for (auto& body : layer_bodies) + { + if (b2Body_IsValid(body)) + { + b2DestroyBody(body); + } + } + } + + /** + * Initialize the level service. + * Loads the LDtk project and level, creates textures and collision bodies. + */ + void init() override + { + if (!FileExists(project_file.c_str())) + { + TraceLog(LOG_FATAL, "LDtk file not found: %s", project_file.c_str()); + } + project.loadFromFile(project_file); + const auto& world = project.getWorld(); + const auto& levels = world.allLevels(); + + bool found = false; + for (const auto& level : levels) + { + if (level.name == level_name) + { + found = true; + break; + } + } + if (!found) + { + TraceLog(LOG_FATAL, "LDtk level not found: %s", level_name.c_str()); + } + + physics = scene->get_service(); + + const auto& level = world.getLevel(level_name); + const auto& layers = level.allLayers(); + + // Loop through all layers and create textures and collisions bodies. + for (auto& layer : layers) + { + if (!layer.hasTileset()) + { + continue; + } + + // Load the texture and the renderer. + auto directory = std::string(GetDirectoryPath(project_file.c_str())); + auto tileset_file = directory + "/" + layer.getTileset().path; + if (!FileExists(tileset_file.c_str())) + { + TraceLog(LOG_FATAL, "Tileset file not found: %s", tileset_file.c_str()); + } + auto texture_service = scene->get_service(); + Texture2D texture = texture_service->get_texture(tileset_file); + RenderTexture2D renderer = LoadRenderTexture(level.size.x, level.size.y); + + // Draw all the tiles. + const auto& tiles_vector = layer.allTiles(); + BeginTextureMode(renderer); + // Clear with transparency so we can render layers on top of each other. + ClearBackground({0, 0, 0, 0}); + for (const auto& tile : tiles_vector) + { + const auto& position = tile.getPosition(); + const auto& texture_rect = tile.getTextureRect(); + Vector2 dest = { + static_cast(position.x), + static_cast(position.y), + }; + Rectangle src = {static_cast(texture_rect.x), + static_cast(texture_rect.y), + static_cast(texture_rect.width) * (tile.flipX ? -1.0f : 1.0f), + static_cast(texture_rect.height) * (tile.flipY ? -1.0f : 1.0f)}; + DrawTextureRec(texture, src, dest, WHITE); + } + EndTextureMode(); + LayerRenderer layer_renderer; + layer_renderer.renderer = renderer; + layer_renderer.layer_iid = layer.iid; + renderers.push_back(layer_renderer); + + // Create bodies. + const auto& size = layer.getGridSize(); + + auto make_edge = [&](ldtk::IntPoint p0, ldtk::IntPoint p1) -> Edge + { + if (p1.x < p0.x || (p1.x == p0.x && p1.y < p0.y)) + std::swap(p0, p1); + return {p0, p1}; + }; + + std::unordered_set edges; + + for (int y = 0; y < size.y; y++) + { + for (int x = 0; x < size.x; x++) + { + if (!is_solid(layer, x, y, size)) + continue; + + // neighbor empty => boundary edge + if (!is_solid(layer, x, y - 1, size)) + edges.insert(make_edge({x, y}, {x + 1, y})); + if (!is_solid(layer, x, y + 1, size)) + edges.insert(make_edge({x, y + 1}, {x + 1, y + 1})); + if (!is_solid(layer, x - 1, y, size)) + edges.insert(make_edge({x, y}, {x, y + 1})); + if (!is_solid(layer, x + 1, y, size)) + edges.insert(make_edge({x + 1, y}, {x + 1, y + 1})); + } + } + + std::unordered_map, IntPointHash> adj; + adj.reserve(edges.size() * 2); + + for (auto& e : edges) + { + adj[e.a].push_back(e.b); + adj[e.b].push_back(e.a); + } + + // Helper to remove an undirected edge from the set as we consume it + auto erase_edge = [&](ldtk::IntPoint p0, ldtk::IntPoint p1) { edges.erase(make_edge(p0, p1)); }; + + // Walk loops + std::vector> loops; + + while (!edges.empty()) + { + // pick an arbitrary remaining edge + Edge startE = *edges.begin(); + ldtk::IntPoint start = startE.a; + ldtk::IntPoint cur = startE.b; + ldtk::IntPoint prev = start; + + std::vector poly; + poly.push_back(start); + poly.push_back(cur); + erase_edge(start, cur); + + while (!(cur == start)) + { + // choose next neighbor that is not prev and still has an edge remaining + const auto& nbs = adj[cur]; + ldtk::IntPoint next = prev; // fallback + + bool found = false; + for (const ldtk::IntPoint& cand : nbs) + { + if (cand == prev) + continue; + if (edges.find(make_edge(cur, cand)) != edges.end()) + { + next = cand; + found = true; + break; + } + } + + if (!found) + { + // Open chain (should be rare for tile boundaries unless the boundary touches the map edge) + break; + } + + prev = cur; + cur = next; + poly.push_back(cur); + erase_edge(prev, cur); + + // safety guard to avoid infinite loops on bad topology + if (poly.size() > 100000) + break; + } + + // If closed, last vertex == start; Box2D chains usually want NOT duplicated end vertex. + if (!poly.empty() && poly.back() == poly.front()) + { + poly.pop_back(); + } + + // Only keep valid chains + if (poly.size() >= 3) + { + // If we're not solid on the right, then we wrapped the wrong way. + if (!loop_has_solid_on_right(poly, layer)) + { + std::reverse(poly.begin(), poly.end()); + } + + // Not really necessary but here we reduce the number of points on a line to just the ends. + // std::vector reduced; + // reduced.push_back(poly[0]); + // b2Vec2 original_normal = {0, 0}; + // for (int i = 1; i < poly.size(); i++) + // { + // auto first = poly[i - 1]; + // auto second = poly[i]; + // float length = sqrt((second.x - first.x) * (second.x - first.x) + + // (second.y - first.y) * (second.y - first.y)); + // b2Vec2 normal = {(second.x - first.x) / length, (second.y - first.y) / length}; + // if (length == 0) + // { + // normal = {0, 0}; + // } + // if (i == 1) + // { + // original_normal = normal; + // } + + // if (normal != original_normal) + // { + // reduced.push_back(first); + // original_normal = normal; + // } + // } + // reduced.push_back(poly.back()); + // loops.push_back(std::move(reduced)); + + loops.push_back(std::move(poly)); + } + } + + b2BodyDef bd = b2DefaultBodyDef(); + bd.type = b2_staticBody; + bd.position = {0, 0}; + assert(b2World_IsValid(physics->world)); + b2BodyId layer_body = b2CreateBody(physics->world, &bd); + + for (auto& loop : loops) + { + std::vector verts; + verts.reserve(loop.size()); + + for (auto& p : loop) + { + float xpx = p.x * layer.getCellSize() * scale; + float ypx = p.y * layer.getCellSize() * scale; + verts.push_back(physics->convert_to_meters({xpx, ypx})); + } + + std::vector mats; + for (int i = 0; i < verts.size(); i++) + { + b2SurfaceMaterial mat = b2DefaultSurfaceMaterial(); + mat.friction = 0.1f; + mat.restitution = 0.1f; + mats.push_back(mat); + } + + b2ChainDef cd = b2DefaultChainDef(); + cd.points = verts.data(); + cd.count = (int)verts.size(); + cd.materials = mats.data(); + cd.materialCount = (int)mats.size(); + cd.isLoop = true; + b2CreateChain(layer_body, &cd); + + layer_bodies.push_back(layer_body); + } + } + } + + /** + * Draw the level. + * Draws all the layer renderers. + */ + void draw() override + { + // Draw renderers in reverse. + for (int i = (int)renderers.size() - 1; i >= 0; i--) + { + const auto& layer_renderer = renderers[i]; + if (!layer_renderer.visible) + { + continue; + } + const auto& renderer = layer_renderer.renderer; + Rectangle src = {0, + 0, + static_cast(renderer.texture.width), + -static_cast(renderer.texture.height)}; + Rectangle dest = {0, + 0, + static_cast(renderer.texture.width) * scale, + static_cast(renderer.texture.height) * scale}; + DrawTexturePro(renderer.texture, src, dest, {0}, .0f, WHITE); + } + } + + /** + * Draw a specific layer by its IID. + * + * @param layer_id The IID of the layer. + */ + void draw_layer(ldtk::IID layer_id) + { + for (const auto& layer_renderer : renderers) + { + if (layer_renderer.layer_iid == layer_id) + { + const auto& renderer = layer_renderer.renderer; + Rectangle src = {0, + 0, + static_cast(renderer.texture.width), + -static_cast(renderer.texture.height)}; + Rectangle dest = {0, + 0, + static_cast(renderer.texture.width) * scale, + static_cast(renderer.texture.height) * scale}; + DrawTexturePro(renderer.texture, src, dest, {0}, .0f, WHITE); + return; + } + } + } + + /** + * Draw a specific layer by its name. + * + * @param layer_name The name of the layer. + */ + void draw_layer(std::string layer_name) + { + const auto& level = get_level(); + const auto& layer = level.getLayer(layer_name); + draw_layer(layer.iid); + } + + /** + * Check if a cell in the layer is solid. + * Used for collision generation. + * + * @param layer The LDtk layer. + * @param x The x coordinate of the cell. + * @param y The y coordinate of the cell. + * @param size The size of the layer in cells. + */ + bool is_solid(const ldtk::Layer& layer, int x, int y, const ldtk::IntPoint& size) + { + if (x < 0 || y < 0 || x >= size.x || y >= size.y) + { + return false; + } + + std::string name = layer.getIntGridVal(x, y).name; + if (std::find(collision_names.begin(), collision_names.end(), name) != collision_names.end()) + { + return true; + } + return false; + }; + + /** + * Check if there is solid on the right side of a loop of corners. + * Used to determine loop winding. + * + * @param loop_corners The corners of the loop. + * @param layer The LDtk layer. + * @return True if there is solid on the right side of the loop, false otherwise. + */ + bool loop_has_solid_on_right(const std::vector& loop_corners, const ldtk::Layer& layer) + { + const int cell_size = layer.getCellSize(); + + // Pick an edge with non-zero length. + int n = (int)loop_corners.size(); + for (int i = 0; i < n; ++i) + { + ldtk::IntPoint a = loop_corners[i]; + ldtk::IntPoint b = loop_corners[(i + 1) % n]; + int dx = b.x - a.x; + int dy = b.y - a.y; + if (dx == 0 && dy == 0) + continue; + + // Convert corner coords to scaled pixel coords. + float ax = a.x * cell_size * scale; + float ay = a.y * cell_size * scale; + float bx = b.x * cell_size * scale; + float by = b.y * cell_size * scale; + + // Edge direction. + float ex = bx - ax; + float ey = by - ay; + float len = std::sqrt(ex * ex + ey * ey); + if (len < 1e-4f) + { + continue; + } + ex /= len; + ey /= len; + + // Right normal = (-ey, ex) + float rx = -ey; + float ry = ex; + + // Midpoint of the edge. + float mx = 0.5f * (ax + bx); + float my = 0.5f * (ay + by); + + // Sample a point slightly to the right, a quarter cell away. + float eps = 0.25f * cell_size * scale; + float sx = mx + rx * eps; + float sy = my + ry * eps; + + // Map sample pixel to grid cell. + int gx = (int)std::floor(sx / (cell_size * scale)); + int gy = (int)std::floor(sy / (cell_size * scale)); + + return is_solid(layer, gx, gy, layer.getGridSize()); + } + + // Fallback: if degenerate, say false + return false; + } + + /** + * Set the visibility of a layer by its IID. + * + * @param layer_id The IID of the layer. + * @param visible True to make the layer visible, false to hide it. + */ + void set_layer_visibility(ldtk::IID layer_id, bool visible) + { + for (auto& layer_renderer : renderers) + { + if (layer_renderer.layer_iid == layer_id) + { + layer_renderer.visible = visible; + return; + } + } + } + + /** + * Set the visibility of a layer by its name. + * + * @param layer_name The name of the layer. + * @param visible True to make the layer visible, false to hide it. + */ + void set_layer_visibility(std::string layer_name, bool visible) + { + const auto& level = get_level(); + const auto& layer = level.getLayer(layer_name); + for (auto& layer_renderer : renderers) + { + if (layer_renderer.layer_iid == layer.iid) + { + layer_renderer.visible = visible; + return; + } + } + } + + /** + * Get the LDtk world. + * + * @return A reference to the LDtk world. + */ + const ldtk::World& get_world() + { + return project.getWorld(); + } + + /** + * Get the LDtk level. + * + * @return A reference to the LDtk level. + */ + const ldtk::Level& get_level() + { + const auto& world = project.getWorld(); + return world.getLevel(level_name); + } + + /** + * Get the level size in pixels. + * + * @return A Vector2 containing the size of the level. + */ + Vector2 get_size() + { + const auto& level = get_level(); + return {level.size.x * scale, level.size.y * scale}; + } + + /** + * Get a layer by its name. + * + * @param name The name of the layer. + * @return A reference to the LDtk layer. + */ + const ldtk::Layer& get_layer_by_name(const std::string& name) + { + const auto& level = get_level(); + return level.getLayer(name); + } + + /** + * Get all entities across all layers in the level. + * + * @return A vector of LDtk entities. + */ + std::vector get_entities() + { + if (!is_init) + { + TraceLog(LOG_ERROR, "LDtk project not loaded."); + return {}; + } + const auto& level = get_level(); + const auto& layers = level.allLayers(); + + std::vector entities; + + for (const auto& layer : layers) + { + const auto& layer_entities = layer.allEntities(); + + entities.reserve(entities.size() + layer_entities.size()); + for (const auto& entity : layer_entities) + { + entities.push_back(&entity); + } + } + + return entities; + } + + /** + * Get all entities across all layers in the level with the given name. + * + * @param name The name of the entities to get. + * @return A vector of LDtk entities. + */ + std::vector get_entities_by_name(const std::string& name) + { + if (!is_init) + { + TraceLog(LOG_ERROR, "LDtk project not loaded."); + return {}; + } + const auto& level = get_level(); + const auto& layers = level.allLayers(); + + std::vector entities; + + for (const auto& layer : layers) + { + const auto& layer_entities = layer.getEntitiesByName(name); + + entities.reserve(entities.size() + layer_entities.size()); + for (const auto& entity : layer_entities) + { + entities.push_back(&entity.get()); + } + } + + return entities; + } + + /** + * Get all entities across all layers in the level with the given tag. + * + * @param tag The tag of the entities to get. + * @return A vector of LDtk entities. + */ + std::vector get_entities_by_tag(const std::string& tag) + { + if (!is_init) + { + TraceLog(LOG_ERROR, "LDtk project not loaded."); + return {}; + } + const auto& level = get_level(); + const auto& layers = level.allLayers(); + + std::vector entities; + + for (const auto& layer : layers) + { + const auto& layer_entities = layer.getEntitiesByTag(tag); + + entities.reserve(entities.size() + layer_entities.size()); + for (const auto& entity : layer_entities) + { + entities.push_back(&entity.get()); + } + } + + return entities; + } + + /** + * Get the first entity across all layers in the level with the given name. + * + * @param name The name of the entity to get. + * @return A pointer to the LDtk entity, or nullptr if not found. + */ + const ldtk::Entity* get_entity_by_name(const std::string& name) + { + auto entities = get_entities_by_name(name); + if (entities.empty()) + { + return nullptr; + } + + return entities[0]; + } + + /** + * Get the first entity across all layers in the level with the given tag. + * + * @param tag The tag of the entity to get. + * @return A pointer to the LDtk entity, or nullptr if not found. + */ + const ldtk::Entity* get_entity_by_tag(const std::string& tag) + { + auto entities = get_entities_by_tag(tag); + if (entities.empty()) + { + return nullptr; + } + + return entities[0]; + } + + /** + * Convert a grid point to pixels. + * + * @param point The grid point to convert. + * @return A Vector2 containing the point in pixels. + */ + Vector2 convert_to_pixels(const ldtk::IntPoint& point) const + { + return {point.x * scale, point.y * scale}; + } + + /** + * Convert a cell point to pixels. + * + * @param cell_point The cell point to convert. + * @param layer The LDtk layer the cell point is in. + */ + Vector2 convert_cells_to_pixels(const ldtk::IntPoint& cell_point, const ldtk::Layer& layer) const + { + float cell_size = static_cast(layer.getCellSize()); + return {cell_point.x * cell_size * scale, cell_point.y * cell_size * scale}; + } + + /** + * Convert a grid point to meters. + * + * @param point The grid point to convert. + * @return A b2Vec2 containing the point in meters. + */ + b2Vec2 convert_to_meters(const ldtk::IntPoint& point) const + { + return physics->convert_to_meters(convert_to_pixels(point)); + } + + /** + * Convert pixels to a grid point. + * + * @param pixels The pixel position to convert. + * @return An IntPoint containing the point in grid coordinates. + */ + ldtk::IntPoint convert_to_grid(const Vector2& pixels) const + { + return {static_cast(pixels.x / scale), static_cast(pixels.y / scale)}; + } + + /** + * Convert meters to a grid point. + * + * @param meters The meter position to convert. + * @return An IntPoint containing the point in grid coordinates. + */ + ldtk::IntPoint convert_to_grid(const b2Vec2& meters) const + { + auto pixels = physics->convert_to_pixels(meters); + return {static_cast(pixels.x / scale), static_cast(pixels.y / scale)}; + } + + /** + * Get the position of an entity in pixels. + * + * @param entity The entity to get the position of. + * @return A Vector2 containing the position of the entity in pixels. + */ + Vector2 get_entity_position(ldtk::Entity* entity) + { + return convert_to_pixels(entity->getPosition()); + } + + /** + * Get the size of an entity in pixels. + * + * @param entity The entity to get the size of. + * @return A Vector2 containing the size of the entity in pixels. + */ + Vector2 get_entity_size(ldtk::Entity* entity) + { + return convert_to_pixels(entity->getSize()); + } +}; diff --git a/py/engine/prefabs/services.py b/py/engine/prefabs/services.py new file mode 100644 index 0000000..5732d28 --- /dev/null +++ b/py/engine/prefabs/services.py @@ -0,0 +1,798 @@ +from __future__ import annotations + +import json +import math +from dataclasses import dataclass +from typing import Any, Dict, List, Optional + +from Box2D import (b2Body, b2CircleShape, b2EdgeShape, b2FixtureDef, + b2PolygonShape, b2Vec2, b2World) +import pyray as rl + +from engine.framework import Service +from engine.math_extensions import v2 +from engine.physics_debug import PhysicsDebugRenderer +from engine.raycasts import circle_hit, raycast_closest, rectangle_hit +from engine.LdtkJson import LdtkJSON, Level, LayerInstance, GridPoint + + +class MultiService(Service): + """Service container for multiple services of the same base type. + + Attributes: + services: Mapping of service name to instance. + """ + def __init__(self) -> None: + super().__init__() + self.services: Dict[str, Service] = {} + + def init_service(self) -> None: + """Initialize all contained services. + + Returns: + None + """ + for service in self.services.values(): + service.init() + super().init_service() + + def update(self, delta_time: float) -> None: + """Update all contained services. + + Args: + delta_time: Seconds since the last frame. + + Returns: + None + """ + for service in self.services.values(): + service.update(delta_time) + super().update(delta_time) + + def draw(self) -> None: + """Draw all contained services. + + Returns: + None + """ + for service in self.services.values(): + service.draw() + + def add_service(self, name: str, service_or_cls: Any, *args: Any, **kwargs: Any) -> Service: + """Add a service instance or construct one from a class. + + Args: + name: Name to register the service under. + service_or_cls: A Service instance or Service class. + *args: Positional args forwarded to the constructor. + **kwargs: Keyword args forwarded to the constructor. + + Returns: + The service instance added. + """ + if isinstance(service_or_cls, Service): + service = service_or_cls + else: + service = service_or_cls(*args, **kwargs) + self.services[name] = service + return service + + def get_service(self, name: str) -> Optional[Service]: + """Get a service by name. + + Args: + name: Registered name of the service. + + Returns: + The service instance, or None if missing. + """ + return self.services.get(name) + + +class TextureService(Service): + """Cache textures so they are loaded once. + + Attributes: + textures: Mapping of filename to loaded Texture2D. + """ + def __init__(self) -> None: + super().__init__() + self.textures: Dict[str, rl.Texture2D] = {} + + def get_texture(self, filename: str) -> rl.Texture2D: + """Get or load a texture by filename. + + Args: + filename: Path to the texture file. + + Returns: + The loaded Texture2D. + """ + + if filename not in self.textures: + self.textures[filename] = rl.load_texture(filename) + return self.textures[filename] + + +class SoundService(Service): + """Cache sounds and create aliases for overlapping playback. + + Attributes: + sounds: Mapping of filename to a list of Sound aliases. + """ + def __init__(self) -> None: + super().__init__() + self.sounds: Dict[str, List[Any]] = {} + + def get_sound(self, filename: str): + """Get or load a sound; returns an alias if already loaded. + + Args: + filename: Path to the sound file. + + Returns: + A Sound instance (original or alias). + """ + + if filename not in self.sounds: + self.sounds[filename] = [rl.load_sound(filename)] + else: + self.sounds[filename].append(rl.load_sound_alias(self.sounds[filename][0])) + return self.sounds[filename][-1] + + +class PhysicsService(Service): + """Service that owns the Box2D world and physics configuration.""" + def __init__(self, + gravity: b2Vec2 = b2Vec2(0.0, 10.0), + time_step: float = 1.0 / 60.0, + sub_steps: int = 6, + meters_to_pixels: float = 30.0) -> None: + super().__init__() + self.gravity = gravity + self.time_step = time_step + self.sub_steps = sub_steps + self.meters_to_pixels = meters_to_pixels + self.pixels_to_meters = 1.0 / meters_to_pixels + self.world: Optional[b2World] = None + self.debug_draw = PhysicsDebugRenderer(meters_to_pixels=meters_to_pixels) + + def init(self) -> None: + """Create the Box2D world. + + Returns: + None + """ + self.world = b2World(gravity=self.gravity, doSleep=True) + self.world.contactListener = None + self.world.renderer = self.debug_draw + + def update(self, delta_time: float) -> None: + """Step the physics world. + + Args: + delta_time: Seconds since the last frame (unused by fixed-step). + + Returns: + None + """ + if not self.world: + return + self.world.Step(self.time_step, self.sub_steps, self.sub_steps) + + def draw_debug(self) -> None: + """Draw debug shapes for the physics world. + + Returns: + None + """ + if self.world: + self.world.DrawDebugData() + + def convert_to_pixels(self, meters: b2Vec2) -> b2Vec2: + """Convert meters to pixels. + + Args: + meters: Vector in meters. + + Returns: + Vector in pixels. + """ + return b2Vec2(meters.x * self.meters_to_pixels, meters.y * self.meters_to_pixels) + + def convert_to_meters(self, pixels) -> b2Vec2: + """Convert pixels to meters. + + Args: + pixels: Vector in pixels. + + Returns: + Vector in meters. + """ + return b2Vec2(pixels.x * self.pixels_to_meters, pixels.y * self.pixels_to_meters) + + def convert_length_to_pixels(self, meters: float) -> float: + """Convert a length in meters to pixels. + + Args: + meters: Length in meters. + + Returns: + Length in pixels. + """ + return meters * self.meters_to_pixels + + def convert_length_to_meters(self, pixels: float) -> float: + """Convert a length in pixels to meters. + + Args: + pixels: Length in pixels. + + Returns: + Length in meters. + """ + return pixels * self.pixels_to_meters + + def raycast(self, ignore: Optional[b2Body], start, end): + """Raycast in pixel units. + + Args: + ignore: Body to ignore during raycast. + start: Start position in pixels. + end: End position in pixels. + + Returns: + RayHit if world exists, otherwise None. + """ + if not self.world: + return None + origin = self.convert_to_meters(start) + translation = self.convert_to_meters(v2(end.x - start.x, end.y - start.y)) + return raycast_closest(self.world, ignore, origin, translation) + + def circle_overlap(self, center, radius: float, ignore_body: Optional[b2Body] = None): + """Overlap query for a circle in pixel units. + + Args: + center: Center in pixels. + radius: Radius in pixels. + ignore_body: Optional body to ignore. + + Returns: + List of bodies overlapping the circle. + """ + if not self.world: + return [] + center_m = self.convert_to_meters(center) + radius_m = self.convert_length_to_meters(radius) + return circle_hit(self.world, ignore_body, center_m, radius_m) + + def rectangle_overlap(self, rectangle, rotation: float = 0.0, ignore_body: Optional[b2Body] = None): + """Overlap query for a rectangle in pixel units. + + Args: + rectangle: Rectangle in pixels. + rotation: Rotation in radians. + ignore_body: Optional body to ignore. + + Returns: + List of bodies overlapping the rectangle. + """ + if not self.world: + return [] + size = v2(rectangle.width, rectangle.height) + center = v2(rectangle.x + size.x / 2.0, rectangle.y + size.y / 2.0) + size_m = self.convert_to_meters(size) + center_m = self.convert_to_meters(center) + return rectangle_hit(self.world, ignore_body, center_m, size_m, rotation) + + +@dataclass(frozen=True) +class IntPoint: + x: int + y: int + + +class LdtkEntity: + """Thin wrapper around an LDtk entity instance.""" + def __init__(self, entity) -> None: + self.entity = entity + + def getPosition(self) -> IntPoint: + """Get entity position in pixels. + + Returns: + IntPoint for the entity position. + """ + return IntPoint(self.entity.px[0], self.entity.px[1]) + + def getSize(self) -> IntPoint: + """Get entity size in pixels. + + Returns: + IntPoint for the entity size. + """ + return IntPoint(self.entity.width, self.entity.height) + + def getField(self, name: str) -> Optional[Any]: + """Get a field value by name. + + Args: + name: Field identifier. + + Returns: + Field value, converted for point fields when possible. + """ + for field in self.entity.field_instances: + if field.identifier == name: + value = field.value + if isinstance(value, dict) and "cx" in value and "cy" in value: + return IntPoint(int(value["cx"]), int(value["cy"])) + return value + return None + + +@dataclass +class LayerRenderer: + renderer: rl.RenderTexture + layer_iid: str + visible: bool = True + + +class LevelService(Service): + """Service for loading and drawing LDtk levels and collisions. + + Attributes: + project: Parsed LDtk project. + level: Active Level instance. + renderers: Render textures per layer. + layer_bodies: Physics bodies used for collision. + physics: PhysicsService reference. + """ + def __init__(self, + project_file: str, + level_name: str, + collision_names: List[str], + scale: float = 1.0) -> None: + super().__init__() + self.project_file = project_file + self.level_name = level_name + self.collision_names = collision_names + self.scale = scale + self.project: Optional[LdtkJSON] = None + self.level: Optional[Level] = None + self.renderers: List[LayerRenderer] = [] + self.layer_bodies: List[b2Body] = [] + self.physics: Optional[PhysicsService] = None + self.layer_defs_by_uid: Dict[int, Any] = {} + + def init(self) -> None: + """Load the LDtk project, build renderers and collision bodies. + + Returns: + None + """ + if not rl.file_exists(self.project_file): + print(f"LDtk file not found: {self.project_file}") + raise RuntimeError("LDtk file not found") + + with open(self.project_file, "r", encoding="utf-8") as handle: + project_data = json.load(handle) + self.project = LdtkJSON.from_dict(project_data) + + level = None + for candidate in self.project.levels: + if candidate.identifier == self.level_name: + level = candidate + break + if level is None: + print(f"LDtk level not found: {self.level_name}") + raise RuntimeError("LDtk level not found") + + if level.layer_instances is None and level.external_rel_path: + external_path = self._resolve_external_level_path(level.external_rel_path) + with open(external_path, "r", encoding="utf-8") as handle: + external_data = json.load(handle) + level = Level.from_dict(external_data) + + self.level = level + self.layer_defs_by_uid = {layer.uid: layer for layer in self.project.defs.layers} + + self.physics = self.scene.get_service(PhysicsService) if self.scene else None + if not self.physics: + print("PhysicsService required for LevelService") + raise RuntimeError("PhysicsService required") + + texture_service = self.scene.get_service(TextureService) + for layer in self.level.layer_instances or []: + if layer.tileset_rel_path: + tileset_path = self._resolve_tileset_path(layer.tileset_rel_path) + texture = texture_service.get_texture(tileset_path) + renderer = rl.load_render_texture(self.level.px_wid, self.level.px_hei) + self._render_layer_tiles(layer, texture, renderer) + self.renderers.append(LayerRenderer(renderer=renderer, layer_iid=layer.iid, visible=layer.visible)) + + if layer.type == "IntGrid" and self.collision_names: + self._build_collision_for_layer(layer) + + def _resolve_tileset_path(self, rel_path: str) -> str: + """Resolve a tileset path relative to the project file. + + Args: + rel_path: Relative tileset path from the LDtk project. + + Returns: + Absolute or normalized tileset path. + """ + import os + + directory = os.path.dirname(self.project_file) + return os.path.join(directory, rel_path).replace("\\", "/") + + def _resolve_external_level_path(self, rel_path: str) -> str: + """Resolve an external level path relative to the project file. + + Args: + rel_path: Relative level path from the LDtk project. + + Returns: + Absolute or normalized level path. + """ + import os + + directory = os.path.dirname(self.project_file) + return os.path.join(directory, rel_path).replace("\\", "/") + + def _render_layer_tiles(self, layer: LayerInstance, texture: rl.Texture2D, renderer: rl.RenderTexture) -> None: + """Render the tiles for a layer to a render texture. + + Args: + layer: Layer instance to render. + texture: Tileset texture. + renderer: Render texture target. + + Returns: + None + """ + rl.begin_texture_mode(renderer) + rl.clear_background(rl.Color(0, 0, 0, 0)) + + tile_size = layer.grid_size + tiles = list(layer.grid_tiles) + list(layer.auto_layer_tiles) + for tile in tiles: + src_x, src_y = tile.src[0], tile.src[1] + flip_x = (tile.f & 1) != 0 + flip_y = (tile.f & 2) != 0 + src = rl.Rectangle(float(src_x), float(src_y), + float(tile_size) * (-1.0 if flip_x else 1.0), + float(tile_size) * (-1.0 if flip_y else 1.0)) + dest = v2(float(tile.px[0] + layer.px_total_offset_x), float(tile.px[1] + layer.px_total_offset_y)) + rl.draw_texture_rec(texture, src, dest, rl.WHITE) + + rl.end_texture_mode() + + def _intgrid_value_name(self, layer: LayerInstance, value: int) -> Optional[str]: + """Map an IntGrid value to its identifier string. + + Args: + layer: Layer instance with IntGrid definitions. + value: Raw IntGrid value. + + Returns: + Identifier string or None if empty/unknown. + """ + if value == 0: + return None + layer_def = self.layer_defs_by_uid.get(layer.layer_def_uid) + if not layer_def: + return None + for def_value in layer_def.int_grid_values: + if def_value.value == value: + return def_value.identifier + return None + + def _build_collision_for_layer(self, layer: LayerInstance) -> None: + """Create boundary colliders for a collision layer. + + Args: + layer: Layer instance to build colliders for. + + Returns: + None + """ + if not self.physics or not self.physics.world: + return + world = self.physics.world + body = world.CreateStaticBody(position=(0, 0)) + grid_w = layer.c_wid + grid_h = layer.c_hei + cell_size = float(layer.grid_size) * self.scale + # Build boundary edges into chain shapes to avoid internal collisions. + def is_solid(cx: int, cy: int) -> bool: + if cx < 0 or cy < 0 or cx >= grid_w or cy >= grid_h: + return False + idx = cy * grid_w + cx + value = layer.int_grid_csv[idx] if idx < len(layer.int_grid_csv) else 0 + name = self._intgrid_value_name(layer, value) + return bool(name and name in self.collision_names) + + def make_edge(a, b): + return (a, b) if a <= b else (b, a) + + edges = set() + for y in range(grid_h): + for x in range(grid_w): + if not is_solid(x, y): + continue + if not is_solid(x, y - 1): + edges.add(make_edge((x, y), (x + 1, y))) + if not is_solid(x, y + 1): + edges.add(make_edge((x, y + 1), (x + 1, y + 1))) + if not is_solid(x - 1, y): + edges.add(make_edge((x, y), (x, y + 1))) + if not is_solid(x + 1, y): + edges.add(make_edge((x + 1, y), (x + 1, y + 1))) + + adj: Dict[tuple, List[tuple]] = {} + for a, b in edges: + adj.setdefault(a, []).append(b) + adj.setdefault(b, []).append(a) + + def erase_edge(a, b): + edges.discard(make_edge(a, b)) + + loops: List[List[tuple]] = [] + while edges: + start_a, start_b = next(iter(edges)) + start = start_a + cur = start_b + prev = start + poly = [start, cur] + erase_edge(start, cur) + + while cur != start: + next_pt = None + for cand in adj.get(cur, []): + if cand == prev: + continue + if make_edge(cur, cand) in edges: + next_pt = cand + break + if next_pt is None: + break + prev, cur = cur, next_pt + poly.append(cur) + erase_edge(prev, cur) + if len(poly) > 100000: + break + + if poly and poly[0] == poly[-1]: + poly.pop() + if len(poly) >= 3: + loops.append(poly) + + for loop in loops: + verts = [] + for cx, cy in loop: + x_px = cx * cell_size + y_px = cy * cell_size + verts.append(self.physics.convert_to_meters(v2(x_px, y_px))) + count = len(verts) + if count < 2: + continue + for i in range(count): + v1 = verts[i] + v2p = verts[(i + 1) % count] + edge = b2EdgeShape(vertices=[(float(v1.x), float(v1.y)), (float(v2p.x), float(v2p.y))]) + body.CreateFixture(shape=edge, friction=0.1, restitution=0.1) + self.layer_bodies.append(body) + + def draw(self) -> None: + """Draw all visible layer renderers in reverse order. + + Returns: + None + """ + for renderer in reversed(self.renderers): + if not renderer.visible: + continue + texture = renderer.renderer.texture + src = rl.Rectangle(0.0, 0.0, float(texture.width), -float(texture.height)) + dest = rl.Rectangle(0.0, 0.0, float(texture.width) * self.scale, float(texture.height) * self.scale) + rl.draw_texture_pro(texture, src, dest, v2(0.0, 0.0), 0.0, rl.WHITE) + + def draw_layer(self, layer_id_or_name: str) -> None: + """Draw a specific layer by IID or identifier. + + Args: + layer_id_or_name: Layer IID or identifier. + + Returns: + None + """ + if not self.level: + return + layer = None + for layer_inst in self.level.layer_instances or []: + if layer_inst.iid == layer_id_or_name or layer_inst.identifier == layer_id_or_name: + layer = layer_inst + break + if not layer: + return + for renderer in self.renderers: + if renderer.layer_iid == layer.iid: + texture = renderer.renderer.texture + src = rl.Rectangle(0.0, 0.0, float(texture.width), -float(texture.height)) + dest = rl.Rectangle(0.0, 0.0, float(texture.width) * self.scale, float(texture.height) * self.scale) + rl.draw_texture_pro(texture, src, dest, v2(0.0, 0.0), 0.0, rl.WHITE) + return + + def set_layer_visibility(self, layer_id_or_name: str, visible: bool) -> None: + """Set a layer's visibility by IID or identifier. + + Args: + layer_id_or_name: Layer IID or identifier. + visible: True to show the layer, False to hide it. + + Returns: + None + """ + if not self.level: + return + for layer_inst in self.level.layer_instances or []: + if layer_inst.iid == layer_id_or_name or layer_inst.identifier == layer_id_or_name: + for renderer in self.renderers: + if renderer.layer_iid == layer_inst.iid: + renderer.visible = visible + return + + def get_layer_by_name(self, name: str) -> Optional[LayerInstance]: + """Get a layer instance by name. + + Args: + name: Layer identifier. + + Returns: + The LayerInstance or None. + """ + if not self.level: + return None + for layer in self.level.layer_instances or []: + if layer.identifier == name: + return layer + return None + + def get_entities(self) -> List[LdtkEntity]: + """Get all entities across all layers. + + Returns: + List of LdtkEntity wrappers. + """ + if not self.level: + print("LDtk project not loaded.") + return [] + entities: List[LdtkEntity] = [] + for layer in self.level.layer_instances or []: + if layer.type != "Entities": + continue + for entity in layer.entity_instances: + entities.append(LdtkEntity(entity)) + return entities + + def get_entities_by_name(self, name: str) -> List[LdtkEntity]: + """Get all entities by name across all layers. + + Args: + name: Entity identifier. + + Returns: + List of matching entities. + """ + return [entity for entity in self.get_entities() if entity.entity.identifier == name] + + def get_entities_by_tag(self, tag: str) -> List[LdtkEntity]: + """Get all entities by tag across all layers. + + Args: + tag: Tag string. + + Returns: + List of matching entities. + """ + return [entity for entity in self.get_entities() if tag in entity.entity.tags] + + def get_entity_by_name(self, name: str) -> Optional[LdtkEntity]: + """Get the first entity by name. + + Args: + name: Entity identifier. + + Returns: + The first matching entity, or None. + """ + entities = self.get_entities_by_name(name) + return entities[0] if entities else None + + def get_entity_by_tag(self, tag: str) -> Optional[LdtkEntity]: + """Get the first entity by tag. + + Args: + tag: Tag string. + + Returns: + The first matching entity, or None. + """ + entities = self.get_entities_by_tag(tag) + return entities[0] if entities else None + + def convert_to_pixels(self, point: IntPoint) -> Any: + """Convert grid point to pixels. + + Args: + point: Grid point. + + Returns: + Vector2 in pixels. + """ + return v2(point.x * self.scale, point.y * self.scale) + + def convert_cells_to_pixels(self, cell_point: IntPoint, layer: LayerInstance): + """Convert cell coordinates to pixels. + + Args: + cell_point: Cell coordinates. + layer: Layer instance for cell size. + + Returns: + Vector2 in pixels. + """ + cell_size = float(layer.grid_size) + return v2(cell_point.x * cell_size * self.scale, cell_point.y * cell_size * self.scale) + + def convert_to_meters(self, point: IntPoint): + """Convert grid point to meters. + + Args: + point: Grid point. + + Returns: + b2Vec2 in meters. + """ + if not self.physics: + return b2Vec2(0.0, 0.0) + return self.physics.convert_to_meters(self.convert_to_pixels(point)) + + def convert_to_grid(self, pixels) -> IntPoint: + """Convert pixels to grid coordinates. + + Args: + pixels: Vector2 in pixels. + + Returns: + IntPoint grid coordinate. + """ + return IntPoint(int(pixels.x / self.scale), int(pixels.y / self.scale)) + + def convert_to_grid_meters(self, meters) -> IntPoint: + """Convert meters to grid coordinates. + + Args: + meters: b2Vec2 in meters. + + Returns: + IntPoint grid coordinate. + """ + if not self.physics: + return IntPoint(0, 0) + pixels = self.physics.convert_to_pixels(meters) + return IntPoint(int(pixels.x / self.scale), int(pixels.y / self.scale)) + + def get_size(self): + """Get level size in pixels. + + Returns: + Vector2 containing level width and height in pixels. + """ + if not self.level: + return v2(0.0, 0.0) + return v2(float(self.level.px_wid) * self.scale, float(self.level.px_hei) * self.scale) diff --git a/py/engine/raycasts.py b/py/engine/raycasts.py new file mode 100644 index 0000000..960a659 --- /dev/null +++ b/py/engine/raycasts.py @@ -0,0 +1,189 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import List, Optional + +from Box2D import (b2AABB, b2Body, b2CircleShape, b2PolygonShape, b2QueryCallback, + b2RayCastCallback, b2Transform, b2Vec2, b2TestOverlap) + + +@dataclass +class RayHit: + """Raycast hit data. + + Attributes: + hit: True if the ray hit something. + body: The body hit, if any. + fraction: Fraction along the ray where the hit occurred. + distance: Distance along the ray in world units. + point: World-space hit point. + normal: World-space hit normal. + """ + hit: bool = False + body: Optional[b2Body] = None + fraction: float = 1.0 + distance: float = 0.0 + point: b2Vec2 = b2Vec2(0.0, 0.0) + normal: b2Vec2 = b2Vec2(0.0, 0.0) + + +class _RayCastClosest(b2RayCastCallback): + def __init__(self, ignore_body: Optional[b2Body], translation: b2Vec2, result: RayHit) -> None: + super().__init__() + self.ignore_body = ignore_body + self.translation = translation + self.result = result + + def ReportFixture(self, fixture, point, normal, fraction): # noqa: N802 + if self.ignore_body is not None and fixture.body == self.ignore_body: + return 1.0 + if fraction < self.result.fraction: + self.result.hit = True + self.result.fraction = fraction + self.result.distance = self.translation.length * fraction + self.result.point = point + self.result.normal = normal + self.result.body = fixture.body + return fraction + + +def raycast_closest(world, ignore_body: Optional[b2Body], origin: b2Vec2, translation: b2Vec2) -> RayHit: + """Cast a ray and return the closest hit. + + Args: + world: Box2D world to query. + ignore_body: Optional body to ignore. + origin: Ray start in world units. + translation: Ray delta in world units. + + Returns: + RayHit data for the closest hit (or empty hit if none). + """ + result = RayHit() + callback = _RayCastClosest(ignore_body, translation, result) + world.RayCast(callback, origin, origin + translation) + return result + + +def raycast_all(world, ignore_body: Optional[b2Body], origin: b2Vec2, translation: b2Vec2) -> List[RayHit]: + """Cast a ray and return all hits. + + Args: + world: Box2D world to query. + ignore_body: Optional body to ignore. + origin: Ray start in world units. + translation: Ray delta in world units. + + Returns: + List of RayHit results. + """ + hits: List[RayHit] = [] + + class _RayCastAll(b2RayCastCallback): + def __init__(self, ignore: Optional[b2Body], translation_vec: b2Vec2) -> None: + super().__init__() + self.ignore = ignore + self.translation_vec = translation_vec + + def ReportFixture(self, fixture, point, normal, fraction): # noqa: N802 + if self.ignore is not None and fixture.body == self.ignore: + return 1.0 + hit = RayHit(True, fixture.body, fraction, self.translation_vec.length * fraction, point, normal) + hits.append(hit) + return fraction + + world.RayCast(_RayCastAll(ignore_body, translation), origin, origin + translation) + return hits + + +def _aabb_for_circle(center: b2Vec2, radius: float) -> b2AABB: + lower = b2Vec2(center.x - radius, center.y - radius) + upper = b2Vec2(center.x + radius, center.y + radius) + return b2AABB(lowerBound=lower, upperBound=upper) + + +def _aabb_for_box(center: b2Vec2, half_w: float, half_h: float, angle: float) -> b2AABB: + # Conservative AABB for rotated box + import math + + cos_a = abs(math.cos(angle)) + sin_a = abs(math.sin(angle)) + extent_x = half_w * cos_a + half_h * sin_a + extent_y = half_w * sin_a + half_h * cos_a + lower = b2Vec2(center.x - extent_x, center.y - extent_y) + upper = b2Vec2(center.x + extent_x, center.y + extent_y) + return b2AABB(lowerBound=lower, upperBound=upper) + + +def shape_hit(world, ignore_body: Optional[b2Body], shape, transform: b2Transform) -> List[b2Body]: + """Query overlaps for a shape and return hit bodies. + + Args: + world: Box2D world to query. + ignore_body: Optional body to ignore. + shape: Box2D shape to test. + transform: Transform for the shape. + + Returns: + List of bodies overlapping the shape. + """ + aabb = shape.getAABB(transform, 0) + hits: List[b2Body] = [] + + class _QueryCallback(b2QueryCallback): + def __init__(self, ignore: Optional[b2Body]) -> None: + super().__init__() + self.ignore = ignore + + def ReportFixture(self, fixture): # noqa: N802 + body = fixture.body + if self.ignore is not None and body == self.ignore: + return True + if b2TestOverlap(shape, 0, fixture.shape, 0, transform, fixture.body.transform): + if body not in hits: + hits.append(body) + return True + + world.QueryAABB(_QueryCallback(ignore_body), aabb) + return hits + + +def circle_hit(world, ignore_body: Optional[b2Body], center: b2Vec2, radius: float) -> List[b2Body]: + """Check for circle overlaps in the world. + + Args: + world: Box2D world to query. + ignore_body: Optional body to ignore. + center: Circle center in world units. + radius: Circle radius in world units. + + Returns: + List of bodies overlapping the circle. + """ + shape = b2CircleShape(radius=radius, pos=b2Vec2(0.0, 0.0)) + transform = b2Transform() + transform.position = center + transform.angle = 0.0 + return shape_hit(world, ignore_body, shape, transform) + + +def rectangle_hit(world, ignore_body: Optional[b2Body], center: b2Vec2, size: b2Vec2, rotation: float = 0.0) -> List[b2Body]: + """Check for rectangle overlaps in the world. + + Args: + world: Box2D world to query. + ignore_body: Optional body to ignore. + center: Rectangle center in world units. + size: Rectangle size in world units. + rotation: Rotation in radians. + + Returns: + List of bodies overlapping the rectangle. + """ + half_w = size.x / 2.0 + half_h = size.y / 2.0 + shape = b2PolygonShape(box=(half_w, half_h)) + transform = b2Transform() + transform.position = center + transform.angle = rotation + return shape_hit(world, ignore_body, shape, transform) diff --git a/py/main.py b/py/main.py new file mode 100644 index 0000000..c510bb2 --- /dev/null +++ b/py/main.py @@ -0,0 +1,39 @@ +import pyray as rl + +from engine.framework import Game +from engine.prefabs.managers import FontManager, WindowManager +from samples.collecting_game import CollectingScene +from samples.fighting_game import FightingScene +from samples.zombie_game import ZombieScene +from samples.title_screen import TitleScreen + + +game = Game() + + +def update() -> None: + delta_time = rl.get_frame_time() + game.update(delta_time) + + +def main() -> int: + game.add_manager(WindowManager, 1280, 720, "Game Jam Kit") + font_manager = game.add_manager(FontManager) + game.init() + + font_manager.load_font("Roboto", "assets/fonts/Roboto.ttf", 64) + font_manager.load_font("Tiny5", "assets/fonts/Tiny5.ttf", 64) + font_manager.set_texture_filter("Roboto", 4) + + game.add_scene("title", TitleScreen) + game.add_scene("fighting", FightingScene) + game.add_scene("collecting", CollectingScene) + game.add_scene("zombie", ZombieScene) + + while not rl.window_should_close(): + update() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/py/requirements.txt b/py/requirements.txt new file mode 100644 index 0000000..0c37b71 --- /dev/null +++ b/py/requirements.txt @@ -0,0 +1,2 @@ +raylib +Box2D diff --git a/py/samples/__init__.py b/py/samples/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/py/samples/__init__.py @@ -0,0 +1 @@ + diff --git a/py/samples/__pycache__/__init__.cpython-313.pyc b/py/samples/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..0e6372c Binary files /dev/null and b/py/samples/__pycache__/__init__.cpython-313.pyc differ diff --git a/py/samples/__pycache__/collecting_game.cpython-313.pyc b/py/samples/__pycache__/collecting_game.cpython-313.pyc new file mode 100644 index 0000000..75ffe96 Binary files /dev/null and b/py/samples/__pycache__/collecting_game.cpython-313.pyc differ diff --git a/py/samples/__pycache__/fighting_game.cpython-313.pyc b/py/samples/__pycache__/fighting_game.cpython-313.pyc new file mode 100644 index 0000000..50df3b2 Binary files /dev/null and b/py/samples/__pycache__/fighting_game.cpython-313.pyc differ diff --git a/py/samples/__pycache__/title_screen.cpython-313.pyc b/py/samples/__pycache__/title_screen.cpython-313.pyc new file mode 100644 index 0000000..79bd742 Binary files /dev/null and b/py/samples/__pycache__/title_screen.cpython-313.pyc differ diff --git a/py/samples/__pycache__/zombie_game.cpython-313.pyc b/py/samples/__pycache__/zombie_game.cpython-313.pyc new file mode 100644 index 0000000..2fe831c Binary files /dev/null and b/py/samples/__pycache__/zombie_game.cpython-313.pyc differ diff --git a/py/samples/collecting_game.py b/py/samples/collecting_game.py new file mode 100644 index 0000000..24f3518 --- /dev/null +++ b/py/samples/collecting_game.py @@ -0,0 +1,495 @@ +"""Demonstration of split screen cameras and sensor-based item collection.""" + +from __future__ import annotations + +import math +from typing import List + +from Box2D import b2CircleShape, b2PolygonShape +import pyray as rl + +from engine.framework import GameObject, Scene +from engine.math_extensions import vec_div, vec_mul, vec_normalize, vec_sub, v2 +from engine.prefabs.components import (AnimationController, BodyComponent, MultiComponent, + PlatformerMovementComponent, PlatformerMovementParams, + SoundComponent) +from engine.prefabs.game_objects import CharacterParams, SplitCamera +from engine.prefabs.managers import FontManager, WindowManager +from engine.prefabs.services import LevelService, PhysicsService, SoundService, TextureService + + +class CollectingCharacter(GameObject): + """Basic collecting character. + + Shows how to build a physics body, route input into a movement +component, and drive animations/sounds from gameplay events.""" + def __init__(self, params: CharacterParams, player_number: int = 1) -> None: + """Create a player-controlled collector. + + Args: + params: Character sizing and physics parameters. + player_number: 1-based index used to map input/skins. + + Returns: + None + """ + super().__init__() + self.p = params + self.player_number = player_number + self.gamepad = player_number - 1 + self.width = params.width + self.height = params.height + self.physics: PhysicsService = None # type: ignore[assignment] + self.level: LevelService = None # type: ignore[assignment] + self.body: BodyComponent = None # type: ignore[assignment] + self.movement: PlatformerMovementComponent = None # type: ignore[assignment] + self.animation: AnimationController = None # type: ignore[assignment] + self.sounds: MultiComponent = None # type: ignore[assignment] + self.jump_sound: SoundComponent = None # type: ignore[assignment] + self.die_sound: SoundComponent = None # type: ignore[assignment] + self.score = 0 + + def init(self) -> None: + """Initialize physics, movement, sounds, and animations. + + Services are resolved here (not during update) so missing services are + discovered early and per-frame overhead is avoided. + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + + def build_body(component: BodyComponent): + """Build body. + + Args: + component: Parameter. + + Returns: + Result of the operation. + """ + world = self.physics.world + body = world.CreateDynamicBody(position=(self.physics.convert_to_meters(self.p.position).x, + self.physics.convert_to_meters(self.p.position).y), + fixedRotation=True, + bullet=True) + body.userData = self + shape = b2PolygonShape(box=(self.physics.convert_length_to_meters(self.p.width / 2.0), + self.physics.convert_length_to_meters(self.p.height / 2.0))) + body.CreateFixture(shape=shape, density=self.p.density, friction=self.p.friction, + restitution=self.p.restitution) + component.body = body + + self.body = self.add_component(BodyComponent(build=build_body)) + + movement_params = PlatformerMovementParams() + movement_params.width = self.p.width + movement_params.height = self.p.height + self.movement = self.add_component(PlatformerMovementComponent(movement_params)) + + self.level = self.scene.get_service(LevelService) + + self.sounds = self.add_component(MultiComponent()) + self.jump_sound = self.sounds.add_component("jump", SoundComponent, "assets/sounds/jump.wav") + self.die_sound = self.sounds.add_component("die", SoundComponent, "assets/sounds/die.wav") + + self.animation = self.add_component(AnimationController(self.body)) + if self.player_number == 1: + self.animation.add_animation_from_files("run", + ["assets/pixel_platformer/characters/green_1.png", + "assets/pixel_platformer/characters/green_2.png"], + 10.0) + elif self.player_number == 2: + self.animation.add_animation_from_files("run", + ["assets/pixel_platformer/characters/blue_1.png", + "assets/pixel_platformer/characters/blue_2.png"], + 10.0) + elif self.player_number == 3: + self.animation.add_animation_from_files("run", + ["assets/pixel_platformer/characters/pink_1.png", + "assets/pixel_platformer/characters/pink_2.png"], + 10.0) + elif self.player_number == 4: + self.animation.add_animation_from_files("run", + ["assets/pixel_platformer/characters/yellow_1.png", + "assets/pixel_platformer/characters/yellow_2.png"], + 10.0) + + def update(self, delta_time: float) -> None: + """Handle input and drive movement/animation. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + deadzone = 0.1 + jump_pressed = rl.is_key_pressed(rl.KEY_W) or rl.is_gamepad_button_pressed(self.gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_DOWN) + jump_held = rl.is_key_down(rl.KEY_W) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_DOWN) + + move_x = rl.get_gamepad_axis_movement(self.gamepad, rl.GAMEPAD_AXIS_LEFT_X) + if abs(move_x) < deadzone: + move_x = 0.0 + if rl.is_key_down(rl.KEY_D) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_RIGHT): + move_x = 1.0 + elif rl.is_key_down(rl.KEY_A) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_LEFT): + move_x = -1.0 + + self.movement.set_input(move_x, jump_pressed, jump_held) + if self.movement.grounded and jump_pressed: + self.jump_sound.play() + + if abs(self.movement.move_x) > 0.1: + self.animation.play("run") + self.animation.flip_x = self.movement.move_x > 0.0 + else: + self.animation.pause() + + def die(self) -> None: + """Respawn the character at the start position. + + Returns: + None + """ + self.body.set_position(self.p.position) + self.body.set_velocity(v2(0.0, 0.0)) + self.die_sound.play() + + +class EnemyType: + Bat = 0 + DrillHead = 1 + BlockHead = 2 + + +class Enemy(GameObject): + """Enemy that patrols between two points using a kinematic body.""" + def __init__(self, enemy_type: int, start: rl.Vector2, end: rl.Vector2) -> None: + """Configure the patrol endpoints and enemy type. + + Args: + enemy_type: EnemyType constant selecting animation and behavior. + start: Starting world position in pixels. + end: Ending world position in pixels. + + Returns: + None + """ + super().__init__() + self.start = start + self.end = end + self.type = enemy_type + self.physics: PhysicsService = None # type: ignore[assignment] + self.body: BodyComponent = None # type: ignore[assignment] + self.animation: AnimationController = None # type: ignore[assignment] + self.radius = 12.0 + + def init_object(self) -> None: + """Create a sensor body, setup animation, and start movement. + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + + def build_body(component: BodyComponent): + """Build body. + + Args: + component: Parameter. + + Returns: + Result of the operation. + """ + world = self.physics.world + body = world.CreateKinematicBody(position=(self.physics.convert_to_meters(self.start).x, + self.physics.convert_to_meters(self.start).y)) + body.userData = self + shape = b2CircleShape(radius=self.physics.convert_length_to_meters(self.radius)) + body.CreateFixture(shape=shape, density=1.0, isSensor=True) + component.body = body + + self.body = self.add_component(BodyComponent(build=build_body)) + + self.animation = self.add_component(AnimationController(self.body)) + if self.type == EnemyType.Bat: + self.animation.add_animation_from_files("move", + ["assets/pixel_platformer/enemies/bat_1.png", + "assets/pixel_platformer/enemies/bat_2.png", + "assets/pixel_platformer/enemies/bat_3.png"], + 5.0) + elif self.type == EnemyType.DrillHead: + self.animation.add_animation_from_files("move", + ["assets/pixel_platformer/enemies/drill_head_1.png", + "assets/pixel_platformer/enemies/drill_head_2.png"], + 5.0) + elif self.type == EnemyType.BlockHead: + self.animation.add_animation_from_files("move", + ["assets/pixel_platformer/enemies/block_head_1.png", + "assets/pixel_platformer/enemies/block_head_2.png"], + 5.0) + self.animation.play("move") + + super().init_object() + + to_end = vec_normalize(vec_sub(self.end, self.body.get_position_pixels())) + self.body.set_velocity(vec_mul(to_end, 50.0)) + + def update(self, delta_time: float) -> None: + """Move between endpoints and detect sensor hits on players. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + pos = self.body.get_position_pixels() + if math.dist((self.end.x, self.end.y), (pos.x, pos.y)) <= self.radius * 2.0: + to_start = vec_normalize(vec_sub(self.start, pos)) + self.body.set_velocity(vec_mul(to_start, 50.0)) + elif math.dist((self.start.x, self.start.y), (pos.x, pos.y)) <= self.radius * 2.0: + to_end = vec_normalize(vec_sub(self.end, pos)) + self.body.set_velocity(vec_mul(to_end, 50.0)) + + for contact_body in self.body.get_sensor_overlaps(): + user_data = contact_body.userData + if user_data and user_data.has_tag("character"): + user_data.die() + + velocity = self.body.get_velocity_pixels() + self.animation.flip_x = velocity.x > 0.0 + + +class Coin(GameObject): + """Collectible coin using a sensor body.""" + def __init__(self, position: rl.Vector2) -> None: + """Store the coin spawn position. + + Args: + position: World position in pixels. + + Returns: + None + """ + super().__init__() + self.position = position + self.physics: PhysicsService = None # type: ignore[assignment] + self.body: BodyComponent = None # type: ignore[assignment] + self.animation: AnimationController = None # type: ignore[assignment] + self.collect_sound: SoundComponent = None # type: ignore[assignment] + + def init(self) -> None: + """Create the sensor body, animation, and pickup sound. + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + + def build_body(component: BodyComponent): + """Build body. + + Args: + component: Parameter. + + Returns: + Result of the operation. + """ + world = self.physics.world + body = world.CreateStaticBody(position=(self.physics.convert_to_meters(self.position).x, + self.physics.convert_to_meters(self.position).y)) + body.userData = self + shape = b2CircleShape(radius=self.physics.convert_length_to_meters(8.0)) + body.CreateFixture(shape=shape, density=1.0, isSensor=True) + component.body = body + + self.body = self.add_component(BodyComponent(build=build_body)) + self.animation = self.add_component(AnimationController(self.body)) + self.animation.add_animation_from_files("spin", + ["assets/pixel_platformer/items/coin_1.png", + "assets/pixel_platformer/items/coin_2.png"], + 5.0) + self.animation.play("spin") + self.collect_sound = self.add_component(SoundComponent("assets/sounds/coin.wav")) + + def update(self, delta_time: float) -> None: + """Check sensor overlaps and award score on pickup. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + for contact_body in self.body.get_sensor_overlaps(): + user_data = contact_body.userData + if user_data and user_data.has_tag("character"): + self.collect_sound.play() + self.is_active = False + self.body.disable() + user_data.score += 1 + break + + +class CollectingScene(Scene): + """Scene demonstrating split-screen cameras and collectible items.""" + def __init__(self) -> None: + """Set up scene containers and cached services. + + Returns: + None + """ + super().__init__() + self.window_manager: WindowManager = None # type: ignore[assignment] + self.font_manager: FontManager = None # type: ignore[assignment] + self.characters: List[CollectingCharacter] = [] + self.level: LevelService = None # type: ignore[assignment] + self.physics: PhysicsService = None # type: ignore[assignment] + self.cameras: List[SplitCamera] = [] + self.screen_size = v2(0.0, 0.0) + self.scale = 2.5 + + def init_services(self) -> None: + """Register services required by the scene. + + Returns: + None + """ + self.add_service(TextureService) + self.add_service(SoundService) + self.physics = self.add_service(PhysicsService) + collision_names = ["walls", "clouds", "trees"] + self.level = self.add_service(LevelService, "assets/levels/collecting.ldtk", "Level", collision_names) + + def init(self) -> None: + """Create characters, enemies, coins, and cameras. + + Returns: + None + """ + self.window_manager = self.game.get_manager(WindowManager) + self.font_manager = self.game.get_manager(FontManager) + + entities_layer = self.level.get_layer_by_name("Entities") + player_entities = self.level.get_entities_by_name("Start") + for i, player_entity in enumerate(player_entities[:4]): + params = CharacterParams() + params.position = self.level.convert_to_pixels(player_entity.getPosition()) + params.width = 16 + params.height = 24 + character = self.add_game_object(CollectingCharacter(params, i + 1)) + character.add_tag("character") + self.characters.append(character) + + for bat_entity in self.level.get_entities_by_name("Bat"): + start_pos = self.level.convert_to_pixels(bat_entity.getPosition()) + end_point = bat_entity.getField("end") + end_pos = self.level.convert_cells_to_pixels(end_point, entities_layer) + enemy = self.add_game_object(Enemy(EnemyType.Bat, start_pos, end_pos)) + enemy.add_tag("enemy") + + for drill_entity in self.level.get_entities_by_name("DrillHead"): + start_pos = self.level.convert_to_pixels(drill_entity.getPosition()) + end_point = drill_entity.getField("end") + end_pos = self.level.convert_cells_to_pixels(end_point, entities_layer) + enemy = self.add_game_object(Enemy(EnemyType.DrillHead, start_pos, end_pos)) + enemy.add_tag("enemy") + + for block_entity in self.level.get_entities_by_name("BlockHead"): + start_pos = self.level.convert_to_pixels(block_entity.getPosition()) + end_point = block_entity.getField("end") + end_pos = self.level.convert_cells_to_pixels(end_point, entities_layer) + enemy = self.add_game_object(Enemy(EnemyType.BlockHead, start_pos, end_pos)) + enemy.add_tag("enemy") + + for coin_entity in self.level.get_entities_by_name("Coin"): + coin_pos = self.level.convert_to_pixels(coin_entity.getPosition()) + coin = self.add_game_object(Coin(coin_pos)) + coin.add_tag("coin") + + self.screen_size = v2(self.window_manager.get_width(), self.window_manager.get_height()) + for _ in self.characters: + cam = self.add_game_object(SplitCamera(vec_div(self.screen_size, self.scale), self.level.get_size())) + self.cameras.append(cam) + + def update(self, delta_time: float) -> None: + """Update camera targets and handle window resizing. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + for idx, camera in enumerate(self.cameras): + camera.target = self.characters[idx].body.get_position_pixels() + + new_screen_size = v2(float(rl.get_screen_width()), float(rl.get_screen_height())) + if new_screen_size.x != self.screen_size.x or new_screen_size.y != self.screen_size.y: + self.screen_size = new_screen_size + screen_scale = self.window_manager.get_width() / self.screen_size.x + for camera in self.cameras: + camera.size = vec_mul(vec_div(self.screen_size, self.scale), screen_scale) + camera.camera.offset = v2(camera.size.x / 2.0, camera.size.y / 2.0) + if camera.renderer: + rl.unload_render_texture(camera.renderer) + camera.renderer = rl.load_render_texture(int(camera.size.x), int(camera.size.y)) + + # Trigger scene change on Enter key or gamepad start button. + if rl.is_key_pressed(rl.KEY_ENTER) or rl.is_gamepad_button_pressed(0, rl.GAMEPAD_BUTTON_MIDDLE_RIGHT): + self.game.go_to_scene_next() + + def draw_scene(self) -> None: + """Render the scene once per camera and composite the split view. + + Returns: + None + """ + for camera in self.cameras: + camera.draw_begin() + super().draw_scene() + camera.draw_end() + + rl.clear_background(rl.MAGENTA) + for i, camera in enumerate(self.cameras): + if i == 0: + camera.draw_texture_pro(0, 0, self.screen_size.x / 2.0, self.screen_size.y / 2.0) + rl.draw_text_ex(self.font_manager.get_font("Tiny5"), + f"Score: {self.characters[0].score}", + v2(20.0, 20.0), + 40.0, + 2.0, + rl.BLACK) + elif i == 1: + camera.draw_texture_pro(self.screen_size.x / 2.0, 0, self.screen_size.x / 2.0, self.screen_size.y / 2.0) + rl.draw_text_ex(self.font_manager.get_font("Tiny5"), + f"Score: {self.characters[1].score}", + v2(self.screen_size.x / 2.0 + 20.0, 20.0), + 40.0, + 2.0, + rl.BLACK) + elif i == 2: + camera.draw_texture_pro(0, self.screen_size.y / 2.0, self.screen_size.x / 2.0, self.screen_size.y / 2.0) + rl.draw_text_ex(self.font_manager.get_font("Tiny5"), + f"Score: {self.characters[2].score}", + v2(20.0, self.screen_size.y / 2.0 + 20.0), + 40.0, + 2.0, + rl.BLACK) + elif i == 3: + camera.draw_texture_pro(self.screen_size.x / 2.0, + self.screen_size.y / 2.0, + self.screen_size.x / 2.0, + self.screen_size.y / 2.0) + rl.draw_text_ex(self.font_manager.get_font("Tiny5"), + f"Score: {self.characters[3].score}", + v2(self.screen_size.x / 2.0 + 20.0, self.screen_size.y / 2.0 + 20.0), + 40.0, + 2.0, + rl.BLACK) + + rl.draw_line_ex(v2(self.screen_size.x / 2.0, 0), v2(self.screen_size.x / 2.0, self.screen_size.y), 4.0, rl.Color(130, 130, 130, 255)) + rl.draw_line_ex(v2(0, self.screen_size.y / 2.0), v2(self.screen_size.x, self.screen_size.y / 2.0), 4.0, rl.Color(130, 130, 130, 255)) diff --git a/py/samples/fighting_game.py b/py/samples/fighting_game.py new file mode 100644 index 0000000..cda1d19 --- /dev/null +++ b/py/samples/fighting_game.py @@ -0,0 +1,452 @@ +"""Demonstration of a shared camera and basic fighting mechanics. + +Shows LDtk level setup, one-way platforms, and simple combat interactions.""" + +from __future__ import annotations + +import math +from typing import List + +from Box2D import b2ContactListener, b2PolygonShape, b2Vec2 +import pyray as rl + +from engine.framework import GameObject, Scene +from engine.math_extensions import vec_add, vec_div, vec_mul, vec_sub, v2 +from engine.prefabs.components import (AnimationController, BodyComponent, MultiComponent, + PlatformerMovementComponent, PlatformerMovementParams, + SoundComponent) +from engine.prefabs.game_objects import CameraObject, CharacterParams, StaticBox +from engine.prefabs.services import LevelService, PhysicsService, SoundService, TextureService + + +class FightingCharacter(GameObject): + """Basic fighting character with attacks and one-way platform logic.""" + def __init__(self, params: CharacterParams, player_number: int = 1) -> None: + """Create a player-controlled fighter. + + Args: + params: Character sizing and physics parameters. + player_number: 1-based index used to map input/skins. + + Returns: + None + """ + super().__init__() + self.p = params + self.player_number = player_number + self.gamepad = player_number - 1 + self.width = params.width + self.height = params.height + self.physics: PhysicsService = None # type: ignore[assignment] + self.level: LevelService = None # type: ignore[assignment] + self.body: BodyComponent = None # type: ignore[assignment] + self.movement: PlatformerMovementComponent = None # type: ignore[assignment] + self.animation: AnimationController = None # type: ignore[assignment] + self.sounds: MultiComponent = None # type: ignore[assignment] + self.jump_sound: SoundComponent = None # type: ignore[assignment] + self.hit_sound: SoundComponent = None # type: ignore[assignment] + self.die_sound: SoundComponent = None # type: ignore[assignment] + self.fall_through = False + self.fall_through_timer = 0.0 + self.fall_through_duration = 0.2 + self.attack_display_timer = 0.0 + self.attack_display_duration = 0.1 + self.attack = False + + def init(self) -> None: + """Initialize body, movement, sounds, and animations. + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + + def build_body(component: BodyComponent): + """Build body. + + Args: + component: Parameter. + + Returns: + Result of the operation. + """ + world = self.physics.world + body = world.CreateDynamicBody(position=(self.physics.convert_to_meters(self.p.position).x, + self.physics.convert_to_meters(self.p.position).y), + fixedRotation=True, + bullet=True) + shape = b2PolygonShape(box=(self.physics.convert_length_to_meters(self.p.width / 2.0), + self.physics.convert_length_to_meters(self.p.height / 2.0))) + body.CreateFixture(shape=shape, density=self.p.density, friction=self.p.friction, + restitution=self.p.restitution) + component.body = body + + self.body = self.add_component(BodyComponent(build=build_body)) + + movement_params = PlatformerMovementParams() + movement_params.width = self.p.width + movement_params.height = self.p.height + self.movement = self.add_component(PlatformerMovementComponent(movement_params)) + + self.level = self.scene.get_service(LevelService) + + self.sounds = self.add_component(MultiComponent()) + self.jump_sound = self.sounds.add_component("jump", SoundComponent, "assets/sounds/jump.wav") + self.hit_sound = self.sounds.add_component("hit", SoundComponent, "assets/sounds/hit.wav") + self.die_sound = self.sounds.add_component("die", SoundComponent, "assets/sounds/die.wav") + + self.animation = self.add_component(AnimationController(self.body)) + if self.player_number == 1: + self.animation.add_animation_from_files("run", + ["assets/sunnyland/fox/run-1.png", + "assets/sunnyland/fox/run-2.png", + "assets/sunnyland/fox/run-3.png", + "assets/sunnyland/fox/run-4.png", + "assets/sunnyland/fox/run-5.png", + "assets/sunnyland/fox/run-6.png"], + 10.0) + self.animation.add_animation_from_files("idle", + ["assets/sunnyland/fox/idle-1.png", + "assets/sunnyland/fox/idle-2.png", + "assets/sunnyland/fox/idle-3.png", + "assets/sunnyland/fox/idle-4.png"], + 5.0) + self.animation.add_animation_from_files("jump", ["assets/sunnyland/fox/jump-1.png"], 0.0) + self.animation.add_animation_from_files("fall", ["assets/sunnyland/fox/jump-2.png"], 0.0) + self.animation.origin.y += 4 + elif self.player_number == 2: + self.animation.add_animation_from_files("run", + ["assets/sunnyland/bunny/run-1.png", + "assets/sunnyland/bunny/run-2.png", + "assets/sunnyland/bunny/run-3.png", + "assets/sunnyland/bunny/run-4.png", + "assets/sunnyland/bunny/run-5.png", + "assets/sunnyland/bunny/run-6.png"], + 10.0) + self.animation.add_animation_from_files("idle", + ["assets/sunnyland/bunny/idle-1.png", + "assets/sunnyland/bunny/idle-2.png", + "assets/sunnyland/bunny/idle-3.png", + "assets/sunnyland/bunny/idle-4.png"], + 10.0) + self.animation.add_animation_from_files("jump", ["assets/sunnyland/bunny/jump-1.png"], 0.0) + self.animation.add_animation_from_files("fall", ["assets/sunnyland/bunny/jump-2.png"], 0.0) + self.animation.origin.y += 8 + elif self.player_number == 3: + self.animation.add_animation_from_files("run", + ["assets/sunnyland/squirrel/run-1.png", + "assets/sunnyland/squirrel/run-2.png", + "assets/sunnyland/squirrel/run-3.png", + "assets/sunnyland/squirrel/run-4.png", + "assets/sunnyland/squirrel/run-5.png", + "assets/sunnyland/squirrel/run-6.png"], + 10.0) + self.animation.add_animation_from_files("idle", + ["assets/sunnyland/squirrel/idle-1.png", + "assets/sunnyland/squirrel/idle-2.png", + "assets/sunnyland/squirrel/idle-3.png", + "assets/sunnyland/squirrel/idle-4.png", + "assets/sunnyland/squirrel/idle-5.png", + "assets/sunnyland/squirrel/idle-6.png", + "assets/sunnyland/squirrel/idle-7.png", + "assets/sunnyland/squirrel/idle-8.png"], + 8.0) + self.animation.add_animation_from_files("jump", + ["assets/sunnyland/squirrel/jump-1.png", + "assets/sunnyland/squirrel/jump-2.png", + "assets/sunnyland/squirrel/jump-3.png", + "assets/sunnyland/squirrel/jump-4.png"], + 15.0) + self.animation.origin.y += 7 + elif self.player_number == 4: + self.animation.add_animation_from_files("run", + ["assets/sunnyland/imp/run-1.png", + "assets/sunnyland/imp/run-2.png", + "assets/sunnyland/imp/run-3.png", + "assets/sunnyland/imp/run-4.png", + "assets/sunnyland/imp/run-5.png", + "assets/sunnyland/imp/run-6.png", + "assets/sunnyland/imp/run-7.png", + "assets/sunnyland/imp/run-8.png"], + 10.0) + self.animation.add_animation_from_files("idle", + ["assets/sunnyland/imp/idle-1.png", + "assets/sunnyland/imp/idle-2.png", + "assets/sunnyland/imp/idle-3.png", + "assets/sunnyland/imp/idle-4.png"], + 10.0) + self.animation.add_animation_from_files("jump", ["assets/sunnyland/imp/jump-1.png"], 0.0) + self.animation.add_animation_from_files("fall", ["assets/sunnyland/imp/jump-4.png"], 0.0) + self.animation.origin.y += 10 + + def update(self, delta_time: float) -> None: + """Handle input, jumping, attacks, and respawn logic. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + deadzone = 0.1 + jump_pressed = rl.is_key_pressed(rl.KEY_W) or rl.is_gamepad_button_pressed(self.gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_DOWN) + jump_held = rl.is_key_down(rl.KEY_W) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_DOWN) + + move_x = rl.get_gamepad_axis_movement(self.gamepad, rl.GAMEPAD_AXIS_LEFT_X) + if abs(move_x) < deadzone: + move_x = 0.0 + if rl.is_key_down(rl.KEY_D) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_RIGHT): + move_x = 1.0 + elif rl.is_key_down(rl.KEY_A) or rl.is_gamepad_button_down(self.gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_LEFT): + move_x = -1.0 + + self.movement.set_input(move_x, jump_pressed, jump_held) + + if self.movement.grounded and jump_pressed: + self.jump_sound.play() + + if abs(self.movement.move_x) > 0.1: + self.animation.play("run") + self.animation.flip_x = self.movement.move_x < 0.0 + else: + self.animation.play("idle") + + if not self.movement.grounded: + if self.player_number != 3: + if self.body.get_velocity_meters().y < 0.0: + self.animation.play("jump") + else: + self.animation.play("fall") + else: + self.animation.play("jump") + + move_y = rl.get_gamepad_axis_movement(self.gamepad, rl.GAMEPAD_AXIS_LEFT_Y) + if rl.is_key_pressed(rl.KEY_S) or rl.is_gamepad_button_pressed(self.gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_DOWN) or move_y > 0.5: + self.fall_through = True + self.fall_through_timer = self.fall_through_duration + + if self.fall_through_timer > 0.0: + self.fall_through_timer = max(0.0, self.fall_through_timer - delta_time) + if self.fall_through_timer == 0.0: + self.fall_through = False + + if rl.is_key_pressed(rl.KEY_SPACE) or rl.is_gamepad_button_pressed(self.gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_RIGHT): + self.attack = True + self.attack_display_timer = self.attack_display_duration + position = self.body.get_position_pixels() + position.x += (self.width / 2.0 + 8.0) * (-1.0 if self.animation.flip_x else 1.0) + bodies = self.physics.circle_overlap(position, 8.0, self.body.body) + for other_body in bodies: + if other_body == self.body.body: + continue + impulse = b2Vec2(-10.0 if self.animation.flip_x else 10.0, -10.0) + other_body.ApplyLinearImpulse(impulse=impulse, point=other_body.worldCenter, wake=True) + self.hit_sound.play() + + if self.attack_display_timer > 0.0: + self.attack_display_timer = max(0.0, self.attack_display_timer - delta_time) + if self.attack_display_timer == 0.0: + self.attack = False + + if self.body.get_position_pixels().y > self.level.get_size().y + 200.0: + self.body.set_position(self.p.position) + self.body.set_velocity(v2(0.0, 0.0)) + self.die_sound.play() + + def draw(self) -> None: + """Draw attack indicator (animations are drawn by controller). + + Returns: + None + """ + if self.attack: + position = self.body.get_position_pixels() + position.x += (self.width / 2.0 + 8.0) * (-1.0 if self.animation.flip_x else 1.0) + rl.draw_circle_v(position, 8.0, rl.Color(230, 41, 55, 128)) + + def pre_solve(self, body_a, body_b, contact, platforms: List[StaticBox]) -> bool: + """Custom pre-solve for one-way platforms. + + Args: + body_a: First body in the contact. + body_b: Second body in the contact. + contact: Box2D contact instance. + platforms: List of one-way platform StaticBox objects. + + Returns: + True to enable contact, False to disable it. + """ + normal = contact.worldManifold.normal + other = None + sign = 0.0 + if body_a == self.body.body: + sign = 1.0 + other = body_b + elif body_b == self.body.body: + sign = -1.0 + other = body_a + if sign * normal.y < 0.5: + return False + if self.fall_through: + for platform in platforms: + if other == platform.body: + return False + return True + + +class FightingContactListener(b2ContactListener): + """Routes Box2D PreSolve callbacks to the owning character.""" + def __init__(self, scene: "FightingScene") -> None: + """Capture the scene so contacts can be filtered. + + Args: + scene: Scene containing fighters and one-way platforms. + + Returns: + None + """ + super().__init__() + self.scene = scene + + def PreSolve(self, contact, old_manifold): + """Dispatch pre-solve handling to the matching character. + + Args: + contact: Box2D contact. + old_manifold: Previous contact manifold. + + Returns: + None + """ + body_a = contact.fixtureA.body + body_b = contact.fixtureB.body + for character in self.scene.characters: + if body_a == character.body.body or body_b == character.body.body: + enabled = character.pre_solve(body_a, body_b, contact, self.scene.platforms) + contact.enabled = enabled + return + + +class FightingScene(Scene): + """Scene demonstrating shared camera and arena combat.""" + def __init__(self) -> None: + """Initialize scene storage for platforms, fighters, and services. + + Returns: + None + """ + super().__init__() + self.platforms: List[StaticBox] = [] + self.characters: List[FightingCharacter] = [] + self.level: LevelService = None # type: ignore[assignment] + self.physics: PhysicsService = None # type: ignore[assignment] + self.camera: CameraObject = None # type: ignore[assignment] + self.renderer = None + self.render_rect = None + + def init_services(self) -> None: + """Register services required by the scene. + + Returns: + None + """ + self.add_service(TextureService) + self.add_service(SoundService) + self.physics = self.add_service(PhysicsService) + collision_names = ["walls"] + self.level = self.add_service(LevelService, "assets/levels/fighting.ldtk", "Stage", collision_names) + + def init(self) -> None: + """Create platforms, players, camera, and render target. + + Returns: + None + """ + platform_entities = self.level.get_entities_by_name("One_way_platform") + for platform_entity in platform_entities: + position = self.level.convert_to_pixels(platform_entity.getPosition()) + size = self.level.convert_to_pixels(platform_entity.getSize()) + platform = self.add_game_object(StaticBox.from_vectors(vec_add(position, vec_div(size, 2.0)), size)) + platform.is_visible = False + platform.add_tag("platform") + self.platforms.append(platform) + + if self.physics.world: + self.physics.world.contactListener = FightingContactListener(self) + + player_entities = self.level.get_entities_by_name("Start") + for i, player_entity in enumerate(player_entities[:4]): + params = CharacterParams() + params.position = self.level.convert_to_pixels(player_entity.getPosition()) + params.width = 16 + params.height = 24 + character = self.add_game_object(FightingCharacter(params, i + 1)) + character.add_tag("character") + self.characters.append(character) + + self.camera = self.add_game_object(CameraObject(self.level.get_size(), v2(0.0, 0.0), v2(300.0, 300.0), 0.0, 0.0, 0.0, 0.0)) + self.camera.target = vec_div(self.level.get_size(), 2.0) + + self.level.set_layer_visibility("Background", False) + self.renderer = rl.load_render_texture(int(self.level.get_size().x), int(self.level.get_size().y)) + + def update(self, delta_time: float) -> None: + """Update camera framing and compute render placement. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + avg_position = v2(0.0, 0.0) + min_point = v2(float("inf"), float("inf")) + max_point = v2(float("-inf"), float("-inf")) + for character in self.characters: + char_pos = character.body.get_position_pixels() + avg_position = vec_add(avg_position, char_pos) + min_point.x = min(min_point.x, char_pos.x) + min_point.y = min(min_point.y, char_pos.y) + max_point.x = max(max_point.x, char_pos.x) + max_point.y = max(max_point.y, char_pos.y) + avg_position = vec_div(avg_position, float(len(self.characters))) + self.camera.target = avg_position + self.camera.target.x = math.floor(self.camera.target.x) + self.camera.target.y = math.floor(self.camera.target.y) + + distance = math.sqrt((max_point.x - min_point.x) ** 2 + (max_point.y - min_point.y) ** 2) + level_diag = math.sqrt(self.level.get_size().x ** 2 + self.level.get_size().y ** 2) + zoom = level_diag / (distance + 400.0) + zoom = max(0.5, min(2.0, zoom)) + self.camera.camera.zoom += (zoom - self.camera.camera.zoom) * min(1.0, delta_time * 5.0) + + aspect_ratio = self.level.get_size().x / self.level.get_size().y + render_scale = rl.get_screen_height() / self.level.get_size().y + render_size = v2(self.level.get_size().y * render_scale * aspect_ratio, self.level.get_size().y * render_scale) + pos = vec_div(vec_sub(v2(float(rl.get_screen_width()), float(rl.get_screen_height())), render_size), 2.0) + self.render_rect = rl.Rectangle(pos.x, pos.y, render_size.x, render_size.y) + + # Trigger scene change on Enter key or gamepad start button. + if rl.is_key_pressed(rl.KEY_ENTER) or rl.is_gamepad_button_pressed(0, rl.GAMEPAD_BUTTON_MIDDLE_RIGHT): + self.game.go_to_scene_next() + + def draw_scene(self) -> None: + """Render the world to a texture and draw it centered. + + Returns: + None + """ + rl.begin_texture_mode(self.renderer) + rl.clear_background(rl.MAGENTA) + self.level.draw_layer("Background") + self.camera.draw_begin() + super().draw_scene() + self.camera.draw_end() + rl.end_texture_mode() + + rl.draw_texture_pro(self.renderer.texture, + rl.Rectangle(0.0, 0.0, float(self.renderer.texture.width), -float(self.renderer.texture.height)), + self.render_rect, + v2(0.0, 0.0), + 0.0, + rl.Color(255, 255, 255, 255)) diff --git a/py/samples/title_screen.py b/py/samples/title_screen.py new file mode 100644 index 0000000..4ab5c6b --- /dev/null +++ b/py/samples/title_screen.py @@ -0,0 +1,47 @@ +import pyray as rl + +from engine.math_extensions import v2 +from engine.framework import Scene +from engine.prefabs.includes import FontManager + + +class TitleScreen(Scene): + def __init__(self): + super().__init__() + self.font = None + self.title = "Game Jam Kit" + + def init(self): + font_manager = self.game.get_manager(FontManager) + self.font = font_manager.get_font("Roboto") + + def update(self, delta_time): + # Trigger scene change on Enter key or gamepad start button. + if rl.is_key_pressed(rl.KEY_ENTER) or rl.is_gamepad_button_pressed(0, rl.GAMEPAD_BUTTON_MIDDLE_RIGHT): + self.game.go_to_scene_next() + + def draw(self): + width = rl.get_screen_width() + height = rl.get_screen_height() + title_text_size = rl.measure_text_ex(self.font, self.title, 64, 0) + + subtitle = "Press Start or Enter to Switch Scenes" + subtitle_text_size = rl.measure_text_ex(self.font, subtitle, 32, 0) + + rl.clear_background(rl.SKYBLUE) + rl.draw_text_ex( + self.font, + self.title, + v2((width - title_text_size.x) / 2, (height - title_text_size.y - 100) / 2), + 64, + 1, + rl.WHITE, + ) + rl.draw_text_ex( + self.font, + subtitle, + v2((width - subtitle_text_size.x) / 2, (height - subtitle_text_size.y + 100) / 2), + 32, + 1, + rl.WHITE, + ) diff --git a/py/samples/zombie_game.py b/py/samples/zombie_game.py new file mode 100644 index 0000000..662a6a4 --- /dev/null +++ b/py/samples/zombie_game.py @@ -0,0 +1,467 @@ +"""Demonstration of a top-down shooter with light masking.""" + +from __future__ import annotations + +import math +from typing import List + +from Box2D import b2CircleShape, b2Vec2 +import pyray as rl + +from engine.framework import GameObject, Scene +from engine.math_extensions import vec_add, vec_mul, vec_sub, v2 +from engine.prefabs.components import (BodyComponent, MultiComponent, SoundComponent, + SpriteComponent, TopDownMovementComponent, + TopDownMovementParams) +from engine.prefabs.managers import FontManager +from engine.prefabs.services import LevelService, PhysicsService, SoundService, TextureService + +RLGL_SRC_ALPHA = 0x0302 +RLGL_MIN = 0x8007 + + +class Bullet(GameObject): + """Projectile fired by a player character.""" + def __init__(self) -> None: + """Prepare bullet component references and cached services. + + Returns: + None + """ + super().__init__() + self.physics: PhysicsService = None # type: ignore[assignment] + self.body: BodyComponent = None # type: ignore[assignment] + self.sprite: SpriteComponent = None # type: ignore[assignment] + self.hit_sound: SoundComponent = None # type: ignore[assignment] + self.speed = 800.0 + + def init(self) -> None: + """Create the bullet body, sprite, and hit sound. + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + + def build_body(component: BodyComponent): + """Build body. + + Args: + component: Parameter. + + Returns: + Result of the operation. + """ + world = self.physics.world + body = world.CreateDynamicBody(position=(self.physics.convert_to_meters(v2(-1000.0, -1000.0)).x, + self.physics.convert_to_meters(v2(-1000.0, -1000.0)).y), + bullet=True) + body.userData = self + shape = b2CircleShape(radius=self.physics.convert_length_to_meters(8.0)) + body.CreateFixture(shape=shape, density=0.25, friction=0.0, restitution=0.0) + component.body = body + + self.body = self.add_component(BodyComponent(build=build_body)) + self.sprite = self.add_component(SpriteComponent("assets/zombie_shooter/bullet.png", self.body)) + self.hit_sound = self.add_component(SoundComponent("assets/sounds/hit.wav")) + + def update(self, delta_time: float) -> None: + """Handle collisions and deactivate on impact. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + for contact_body in self.body.get_contacts(): + self.is_active = False + self.body.set_position(v2(-1000.0, -1000.0)) + self.body.set_velocity(v2(0.0, 0.0)) + other = contact_body.userData + if other and other.has_tag("zombie"): + self.hit_sound.play() + other.is_active = False + zombie_body = other.get_component(BodyComponent) + if zombie_body: + zombie_body.set_position(v2(-1000.0, -1000.0)) + zombie_body.set_velocity(v2(0.0, 0.0)) + zombie_body.disable() + zombie_sprite = other.get_component(SpriteComponent) + if zombie_sprite: + zombie_sprite.set_position(v2(-1000.0, -1000.0)) + break + + +class TopDownCharacter(GameObject): + """Top-down character controlled by player input.""" + def __init__(self, position: rl.Vector2, bullets: List["Bullet"], player_num: int) -> None: + """Store spawn data, shared bullet pool, and player index. + + Args: + position: Spawn position in pixels. + bullets: Shared list of Bullet objects to reuse. + player_num: Index used for controls and UI. + + Returns: + None + """ + super().__init__() + self.position = position + self.bullets = bullets + self.player_num = player_num + self.health = 10 + self.contact_timer = 1.0 + self.contact_cooldown = 0.3 + self.body: BodyComponent = None # type: ignore[assignment] + self.physics: PhysicsService = None # type: ignore[assignment] + self.sprite: SpriteComponent = None # type: ignore[assignment] + self.movement: TopDownMovementComponent = None # type: ignore[assignment] + self.sounds: MultiComponent = None # type: ignore[assignment] + self.shoot_sound: SoundComponent = None # type: ignore[assignment] + + def init(self) -> None: + """Create body, movement, sounds, and sprite. + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + + def build_body(component: BodyComponent): + """Build body. + + Args: + component: Parameter. + + Returns: + Result of the operation. + """ + world = self.physics.world + body = world.CreateDynamicBody(position=(self.physics.convert_to_meters(self.position).x, + self.physics.convert_to_meters(self.position).y), + fixedRotation=True) + body.userData = self + shape = b2CircleShape(radius=self.physics.convert_length_to_meters(16.0)) + body.CreateFixture(shape=shape, density=1.0) + component.body = body + + self.body = self.add_component(BodyComponent(build=build_body)) + + params = TopDownMovementParams() + params.accel = 5000.0 + params.friction = 5000.0 + params.max_speed = 350.0 + self.movement = self.add_component(TopDownMovementComponent(params)) + + self.sounds = self.add_component(MultiComponent()) + self.shoot_sound = self.sounds.add_component("shoot", SoundComponent, "assets/sounds/shoot.wav") + + self.sprite = self.add_component(SpriteComponent(f"assets/zombie_shooter/player_{self.player_num + 1}.png")) + + def update(self, delta_time: float) -> None: + """Handle movement, shooting, and damage over time. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + move = v2(0.0, 0.0) + move = v2(rl.get_gamepad_axis_movement(self.player_num, rl.GAMEPAD_AXIS_LEFT_X), + rl.get_gamepad_axis_movement(self.player_num, rl.GAMEPAD_AXIS_LEFT_Y)) + + if rl.is_key_down(rl.KEY_W) or rl.is_gamepad_button_down(self.player_num, rl.GAMEPAD_BUTTON_LEFT_FACE_UP): + move.y -= 1.0 + if rl.is_key_down(rl.KEY_S) or rl.is_gamepad_button_down(self.player_num, rl.GAMEPAD_BUTTON_LEFT_FACE_DOWN): + move.y += 1.0 + if rl.is_key_down(rl.KEY_A) or rl.is_gamepad_button_down(self.player_num, rl.GAMEPAD_BUTTON_LEFT_FACE_LEFT): + move.x -= 1.0 + if rl.is_key_down(rl.KEY_D) or rl.is_gamepad_button_down(self.player_num, rl.GAMEPAD_BUTTON_LEFT_FACE_RIGHT): + move.x += 1.0 + + self.movement.set_input(move.x, move.y) + self.sprite.set_position(self.body.get_position_pixels()) + self.sprite.set_rotation(self.movement.facing_dir) + + if rl.is_key_pressed(rl.KEY_SPACE) or rl.is_gamepad_button_pressed(self.player_num, rl.GAMEPAD_BUTTON_RIGHT_FACE_RIGHT): + for bullet in self.bullets: + if not bullet.is_active: + self.shoot_sound.play() + char_pos = self.body.get_position_pixels() + shoot_dir = v2(math.cos(math.radians(self.movement.facing_dir)), + math.sin(math.radians(self.movement.facing_dir))) + bullet_start = v2(char_pos.x + shoot_dir.x * 48.0, char_pos.y + shoot_dir.y * 48.0) + bullet.body.set_position(bullet_start) + bullet.body.set_rotation(self.movement.facing_dir + 90.0) + bullet.body.set_velocity(v2(shoot_dir.x * bullet.speed, shoot_dir.y * bullet.speed)) + bullet.is_active = True + break + + for contact_body in self.body.get_contacts(): + other = contact_body.userData + if other and other.has_tag("zombie"): + if self.contact_timer > 0.0: + self.contact_timer -= delta_time + if self.contact_timer <= 0.0: + self.health -= 1 + self.contact_timer = self.contact_cooldown + if self.health <= 0: + self.is_active = False + self.body.set_position(v2(-1000.0, -1000.0)) + self.body.set_velocity(v2(0.0, 0.0)) + + +class Zombie(GameObject): + """Enemy that chases the closest player.""" + def __init__(self, players: List[TopDownCharacter]) -> None: + """Store the list of players to chase. + + Args: + players: Player characters to target. + + Returns: + None + """ + super().__init__() + self.players = players + self.body: BodyComponent = None # type: ignore[assignment] + self.physics: PhysicsService = None # type: ignore[assignment] + self.sprite: SpriteComponent = None # type: ignore[assignment] + self.movement: TopDownMovementComponent = None # type: ignore[assignment] + + def init(self) -> None: + """Create body, movement, and sprite (starts inactive). + + Returns: + None + """ + self.physics = self.scene.get_service(PhysicsService) + + def build_body(component: BodyComponent): + """Build body. + + Args: + component: Parameter. + + Returns: + Result of the operation. + """ + world = self.physics.world + body = world.CreateDynamicBody(position=(self.physics.convert_to_meters(v2(-1000.0, -1000.0)).x, + self.physics.convert_to_meters(v2(-1000.0, -1000.0)).y), + fixedRotation=True) + body.userData = self + shape = b2CircleShape(radius=self.physics.convert_length_to_meters(16.0)) + body.CreateFixture(shape=shape, density=1.0) + body.active = False + component.body = body + + self.body = self.add_component(BodyComponent(build=build_body)) + + params = TopDownMovementParams() + params.accel = 5000.0 + params.friction = 5000.0 + params.max_speed = 100.0 + self.movement = self.add_component(TopDownMovementComponent(params)) + + self.sprite = self.add_component(SpriteComponent("assets/zombie_shooter/zombie.png")) + + def update(self, delta_time: float) -> None: + """Move toward the closest player and update sprite. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + closest_pos = v2(0.0, 0.0) + closest_dist_sq = float("inf") + for player in self.players: + player_pos = player.body.get_position_pixels() + to_player = vec_sub(player_pos, self.body.get_position_pixels()) + dist_sq = to_player.x * to_player.x + to_player.y * to_player.y + if dist_sq < closest_dist_sq: + closest_dist_sq = dist_sq + closest_pos = player_pos + to_closest = vec_sub(closest_pos, self.body.get_position_pixels()) + length = math.sqrt(to_closest.x * to_closest.x + to_closest.y * to_closest.y) + if length > 0.0: + to_closest.x /= length + to_closest.y /= length + self.movement.set_input(to_closest.x, to_closest.y) + self.sprite.set_position(self.body.get_position_pixels()) + self.sprite.set_rotation(self.movement.facing_dir) + + +class Spawner(GameObject): + """Spawner that activates zombies from a pool.""" + def __init__(self, position: rl.Vector2, size: rl.Vector2, zombies: List[Zombie]) -> None: + """Configure spawn region and zombie pool. + + Args: + position: Center of the spawn rectangle in pixels. + size: Size of the spawn rectangle in pixels. + zombies: Pool of zombie objects to activate. + + Returns: + None + """ + super().__init__() + self.spawn_timer = 0.0 + self.spawn_interval = 1.0 + self.position = vec_sub(position, vec_mul(size, 0.5)) + self.size = size + self.zombie_pool = zombies + + def update(self, delta_time: float) -> None: + """Spawn zombies at an interval within a rectangle. + + Args: + delta_time: Seconds since last frame. + + Returns: + None + """ + self.spawn_timer -= delta_time + if self.spawn_timer <= 0.0: + self.spawn_timer = self.spawn_interval + x = self.position.x + float(rl.get_random_value(0, int(self.size.x))) + y = self.position.y + float(rl.get_random_value(0, int(self.size.y))) + spawn_pos = v2(x, y) + for zombie in self.zombie_pool: + if not zombie.is_active: + zombie.body.set_position(spawn_pos) + zombie.is_active = True + zombie.body.enable() + return + + +class ZombieScene(Scene): + """Scene for the zombie shooter game.""" + def __init__(self) -> None: + """Initialize scene storage for services, actors, and render targets. + + Returns: + None + """ + super().__init__() + self.font_manager: FontManager = None # type: ignore[assignment] + self.physics: PhysicsService = None # type: ignore[assignment] + self.level: LevelService = None # type: ignore[assignment] + self.renderer: rl.RenderTexture = None # type: ignore[assignment] + self.light_map: rl.RenderTexture = None # type: ignore[assignment] + self.light_texture: rl.Texture2D = None # type: ignore[assignment] + self.bullets: List[Bullet] = [] + self.characters: List[TopDownCharacter] = [] + self.zombies: List[Zombie] = [] + + def init_services(self) -> None: + """Register services required by the scene. + + Returns: + None + """ + self.add_service(TextureService) + self.add_service(SoundService) + self.physics = self.add_service(PhysicsService, b2Vec2(0.0, 0.0)) + collision_names = ["walls", "obstacles"] + self.level = self.add_service(LevelService, "assets/levels/top_down.ldtk", "Level", collision_names) + self.font_manager = self.game.get_manager(FontManager) + + def init(self) -> None: + """Create pools, characters, spawner, and render textures. + + Returns: + None + """ + for _ in range(100): + bullet = self.add_game_object(Bullet()) + bullet.is_active = False + self.bullets.append(bullet) + + player_entities = self.level.get_entities_by_name("Start") + for i, player_entity in enumerate(player_entities[:4]): + position = self.level.convert_to_pixels(player_entity.getPosition()) + character = self.add_game_object(TopDownCharacter(position, self.bullets, i)) + character.add_tag("player") + self.characters.append(character) + + for _ in range(100): + zombie = self.add_game_object(Zombie(self.characters)) + zombie.is_active = False + zombie.add_tag("zombie") + self.zombies.append(zombie) + + spawn_entity = self.level.get_entities_by_name("Spawn")[0] + spawn_position = self.level.convert_to_pixels(spawn_entity.getPosition()) + spawn_size = self.level.convert_to_pixels(spawn_entity.getSize()) + self.add_game_object(Spawner(spawn_position, spawn_size, self.zombies)) + + self.level.set_layer_visibility("Foreground", False) + + self.renderer = rl.load_render_texture(int(self.level.get_size().x), int(self.level.get_size().y)) + self.light_map = rl.load_render_texture(int(self.level.get_size().x), int(self.level.get_size().y)) + self.light_texture = self.get_service(TextureService).get_texture("assets/zombie_shooter/light.png") + + def update(self, delta_time: float) -> None: + # Trigger scene change on Enter key or gamepad start button. + if rl.is_key_pressed(rl.KEY_ENTER) or rl.is_gamepad_button_pressed(0, rl.GAMEPAD_BUTTON_MIDDLE_RIGHT): + self.game.go_to_scene_next() + + def draw_scene(self) -> None: + """Build light mask and render the final frame. + + Returns: + None + """ + + """Draw the scene. + + Returns: + None + """ + rl.begin_texture_mode(self.light_map) + rl.clear_background(rl.BLACK) + rl.rl_set_blend_factors(RLGL_SRC_ALPHA, RLGL_SRC_ALPHA, RLGL_MIN) + rl.rl_set_blend_mode(rl.BLEND_CUSTOM) + + for i in range(min(4, len(self.characters))): + pos = self.characters[i].body.get_position_pixels() + rl.draw_texture(self.light_texture, + int(pos.x - self.light_texture.width / 2), + int(pos.y - self.light_texture.height / 2), + rl.WHITE) + + rl.rl_draw_render_batch_active() + rl.rl_set_blend_mode(rl.BLEND_ALPHA) + rl.end_texture_mode() + + rl.begin_texture_mode(self.renderer) + rl.clear_background(rl.Color(255, 0, 255, 255)) + super().draw_scene() + self.level.draw_layer("Foreground") + rl.draw_texture_pro(self.light_map.texture, + rl.Rectangle(0.0, 0.0, float(self.light_map.texture.width), -float(self.light_map.texture.height)), + rl.Rectangle(0.0, 0.0, float(self.light_map.texture.width), float(self.light_map.texture.height)), + v2(0.0, 0.0), + 0.0, + rl.color_alpha(rl.WHITE, 0.92)) + rl.draw_rectangle(10, 10, 210, 210, rl.color_alpha(rl.WHITE, 0.3)) + health_lines = [f"Health: {char.health}" for char in self.characters[:4]] + rl.draw_text_ex(self.font_manager.get_font("Roboto"), + "\n".join(health_lines), + v2(20.0, 20.0), + 45.0, + 1.0, + rl.Color(230, 41, 55, 255)) + rl.end_texture_mode() + + rl.draw_texture_pro(self.renderer.texture, + rl.Rectangle(0.0, 0.0, float(self.renderer.texture.width), -float(self.renderer.texture.height)), + rl.Rectangle(0.0, 0.0, float(rl.get_screen_width()), float(rl.get_screen_height())), + v2(0.0, 0.0), + 0.0, + rl.WHITE)