#include // must include this here (or else IDE can't find it) #include // I need to include this just for 1 fucking arcTan and probably 200 clocks of wasted CPU time //#include // PDQ: Core graphics library //#include "PDQ_ILI9341_config.h" // PDQ: ILI9341 pins and other setup for this sketch //#include // PDQ: Hardware-specific driver library #include "TFT_ILI9341.h" // Modified PDQ lib - fastest so far but slightly buggypsu //PDQ_ILI9341 tft; // PDQ: create LCD object (using pins in "PDQ_ILI9341_config.h") TFT_ILI9341 tft = TFT_ILI9341(); #include "TouchScreen.h" // For the touch screen functionality #include //#include // include fancy serif font //#include // include fancy sans-serif font #include "ServoTimer2.h" // the servo library ServoTimer2 SC_out; #define ILI9341_GREY 0x8410 #define ILI9341_PINK 0xF8FF // These are the four touchscreen analog pins #define YP A2 // must be an analog pin, use "An" notation! #define XM A3 // must be an analog pin, use "An" notation! #define YM 33 // can be a digital pin #define XP 36 // can be a digital pin // This is calibration data for the raw touch data to the screen coordinates #define TS_MINX 150 #define TS_MINY 120 #define TS_MAXX 920 #define TS_MAXY 940 #define MINPRESSURE 50 #define MAXPRESSURE 1000 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint p; // User Variables from here on out boolean SC_spool = 0, N2O_type = 1, AUD_enable = 0; // SC_spool (0 = don't spool, 1 = spool) N2O_type (0 = auto, 1 = manual) AUD_enable (0 = off, 1 = on) unsigned long GUI_interval_count = 0, GUI_interval = 1200; // GUI_interval_count counts up to GUI_interval before refresh is called, 1200 = minimal updates, 800 = normal updates, 200 = fast updates unsigned long IO_interval_count = 0, IO_interval = 100; // IO_interval_count counts up to IO_interval before update is called, which grabs all the I/O data again byte panelID = 0; // Keeps track of which panel is currently active - 0=Status Display, 1 = Control Panel, 2 = 0ptions int TPS = 0, MAP = 0; // These are all engine sensors that get read by the ADC and converted into 10-bit numbers int AFR = 0; // This is collected by the ADC but kept as fixed point for computation speed. Xfer is AFR = 2.375*V+7.3125 int RPM = 0; // This is calculated from the pulse timing on the input capture pin, coming from a Tiny. The tiny detects the car signal, uses Timer1 to generate a square wave of variable frequency and sends it to the input capture unit of the Mega to be converted to an RPM. int KR = 0; // This is calculated from the pulse timing on the input capture pin, coming from a Tiny. The tiny detects the car signal, uses Timer1 to generate a square wave of variable frequency and sends it to the input capture unit of the Mega to be converted to a KR value. float BATT = 0.0; // This is not a sensor. It's just the sum of all the individual battery voltages byte CAPACITY = 100; // This is a calculated value indicating remaining life in the batteries byte AVR_TMP = 27; // This is the temperature inside the controller box and is read from another MCU via internal I/O connection int PSU_TMP = 0, FET_TMP = 0; // These are the temperatures of the battery bank and MOSFET heatsink respectively, expressed as 10-bit numbers boolean COOLING = 0, SC_ENABLE = 0; // This is the toggle for whether or not Peltier cooling has been enabled on the MOSFETs and whether or not the supercharger has been armed int SC_DUTY = 1500; // This is the current duty cycle of the PWM that controls the supercharger, expressed as a 8-bit number boolean N2O_ENABLE = 0; // This is the toggle for whether or not the N2O system has been armed int N2O_SWITCH = 0; // This is the toggle for which type of N2O switch is being used (automatic or manual) boolean IAT_OVERRIDE = 0; // This is the for the IAT signal to hack and enrich the fuel boolean N2O_VALVE = 0; // This is the open/closed status of the N2O valve unsigned int SYNTH_CODE = 0; // This 8-bit number defines the current voice synthesizer segment that should be played, based upon the current health of the system //RPMs at which the Supercharger can be active int SC_RPM[67] = {0,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600, 3700, 3800, 3900, 4000, 4100, 4200, 4300, 4400, 4500, 4600, 4700, 4800, 4900, 5000, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6500, 6600}; //Corresponding duty cyle values for each of the above RPMs, calculated in such a way as to follow the car's dyno curve. The duty is meant to scale with flow rate and inversely with torque. The intent is to get a flat torque curve. //byte SC_BASE_DUTY[67] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48, 49, 51, 53, 54, 57, 59, 61, 62, 65, 68, 70, 71, 72, 73, 74, 74, 77, 79, 82, 83, 84, 85, 88, 90, 90, 93, 96, 97, 100, 102, 105, 108, 110, 113, 118, 123, 127, 132, 137, 145, 151, 157, 165, 173}; int SC_BASE_DUTY[67] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1780, 1785, 1790, 1795, 1800, 1805, 1810, 1815, 1820, 1825, 1830, 1835, 1840, 1845, 1850, 1855, 1860, 1865, 1870, 1875, 1880, 1885, 1890, 1895, 1900, 1905, 1910, 1915, 1920, 1925, 1930, 1935, 1940, 1945, 1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000}; static const uint8_t picture[] PROGMEM = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x03, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x06, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x06, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x07, 0x80, 0x00, 0x00, 0x07, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x03, 0xc0, 0x00, 0x00, 0x07, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x03, 0xe0, 0x00, 0x00, 0x07, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x03, 0xf0, 0x00, 0x00, 0x07, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x03, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x03, 0xf8, 0x00, 0x00, 0x07, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x03, 0xfc, 0x00, 0x00, 0x07, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x0f, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x01, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x0f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x01, 0xff, 0x80, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x0f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0xff, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xff, 0x87, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xff, 0x87, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xff, 0x87, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff, 0x87, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x07, 0xff, 0x83, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; static const uint8_t engineicon[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe0, 0x1f, 0x80, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x1f, 0x80, 0xe0, 0x01, 0xe0, 0x00, 0xf8, 0x1d, 0x80, 0xe0, 0x03, 0xc0, 0x00, 0x7c, 0x19, 0x80, 0xe0, 0xff, 0x80, 0x00, 0x3f, 0xf9, 0x80, 0xe0, 0xff, 0x00, 0x00, 0x0f, 0xf9, 0x80, 0xe0, 0xfe, 0x00, 0x00, 0x07, 0xf1, 0x80, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x80, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0xe0, 0xfe, 0x00, 0x00, 0x00, 0x79, 0x80, 0xe0, 0xff, 0x80, 0x00, 0x00, 0xf9, 0x80, 0xe0, 0xff, 0xc0, 0x00, 0x01, 0xf9, 0x80, 0xe0, 0x01, 0xe0, 0x00, 0x03, 0xdf, 0x80, 0xe0, 0x00, 0xf0, 0x00, 0x07, 0x9f, 0x80, 0xe0, 0x00, 0x78, 0x00, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00 }; static const uint8_t inductionicon[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd9, 0x26, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xd9, 0x26, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0xd9, 0x26, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xfc, 0xe0, 0x00, 0x0f, 0xf0, 0x00, 0x07, 0xe3, 0xf0, 0x00, 0x01, 0xf8, 0x00, 0x0f, 0x86, 0x1c, 0x00, 0x00, 0x7c, 0x00, 0x1f, 0x0c, 0x0e, 0x00, 0x00, 0x3e, 0x00, 0x1e, 0x18, 0x06, 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x18, 0x02, 0x00, 0x00, 0x0f, 0x00, 0x38, 0x10, 0x02, 0x00, 0x00, 0x07, 0x00, 0x78, 0x18, 0x02, 0x70, 0x03, 0xc7, 0x80, 0x70, 0x1c, 0x07, 0xfc, 0x07, 0xf3, 0x80, 0x70, 0x0c, 0x0f, 0x0c, 0x0c, 0x1b, 0x80, 0xf0, 0x02, 0x1a, 0x07, 0xf8, 0x0b, 0xc0, 0xf0, 0x03, 0x16, 0x01, 0xf0, 0x0f, 0xc0, 0xf0, 0x03, 0x14, 0x00, 0x00, 0x0f, 0xc0, 0xf0, 0x03, 0x1c, 0x00, 0x00, 0x0f, 0xc0, 0xf0, 0x03, 0x14, 0x00, 0x00, 0x0f, 0xc0, 0xf0, 0x02, 0x1e, 0x01, 0xf0, 0x0f, 0xc0, 0x70, 0x06, 0x0a, 0x07, 0x18, 0x1b, 0x80, 0x70, 0x0c, 0x0f, 0x8c, 0x0c, 0x33, 0x80, 0x78, 0x18, 0x07, 0xf8, 0x07, 0xf7, 0x80, 0x38, 0x10, 0x02, 0x70, 0x01, 0xc7, 0x00, 0x3c, 0x10, 0x02, 0x00, 0x00, 0x0f, 0x00, 0x1e, 0x18, 0x02, 0x00, 0x00, 0x1e, 0x00, 0x1f, 0x0c, 0x06, 0x00, 0x00, 0x3e, 0x00, 0x0f, 0x8e, 0x0c, 0x00, 0x00, 0x7c, 0x00, 0x07, 0xc3, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x03, 0xf8, 0xe0, 0x00, 0x07, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xc9, 0xb6, 0x7f, 0x00, 0x00, 0x00, 0x0f, 0xc9, 0xb6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xc9, 0xb6, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc9, 0xb6, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00 }; static const uint8_t powersupplyicon[] PROGMEM = { 0x03, 0xe0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x47, 0xf0, 0x00, 0x00, 0x1f, 0xfd, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x1e, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x7f, 0x80, 0x00, 0xff, 0x0f, 0x80, 0x78, 0x7f, 0x80, 0x00, 0xff, 0x0f, 0x80, 0x78, 0x1e, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x1c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t ioicon[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1e, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x1e, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x40, 0x04, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0xff, 0xfc, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x7f, 0xfc, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0xff, 0xfc, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0x3f, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0x73, 0x80, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0x61, 0x80, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0x61, 0x80, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x73, 0x80, 0x00, 0x7f, 0x00, 0x1c, 0x00, 0x3f, 0x00, 0x00, 0xe3, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0xc3, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void setup() { // tft.begin(); // initialize LCD tft.init(); // initialize LCD tft.setRotation(3); // Go to landscape tft.fillScreen(ILI9341_BLACK); // Clear the screen tft.drawBitmap(0,0,picture,320,240,ILI9341_RED); // SexyTime delay(5000); tft.fillScreen(ILI9341_BLACK); pinMode(0, INPUT_PULLUP); pinMode(1, INPUT_PULLUP); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); // pinMode(5, INPUT_PULLUP); // Going to use Timer3 to drive the Nano's voice synthesizer by sending it codes using variable freq pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); // pinMode(9, INPUT_PULLUP); // SC duty out to brushless controller using modified timer2 servo library // old comments: SC duty out to the brushless controller. Set up Timer3 with 8, 64, or 256 prescalers. Set top to 50Hz equivalent number and OCR to do 1-1.5-2mS pulse widths. Also init the pulse width to 1.5mS or wherever the dead band is to prevent the motor from turning. https://medium.com/@reefwing/multiprotocol-esc-servo-tester-using-the-altronics-megabox-f11333c65e41 pinMode(10, INPUT_PULLUP); pinMode(11, INPUT_PULLUP); pinMode(12, INPUT_PULLUP); // pinMode(13, INPUT_PULLUP); // LED pin... leave it alone pinMode(14, INPUT_PULLUP); pinMode(15, INPUT_PULLUP); pinMode(16, INPUT_PULLUP); pinMode(17, INPUT_PULLUP); pinMode(18, INPUT_PULLUP); // INT3 - Will be used to receive the decrease temperature signal from the nano pin 4 attachInterrupt(5, tempDecrease, FALLING); pinMode(19, INPUT_PULLUP); // INT2 - Will be used to receive the increase temperature signal from the nano pin 5 attachInterrupt(4, tempIncrease, FALLING); pinMode(20, INPUT_PULLUP); pinMode(21, INPUT_PULLUP); // pinMode(22, INPUT_PULLUP); // Cooling Arm - It's connected to a pull-down resistor so leave it alone pinMode(23, OUTPUT); // IAT set digitalWrite(23, LOW); // Set low to make sure no shorting occurs pinMode(24, INPUT_PULLUP); // Synth 1 pinMode(25, INPUT_PULLUP); // Synth 2 pinMode(26, INPUT_PULLUP); // Synth 3 pinMode(27, INPUT_PULLUP); // Synth 4 All these synths should be set to high impedance inputs pinMode(28, INPUT_PULLUP); // Synth 5 pinMode(29, INPUT_PULLUP); // Synth 6 pinMode(30, INPUT_PULLUP); // Synth 7 pinMode(31, INPUT_PULLUP); // Synth 8 // pinMode(32, INPUT_PULLUP); // SD Chip Select - Leave this alone // pinMode(33, INPUT_PULLUP); // Y- Touch Channel - Leave it alone // pinMode(34, OUTPUT); // Toggle Cooling // digitalWrite(34, LOW); // Zero this out until cooling is needed // pinMode(35, INPUT_PULLUP); // Chip Select - Leave it alone // pinMode(36, INPUT_PULLUP); // DC, X+ Touch Channel - Leave it alone // pinMode(37, OUTPUT); // N2O Valve Control // digitalWrite(37, LOW); // Zero this out so the N2O valve doesn't open unexpectedly pinMode(38, INPUT_PULLUP); pinMode(39, INPUT_PULLUP); pinMode(40, INPUT_PULLUP); pinMode(41, INPUT_PULLUP); // pinMode(42, INPUT_PULLUP); // SC Arm - It's connected to a pull-down resistor so leave it alone // pinMode(43, INPUT_PULLUP); // N2O Arm - It's connected to a pull-down resistor so leave it alone pinMode(44, INPUT_PULLUP); pinMode(45, INPUT_PULLUP); pinMode(46, INPUT_PULLUP); pinMode(47, INPUT_PULLUP); // pinMode(48, INPUT_PULLUP); // KR Input Capture Pin ICP5. Set up Timer 5 for pulse timing measurement. // pinMode(49, INPUT_PULLUP); // RPM Input Capture Pin ICP4. Set up Timer 4 for pulse timing measurement. // pinMode(50, INPUT_PULLUP); // MISO - Leave it alone // pinMode(51, INPUT_PULLUP); // MOSI - Leave it alone // pinMode(52, INPUT_PULLUP); // SCK - Leave it alone pinMode(53, INPUT_PULLUP); // pinMode(A0, INPUT_PULLUP); // MAP - No setup needed // pinMode(A1, INPUT_PULLUP); // Batt Temp - No setup needed // pinMode(A2, INPUT_PULLUP); // Y+ Touch Channel - Leave it alone // pinMode(A3, INPUT_PULLUP); // X- Touch Channel - Leave it alone // pinMode(A4, INPUT_PULLUP); // FET Temp - No setup needed // pinMode(A5, INPUT_PULLUP); // N2O Manual Override Input from Steering Wheel - No setup needed pinMode(A6, INPUT_PULLUP); pinMode(A7, INPUT_PULLUP); // pinMode(A8, INPUT_PULLUP); // AFR - No setup needed // pinMode(A9, INPUT_PULLUP); // Batt 1 - No setup needed // pinMode(A10, INPUT_PULLUP); // Batt 2 - No setup needed // pinMode(A11, INPUT_PULLUP); // Batt 3 - No setup needed // New MAIN BATT (no series batts anymore) // pinMode(A12, INPUT_PULLUP); // Batt 4 - No setup needed // pinMode(A13, INPUT_PULLUP); // Batt 5 - No setup needed pinMode(A14, INPUT_PULLUP); // pinMode(A15, INPUT_PULLUP); // TPS - No setup needed cli(); DDRE |= (1 << PE3); // Set OC3A as output TCCR3A = 0; TCCR3B = 0; // Set up timer 3 for PWM to tell the nano what code is currently in effect TCNT3 = 0; // Reset the counter TCCR3B |= (1 << WGM33); // Toggle phase and frequency correct mode with OCR3A as top TCCR3A |= (1 << WGM30); TCCR3A |= (1 << COM3A0); // Toggle OC3A on compare match // No prescaler 1 (001) // Prescaler 1024 (101) // Prescaler 256 (100) // TCCR3B |= (1 << CS32); // TCCR3B |= (1 << CS31); TCCR3B |= (1 << CS30); // Prescaler of 2 and enable the timer OCR3A = 65000; // Set initial "idle" code TCCR4A = 0; TCCR4B = 0; // Set up timer 4 for input capture to detect RPM TCCR4C = 0; TIFR4 = (1<= IO_interval) { // Step 2: Check how long it's been since the last io update. If it's been too long, poll all the I/O channels again update_IO(); // Going through all the I/O channels and updating variables as necessary IO_interval_count = 0; // Resetting the counter } if(GUI_interval_count >= GUI_interval) { // Step 3: Check how long it's been since the last screen refresh. If it's been too long, refresh the current screen refresh(panelID); // Re-painting the current screen with all the latest I/O and config data GUI_interval_count = 0; // Resetting the counter } IO_interval_count++; // Step 4: Increment the I/O update counter GUI_interval_count++; // Increment the GUI update counter boostControl(SC_ENABLE); // Step 5: Run the code that handles the brushless controller waveform sprayControl(N2O_ENABLE); // Step 6: Run the code that handles the N2O solenoid valve } } void statusDisp(void) { panelID = 0; tft.setCursor(35, 5); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(3); tft.println("STATUS DISPLAY"); tft.drawFastHLine(0, 30, 320, ILI9341_WHITE); tft.drawFastVLine(45, 45, 120, ILI9341_WHITE); tft.drawFastVLine(105, 45, 120, ILI9341_WHITE); tft.drawFastVLine(180, 45, 120, ILI9341_WHITE); tft.drawFastVLine(250, 45, 120, ILI9341_WHITE); tft.drawRect(1, 45, 318, 120, ILI9341_WHITE); tft.drawFastHLine(1, 73, 318, ILI9341_WHITE); tft.drawFastHLine(1, 103, 318, ILI9341_WHITE); tft.drawFastHLine(1, 133, 318, ILI9341_WHITE); tft.drawRoundRect(5, 180, 130, 55, 12, ILI9341_WHITE); tft.drawRoundRect(140, 180, 175, 55, 12, ILI9341_WHITE); tft.drawRect(25, 198, 11, 8, ILI9341_WHITE); tft.drawRect(285, 198, 11, 8, ILI9341_WHITE); tft.drawLine(10, 202, 25, 195, ILI9341_WHITE); tft.drawLine(10, 202, 25, 209, ILI9341_WHITE); tft.drawFastVLine(25, 195, 14, ILI9341_WHITE); tft.drawFastVLine(25, 198, 8, ILI9341_BLACK); tft.drawLine(310, 202, 295, 195, ILI9341_WHITE); tft.drawLine(310, 202, 295, 209, ILI9341_WHITE); tft.drawFastVLine(295, 195, 14, ILI9341_WHITE); tft.drawFastVLine(295, 198, 8, ILI9341_BLACK); tft.setCursor(45, 196); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2); tft.println("OPTIONS"); tft.setCursor(147, 196); tft.println("CNTRL PANEL"); tft.setCursor(7, 55); tft.setTextColor(ILI9341_PINK); tft.setTextSize(1); tft.println("ENGINE"); tft.setCursor(53, 55); tft.setTextColor(ILI9341_GREEN); tft.println("SC"); tft.setCursor(113, 55); tft.setTextColor(ILI9341_RED); tft.println("N2O"); tft.setCursor(185, 55); tft.println("KR"); tft.setCursor(293, 55); tft.setTextColor(ILI9341_CYAN); tft.println("PSI"); tft.setCursor(7, 85); tft.setTextColor(ILI9341_PINK); tft.println("E-SC"); tft.setCursor(53, 85); tft.setTextColor(ILI9341_GREEN); tft.println("ENABLED"); tft.setCursor(113, 85); tft.println("UNSPOOLED"); tft.setCursor(185, 85); tft.println("FET TMP"); tft.setCursor(293, 85); tft.setTextColor(ILI9341_CYAN); tft.println("DC"); tft.setCursor(7, 115); tft.setTextColor(ILI9341_PINK); tft.println("N2O"); tft.setCursor(53, 115); tft.setTextColor(ILI9341_GREY); tft.println("DISABLED"); tft.setCursor(113, 115); tft.println("MANUAL"); tft.setCursor(185, 115); tft.println("IAT BYPASS"); tft.setCursor(257, 115); tft.println("VALVE CLS"); tft.setCursor(7, 145); tft.setTextColor(ILI9341_PINK); tft.println("POWER"); tft.setCursor(53, 145); tft.setTextColor(ILI9341_GREEN); tft.println("PSU"); tft.setCursor(113, 145); tft.println("BATT TMP HI"); tft.setCursor(185, 145); tft.setTextColor(ILI9341_YELLOW); tft.println("VOLTS"); tft.setCursor(280, 145); tft.setTextColor(ILI9341_CYAN); tft.println("S RMN"); } void controls(void) { panelID = 1; tft.setCursor(40, 5); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(3); tft.println("CONTROL PANEL"); tft.drawFastHLine(0, 30, 320, ILI9341_WHITE); tft.setCursor(35, 35); tft.setTextColor(ILI9341_RED); tft.setTextSize(2); tft.println("ENGINE"); tft.setCursor(175, 35); tft.setTextColor(ILI9341_CYAN); tft.println("INDUCTION"); tft.setCursor(37, 104); tft.setTextColor(ILI9341_YELLOW); tft.println("POWER"); tft.setCursor(37, 121); tft.println("SUPPLY"); tft.setCursor(177, 104); tft.setTextColor(ILI9341_GREEN); tft.println("I/O"); tft.setCursor(177, 121); tft.println("DIAGNOSTICS"); tft.drawRoundRect(5, 180, 130, 55, 12, ILI9341_WHITE); tft.drawRect(25, 198, 11, 8, ILI9341_WHITE); tft.drawLine(10, 202, 25, 195, ILI9341_WHITE); tft.drawLine(10, 202, 25, 209, ILI9341_WHITE); tft.drawFastVLine(25, 195, 14, ILI9341_WHITE); tft.drawFastVLine(25, 198, 8, ILI9341_BLACK); tft.setCursor(45, 196); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2); tft.println("BACK"); tft.drawBitmap(45, 55, engineicon, 50, 30, ILI9341_RED); tft.drawBitmap(210, 55, inductionicon, 50, 39, ILI9341_CYAN); tft.drawBitmap(45, 140, powersupplyicon, 50, 36, ILI9341_YELLOW); tft.drawBitmap(210, 140, ioicon, 50, 43, ILI9341_GREEN); } void options(void) { panelID = 2; tft.setCursor(100, 5); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(3); tft.println("OPTIONS"); tft.drawFastHLine(0, 30, 320, ILI9341_WHITE); tft.setCursor(195, 196); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2); tft.println("BACK"); tft.drawRoundRect(140, 180, 175, 55, 12, ILI9341_WHITE); tft.drawRect(285, 198, 11, 8, ILI9341_WHITE); tft.drawLine(310, 202, 295, 195, ILI9341_WHITE); tft.drawLine(310, 202, 295, 209, ILI9341_WHITE); tft.drawFastVLine(295, 195, 14, ILI9341_WHITE); tft.drawFastVLine(295, 198, 8, ILI9341_BLACK); tft.setTextColor(ILI9341_BLACK); tft.setTextSize(1); if(SC_spool == 0) { tft.fillRoundRect(220, 40, 50, 30, 9, ILI9341_RED); tft.setCursor(235, 50); tft.println("OFF"); } else { tft.fillRoundRect(220, 40, 50, 30, 9, ILI9341_GREEN); tft.setCursor(235, 50); tft.println("ON"); } if(N2O_type == 0) { tft.fillRoundRect(220, 75, 50, 30, 9, ILI9341_CYAN); tft.setCursor(235, 85); tft.println("AUTO"); } else { tft.fillRoundRect(220, 75, 50, 30, 9, ILI9341_ORANGE); tft.setCursor(235, 85); tft.println("MAN"); } switch(GUI_interval) { case 1200: tft.fillRoundRect(220, 110, 50, 30, 9, ILI9341_YELLOW); tft.setCursor(235, 120); tft.println("MIN"); break; case 800: tft.fillRoundRect(220, 110, 50, 30, 9, ILI9341_ORANGE); tft.setCursor(235, 120); tft.println("NORM"); break; case 200: tft.fillRoundRect(220, 110, 50, 30, 9, ILI9341_RED); tft.setCursor(235, 120); tft.println("FAST"); break; } if(AUD_enable == 0) { tft.fillRoundRect(220, 145, 50, 30, 9, ILI9341_RED); tft.setCursor(235, 155); tft.println("OFF"); } else { tft.fillRoundRect(220, 145, 50, 30, 9, ILI9341_GREEN); tft.setCursor(235, 155); tft.println("ON"); } tft.setCursor(5, 50); tft.setTextColor(ILI9341_PINK); tft.setTextSize(2); tft.println("S/C PRE-SPOOLING"); tft.setCursor(5, 85); tft.println("NITROUS SWITCH"); tft.setCursor(5, 120); tft.println("GUI UPDATES"); tft.setCursor(5, 155); tft.println("VERBOSE AUDIO"); } void engine(void) { panelID = 3; tft.setCursor(105, 5); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(3); tft.println("ENGINE"); tft.drawFastHLine(0, 30, 320, ILI9341_WHITE); tft.drawRect(30, 60, 85, 160, ILI9341_PINK); tft.drawFastVLine(72, 60, 160, ILI9341_PINK); tft.drawFastHLine(110, 82, 5, ILI9341_PINK); tft.drawFastHLine(110, 105, 5, ILI9341_PINK); tft.drawFastHLine(110, 128, 5, ILI9341_PINK); tft.drawFastHLine(110, 151, 5, ILI9341_PINK); tft.drawFastHLine(110, 174, 5, ILI9341_PINK); tft.drawFastHLine(110, 197, 5, ILI9341_PINK); tft.drawFastHLine(30, 74, 5, ILI9341_PINK); tft.drawFastHLine(30, 90, 5, ILI9341_PINK); tft.drawFastHLine(30, 106, 5, ILI9341_PINK); tft.drawFastHLine(30, 122, 5, ILI9341_PINK); tft.drawFastHLine(30, 138, 5, ILI9341_PINK); tft.drawFastHLine(30, 152, 5, ILI9341_PINK); tft.drawFastHLine(30, 168, 5, ILI9341_PINK); tft.drawFastHLine(30, 183, 5, ILI9341_PINK); tft.drawFastHLine(30, 199, 5, ILI9341_PINK); tft.setTextSize(2); tft.setCursor(30, 40); tft.setTextColor(ILI9341_PINK); tft.println("TPS RPM AFR"); tft.setCursor(210, 117); tft.println("MAP"); tft.setCursor(210, 200); tft.println("KR"); tft.setTextSize(1); tft.setCursor(150, 47); tft.println("RICH LEAN"); tft.setTextColor(ILI9341_WHITE); tft.setCursor(40, 65); tft.println("100"); tft.setCursor(40, 80); tft.println("90"); tft.setCursor(40, 95); tft.println("80"); tft.setCursor(40, 110); tft.println("70"); tft.setCursor(40, 125); tft.println("60"); tft.setCursor(40, 140); tft.println("50"); tft.setCursor(40, 155); tft.println("40"); tft.setCursor(40, 170); tft.println("30"); tft.setCursor(40, 185); tft.println("20"); tft.setCursor(40, 200); tft.println("10"); tft.setTextSize(3); tft.setCursor(86, 63); tft.println("7"); tft.setCursor(86, 85); tft.println("6"); tft.setCursor(86, 107); tft.println("5"); tft.setCursor(86, 129); tft.println("4"); tft.setCursor(86, 151); tft.println("3"); tft.setCursor(86, 173); tft.println("2"); tft.setCursor(86, 195); tft.println("1"); tft.setTextSize(2); tft.setCursor(40, 225); tft.setTextColor(ILI9341_PINK); tft.println("%"); tft.setTextSize(1); tft.setCursor(78, 230); tft.println("x1000"); tft.fillTriangle(28, 90, 13, 85, 13, 95, ILI9341_BLUE); tft.fillTriangle(117, 120, 132, 115, 132, 125, ILI9341_BLUE); tft.drawRect(150, 60, 150, 40, ILI9341_PINK); tft.fillRect(250, 61, 4, 23, ILI9341_BLUE); tft.fillRect(151, 85, 30, 6, ILI9341_MAROON); tft.fillRect(180, 85, 30, 10, ILI9341_RED); tft.fillRect(210, 85, 30, 14, ILI9341_ORANGE); tft.fillRect(240, 85, 30, 8, ILI9341_DARKGREEN); tft.fillRect(270, 85, 29, 5, ILI9341_CYAN); tft.drawRect(150, 135, 150, 50, ILI9341_PINK); tft.setCursor(152, 136); tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE); tft.println(" 0 25 50 100"); tft.setCursor(152, 175); tft.println(" 1 2 3 4 5 6"); tft.setCursor(148, 100); tft.println("9 12.5 16"); tft.fillRect(151, 148, 148, 10, ILI9341_BLUE); tft.fillRect(151, 160, 100, 10, ILI9341_CYAN); tft.drawRect(150, 220, 150, 20, ILI9341_PINK); tft.fillRect(151, 221, 60, 12, ILI9341_RED); // tft.fillRect(151, 236, 90, 2, ILI9341_YELLOW); } void induction(void) { panelID = 4; tft.setCursor(80, 5); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(3); tft.println("INDUCTION"); tft.drawFastHLine(0, 30, 320, ILI9341_WHITE); tft.setTextSize(2); tft.setTextColor(ILI9341_PINK); tft.setCursor(5, 40); tft.println("FET TMP FET DUTY"); tft.setCursor(80, 225); tft.println("SC FLOW N2O VALVE"); tft.setTextSize(1); tft.setTextColor(ILI9341_RED); tft.setCursor(5, 65); tft.println("100"); tft.setCursor(11, 77); tft.println("90"); tft.setCursor(11, 89); tft.setTextColor(ILI9341_ORANGE); tft.println("80"); tft.setCursor(11, 101); tft.setTextColor(ILI9341_YELLOW); tft.println("70"); tft.setCursor(11, 113); tft.setTextColor(ILI9341_GREEN); tft.println("60"); tft.setCursor(11, 125); tft.println("50"); tft.setCursor(11, 137); tft.println("40"); tft.setCursor(11, 149); tft.println("30"); tft.setCursor(11, 161); tft.println("20"); tft.setCursor(11, 173); tft.println("10"); tft.setTextColor(ILI9341_RED); tft.setCursor(17, 185); tft.println("0"); tft.setCursor(5, 197); tft.println("-10"); tft.drawFastHLine(27, 69, 10, ILI9341_PINK); tft.drawFastHLine(27, 81, 10, ILI9341_PINK); tft.drawFastHLine(27, 93, 10, ILI9341_PINK); tft.drawFastHLine(27, 105, 10, ILI9341_PINK); tft.drawFastHLine(27, 117, 10, ILI9341_PINK); tft.drawFastHLine(27, 129, 10, ILI9341_PINK); tft.drawFastHLine(27, 141, 10, ILI9341_PINK); tft.drawFastHLine(27, 153, 10, ILI9341_PINK); tft.drawFastHLine(27, 165, 10, ILI9341_PINK); tft.drawFastHLine(27, 177, 10, ILI9341_PINK); tft.drawFastHLine(27, 189, 10, ILI9341_PINK); tft.drawFastHLine(27, 201, 10, ILI9341_PINK); tft.drawBitmap(100, 110, inductionicon, 50, 39, ILI9341_CYAN); tft.drawRect(117, 60, 16, 31, ILI9341_BLUE); tft.drawLine(112, 90, 125, 105, ILI9341_BLUE); tft.drawLine(125, 105, 138, 90, ILI9341_BLUE); tft.drawFastHLine(112, 90, 26, ILI9341_BLUE); tft.drawFastHLine(118, 90, 14, ILI9341_BLACK); tft.drawRect(109, 160, 32, 31, ILI9341_BLUE); tft.drawLine(100, 190, 125, 215, ILI9341_BLUE); tft.drawLine(125, 215, 150, 190, ILI9341_BLUE); tft.drawFastHLine(100, 190, 50, ILI9341_BLUE); tft.drawFastHLine(110, 190, 30, ILI9341_BLACK); tft.fillCircle(40, 210, 10, ILI9341_PINK); tft.drawRoundRect(35, 60, 10, 150, 5, ILI9341_PINK); tft.drawRoundRect(36, 60, 8, 150, 4, ILI9341_PINK); tft.fillCircle(40, 210, 8, ILI9341_BLUE); tft.fillRect(37, 80, 6, 130, ILI9341_BLUE); tft.drawRect(185, 60, 115, 80, ILI9341_PINK); tft.drawFastVLine(275, 60, 80, ILI9341_PINK); tft.drawRect(190, 70, 20, 60, ILI9341_BLUE); tft.drawFastVLine(190, 70, 60, ILI9341_BLACK); tft.drawFastHLine(191, 129, 18, ILI9341_BLACK); tft.drawFastHLine(209, 130, 22, ILI9341_BLUE); tft.drawRect(230, 70, 20, 60, ILI9341_BLUE); tft.drawFastHLine(231, 129, 18, ILI9341_BLACK); tft.drawFastHLine(249, 130, 21, ILI9341_BLUE); // tft.fillRect(280, 100, 15, 38, ILI9341_BLUE); tft.drawRect(185, 190, 35, 10, ILI9341_PINK); tft.fillRect(185, 191, 35, 8, ILI9341_BLUE); tft.drawRect(265, 190, 35, 10, ILI9341_PINK); tft.fillRect(265, 191, 35, 8, ILI9341_BLUE); tft.drawTriangle(220, 175, 220, 215, 242, 195, ILI9341_PINK); tft.fillTriangle(221, 177, 221, 212, 241, 195, ILI9341_BLUE); tft.drawTriangle(243, 195, 265, 215, 265, 175, ILI9341_PINK); tft.fillTriangle(244, 195, 264, 212, 264, 177, ILI9341_BLUE); } void psu(void) { panelID = 5; tft.setCursor(55, 5); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(3); tft.println("POWER SUPPLY"); tft.drawFastHLine(0, 30, 320, ILI9341_WHITE); tft.setTextSize(2); tft.setTextColor(ILI9341_PINK); tft.setCursor(5, 40); tft.println("TEMPERATURE DC VOLTS"); tft.setCursor(5, 225); tft.println("AVR BATT"); tft.setCursor(175, 160); tft.println("CAPACITY"); tft.fillCircle(20, 210, 10, ILI9341_PINK); tft.drawRoundRect(15, 60, 10, 150, 5, ILI9341_PINK); tft.drawRoundRect(16, 60, 8, 150, 4, ILI9341_PINK); tft.fillCircle(20, 210, 8, ILI9341_BLUE); tft.fillRect(17, 80, 6, 130, ILI9341_BLUE); tft.fillCircle(80, 210, 10, ILI9341_PINK); tft.drawRoundRect(75, 60, 10, 150, 5, ILI9341_PINK); tft.drawRoundRect(76, 60, 8, 150, 4, ILI9341_PINK); tft.fillCircle(80, 210, 8, ILI9341_BLUE); tft.fillRect(77, 80, 6, 130, ILI9341_BLUE); tft.drawBitmap(225, 80, powersupplyicon, 50, 36, ILI9341_YELLOW);; tft.drawBitmap(170, 80, powersupplyicon, 50, 36, ILI9341_YELLOW); tft.drawRect(162, 70, 120, 55, ILI9341_PINK); tft.drawRect(162, 185, 120, 30, ILI9341_PINK); tft.drawFastHLine(25, 69, 50, ILI9341_PINK); tft.drawFastHLine(25, 87, 50, ILI9341_PINK); tft.drawFastHLine(25, 105, 50, ILI9341_PINK); tft.drawFastHLine(25, 123, 50, ILI9341_PINK); tft.drawFastHLine(25, 141, 50, ILI9341_PINK); tft.drawFastHLine(25, 159, 50, ILI9341_PINK); tft.drawFastHLine(25, 177, 50, ILI9341_PINK); tft.drawFastHLine(25, 195, 50, ILI9341_PINK); tft.setTextColor(ILI9341_RED); tft.setTextSize(2); tft.setCursor(39, 62); tft.println("60"); tft.setCursor(39, 80); tft.println("50"); tft.setCursor(39, 98); tft.setTextColor(ILI9341_ORANGE); tft.println("40"); tft.setCursor(39, 116); tft.setTextColor(ILI9341_YELLOW); tft.println("30"); tft.setCursor(39, 134); tft.setTextColor(ILI9341_GREEN); tft.println("20"); tft.setCursor(39, 152); tft.println("10"); tft.setCursor(45, 170); tft.println("0"); tft.setCursor(33, 188); tft.setTextColor(ILI9341_RED); tft.println("-10"); } void io(void) { panelID = 6; tft.setCursor(25, 5); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(3); tft.println("I/O DIAGNOSTICS"); tft.drawFastHLine(0, 30, 320, ILI9341_WHITE); tft.setTextSize(1); tft.setCursor(0, 40); tft.setTextColor(ILI9341_CYAN); tft.println(" SUPERCHARGER"); tft.drawRect(140, 37, 79, 13, ILI9341_CYAN); tft.println(""); tft.println(" SC ENABLE = "); tft.println(" SC DUTY = "); tft.println(""); tft.println(""); tft.setTextColor(ILI9341_BLUE); tft.println(" NITROUS"); tft.drawRect(140, 85, 49, 13, ILI9341_BLUE); tft.println(""); tft.println(" N2O ENABLE = "); tft.println(" N2O SWITCH = "); tft.println(" IAT OVERRIDE = "); tft.println(" N2O VALVE = "); tft.println(""); tft.println(""); tft.setTextColor(ILI9341_PINK); tft.println(" AUDIO"); tft.drawRect(140, 149, 37, 13, ILI9341_PINK); tft.println(""); tft.println(" VOICE SYNTH CODE = "); tft.setCursor(0, 40); tft.setTextColor(ILI9341_RED); tft.println(" ENGINE"); tft.drawRect(3, 37, 42, 13, ILI9341_RED); tft.println(""); tft.println(" RPM = "); tft.println(" TPS = "); tft.println(" MAP = "); tft.println(" AFR = "); tft.println(" KR = "); tft.println(""); tft.println(""); tft.setTextColor(ILI9341_YELLOW); tft.println(" ELECTRICAL"); tft.drawRect(3, 109, 66, 13, ILI9341_YELLOW); tft.println(""); tft.println(" BATT = "); tft.println(" CAPACITY = "); tft.println(""); tft.println(""); tft.println(""); tft.println(""); tft.println(""); tft.println(""); tft.setTextColor(ILI9341_GREEN); tft.println(" THERMAL"); tft.drawRect(3, 189, 48, 13, ILI9341_GREEN); tft.println(""); tft.println(" AVR TEMP = "); tft.println(" PSU TEMP = "); tft.println(" FET TEMP = "); tft.println(" COOLING = "); } void checkTouch(void) { p = ts.getPoint(); // Capture the touch sensor values if (p.z < MINPRESSURE || p.z > MAXPRESSURE) { // If no valid touch is detected, put the cursor somewhere outside any masked button areas so it won't do anything p.x = 0; p.y = 0; } else { // Otherwise if a touch is detected, grab the x,y location of the touch and break out of the loop to check what to do // Scale from ~0->1000 to tft.width using the calibration #'s p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height()); return; } } void whereTouch(void) { if((p.y > 125) & (p.x > 230) & (panelID == 1)) { // Go back from control panel to status display tft.fillScreen(ILI9341_BLACK); statusDisp(); return; } if((p.y < 120) & (p.x > 230) & (panelID == 0)) { // Go from status display to control panel tft.fillScreen(ILI9341_BLACK); controls(); return; } if((p.y > 125) & (p.x > 230) & (panelID == 0)) { // Go from status display to options tft.fillScreen(ILI9341_BLACK); options(); return; } if((p.y < 120) & (p.x > 240) & (panelID == 2)) { // Go back from options to status display tft.fillScreen(ILI9341_BLACK); statusDisp(); return; } if((p.y < 60) & (p.y > 20) & (p.x > 30)& (p.x < 65) & (panelID == 2)) { // SC Prespool toggle delay(200); tft.setCursor(235, 50); tft.setTextColor(ILI9341_BLACK); tft.setTextSize(1); if(SC_spool == 0) { tft.fillRoundRect(220, 40, 50, 30, 9, ILI9341_GREEN); tft.println("ON"); SC_spool = 1; return; } else { tft.fillRoundRect(220, 40, 50, 30, 9, ILI9341_RED); tft.println("OFF"); SC_spool = 0; return; } } if((p.y < 60) & (p.y > 20) & (p.x > 80)& (p.x < 120) & (panelID == 2)) { // N2O Switch Type delay(200); tft.setCursor(235, 85); tft.setTextColor(ILI9341_BLACK); tft.setTextSize(1); if(N2O_type == 0) { tft.fillRoundRect(220, 75, 50, 30, 9, ILI9341_ORANGE); tft.println("MAN"); N2O_type = 1; return; } else { tft.fillRoundRect(220, 75, 50, 30, 9, ILI9341_CYAN); tft.println("AUTO"); N2O_type = 0; return; } } if((p.y < 60) & (p.y > 20) & (p.x > 135)& (p.x < 175) & (panelID == 2)) { // GUI Update Speed delay(200); tft.setCursor(235, 120); tft.setTextColor(ILI9341_BLACK); tft.setTextSize(1); switch(GUI_interval) { case 1200: tft.fillRoundRect(220, 110, 50, 30, 9, ILI9341_ORANGE); tft.println("NORM"); GUI_interval = 800; return; case 800: tft.fillRoundRect(220, 110, 50, 30, 9, ILI9341_RED); tft.println("FAST"); GUI_interval = 200; return; case 200: tft.fillRoundRect(220, 110, 50, 30, 9, ILI9341_YELLOW); tft.println("MIN"); GUI_interval = 1200; } } if((p.y < 60) & (p.y > 20) & (p.x > 190)& (p.x < 225) & (panelID == 2)) { // Verbose Audio Toggle delay(200); tft.setCursor(235, 155); tft.setTextColor(ILI9341_BLACK); tft.setTextSize(1); if(AUD_enable == 0) { tft.fillRoundRect(220, 145, 50, 30, 9, ILI9341_GREEN); tft.println("ON"); AUD_enable = 1; return; } else { tft.fillRoundRect(220, 145, 50, 30, 9, ILI9341_RED); tft.println("OFF"); AUD_enable = 0; return; } } if((p.y > 120) & (p.x < 110) & (p.x > 30) & (panelID == 1)) { // Go from control panel to engine tft.fillRect(0, 0, 320, 280, ILI9341_BLACK); engine(); return; } if((p.y > 1) & (p.x > 1) & (panelID == 3)) { // Go back from engine to control panel tft.fillScreen(ILI9341_BLACK); controls(); return; } if((p.y < 100) & (p.x < 110) & (p.x > 30) & (panelID == 1)) { // Go from control panel to induction tft.fillRect(0, 0, 320, 280, ILI9341_BLACK); induction(); return; } if((p.y > 1) & (p.x > 1) & (panelID == 4)) { // Go back from induction to control panel tft.fillScreen(ILI9341_BLACK); controls(); return; } if((p.y > 130) & (p.x < 230) & (p.x > 130) & (panelID == 1)) { // Go from control panel to power supply tft.fillRect(0, 0, 320, 280, ILI9341_BLACK); psu(); return; } if((p.y > 1) & (p.x > 1) & (panelID == 5)) { // Go back from power supply to control panel tft.fillScreen(ILI9341_BLACK); controls(); return; } if((p.y < 100) & (p.x < 240) & (p.x > 130) & (panelID == 1)) { // Go from control panel to I/O diagnostics tft.fillRect(0, 0, 320, 280, ILI9341_BLACK); io(); return; } if((p.y > 1) & (p.x > 1) & (panelID == 6)) { // Go back from I/O diagnostics to control panel tft.fillScreen(ILI9341_BLACK); controls(); return; } } void refresh(int screen) { switch(screen) { case 0: tft.setTextSize(1); tft.fillRect(50, 55, 52, 10, ILI9341_BLACK); tft.setCursor(50, 55); if(boostCheck()) { tft.setTextColor(ILI9341_GREEN); tft.println("SC GO"); } else { tft.setTextColor(ILI9341_RED); tft.println("SC NO GO"); } tft.fillRect(50, 83, 52, 10, ILI9341_BLACK); tft.setCursor(50, 83); if(SC_ENABLE) { tft.setTextColor(ILI9341_GREEN); tft.println("ENABLED"); } else { tft.setTextColor(ILI9341_GREY); tft.println("DISABLED"); } tft.fillRect(50, 113, 52, 10, ILI9341_BLACK); tft.setCursor(50, 113); if(N2O_ENABLE) { tft.setTextColor(ILI9341_GREEN); tft.println("ENABLED"); } else { tft.setTextColor(ILI9341_GREY); tft.println("DISABLED"); } tft.fillRect(50, 143, 52, 10, ILI9341_BLACK); tft.setCursor(50, 143); if((PSU_TMP < 70) & (BATT > 705) & (CAPACITY > 10)) { tft.setTextColor(ILI9341_GREEN); tft.println("NOMINAL"); } else { tft.setTextColor(ILI9341_ORANGE); tft.println("WARNING!"); } tft.fillRect(110, 55, 68, 10, ILI9341_BLACK); tft.setCursor(110, 55); if(boostCheck()) { tft.setTextColor(ILI9341_GREEN); tft.println("N2O GO"); } else { tft.setTextColor(ILI9341_RED); tft.println("N2O NO GO"); } tft.fillRect(110, 83, 68, 10, ILI9341_BLACK); tft.setCursor(110, 83); if(SC_ENABLE) tft.setTextColor(ILI9341_GREEN); else tft.setTextColor(ILI9341_GREY); if(SC_spool) tft.print("SPOOLED"); else tft.print("UNSPOOLED"); tft.fillRect(110, 113, 68, 10, ILI9341_BLACK); tft.setCursor(110, 113); if(N2O_ENABLE) tft.setTextColor(ILI9341_GREEN); else tft.setTextColor(ILI9341_GREY); if(N2O_type) tft.print("MANUAL"); else tft.print("AUTO"); tft.fillRect(110, 143, 68, 10, ILI9341_BLACK); tft.setCursor(110, 143); if(PSU_TMP >= 70){ tft.setTextColor(ILI9341_RED); tft.println("OVERHEAT"); } else { tft.setTextColor(ILI9341_GREEN); tft.println("TEMP OK"); } tft.fillRect(185, 55, 64, 10, ILI9341_BLACK); tft.setCursor(185, 55); if(KR < 10) { tft.setTextColor(ILI9341_GREEN); tft.println("KR NOMINAL"); } else { tft.setTextColor(ILI9341_RED); tft.println("KR HIGH"); } tft.fillRect(185, 83, 64, 10, ILI9341_BLACK); tft.setCursor(185, 83); if(FET_TMP < 100) { if(SC_ENABLE) tft.setTextColor(ILI9341_GREEN); else tft.setTextColor(ILI9341_GREY); tft.println("FET TMP OK"); } else { if(SC_ENABLE) tft.setTextColor(ILI9341_RED); else tft.setTextColor(ILI9341_GREY); tft.println("FET TMP HI"); } tft.fillRect(185, 113, 64, 10, ILI9341_BLACK); tft.setCursor(185, 113); if(IAT_OVERRIDE) { if(N2O_ENABLE) tft.setTextColor(ILI9341_YELLOW); else tft.setTextColor(ILI9341_GREY); tft.println("IAT BYPASS"); } else { if(N2O_ENABLE) tft.setTextColor(ILI9341_GREEN); else tft.setTextColor(ILI9341_GREY); tft.println("IAT NOMINAL"); } tft.fillRect(185, 143, 64, 10, ILI9341_BLACK); tft.setCursor(185, 143); if(BATT <= 705) { tft.setTextColor(ILI9341_RED); tft.println("UNDERVOLT"); } else tft.setTextColor(ILI9341_GREEN); tft.println("VOLTS OK"); tft.fillRect(253, 55, 64, 10, ILI9341_BLACK); tft.setCursor(253, 55); tft.setTextColor(ILI9341_CYAN); tft.print(3*14.7*MAP/1023-14.7); tft.setCursor(290, 55); tft.print("PSI"); tft.fillRect(253, 83, 64, 10, ILI9341_BLACK); tft.setCursor(253, 83); if(SC_ENABLE) tft.setTextColor(ILI9341_CYAN); else tft.setTextColor(ILI9341_GREY); tft.print(100-(2000 - SC_DUTY)*100/500); tft.print(" % DUTY"); tft.fillRect(253, 113, 64, 10, ILI9341_BLACK); tft.setCursor(253, 113); if(N2O_ENABLE) tft.setTextColor(ILI9341_CYAN); else tft.setTextColor(ILI9341_GREY); tft.print("VALVE "); if(N2O_VALVE) tft.print("OPEN"); else tft.print("CLS"); tft.fillRect(253, 143, 64, 10, ILI9341_BLACK); tft.setCursor(253, 143); if(CAPACITY <= 10) tft.setTextColor(ILI9341_RED); else tft.setTextColor(ILI9341_CYAN); tft.print(CAPACITY); tft.print(" SEC RMN"); return; case 3: tft.fillRect(10, 54, 19, 192, ILI9341_BLACK); if(TPS>950) tft.fillTriangle(28, (220-(long)TPS*160/1024), 13, (215-(long)TPS*160/1024), 13, (225-(long)TPS*160/1024), ILI9341_GREEN); else tft.fillTriangle(28, (220-(long)TPS*160/1024), 13, (215-(long)TPS*160/1024), 13, (225-(long)TPS*160/1024), ILI9341_BLUE); tft.fillRect(116, 54, 19, 192, ILI9341_BLACK); if(RPM > 365) tft.fillTriangle(117, (220-(long)RPM*160/1024), 132, (215-(long)RPM*160/1024), 132, (225-(long)RPM*160/1024), ILI9341_GREEN); else tft.fillTriangle(117, (220-(long)RPM*160/1024), 132, (215-(long)RPM*160/1024), 132, (225-(long)RPM*160/1024), ILI9341_BLUE); tft.fillRect(151, 61, 148, 23, ILI9341_BLACK); if((AFR>413) & (AFR<481)) tft.fillRect((150+(long)(AFR-144)*150/1024), 61, 4, 23, ILI9341_GREEN); else tft.fillRect((150+(long)(AFR-144)*150/1024), 61, 4, 23, ILI9341_BLUE); tft.fillRect(151, 148, 148, 10, ILI9341_BLACK); tft.fillRect(151, 160, 148, 10, ILI9341_BLACK); if(MAP<280) tft.fillRect(151, 148, ((long)MAP*148/307), 10, ILI9341_BLUE); else if((MAP>=280)&(MAP<307)) tft.fillRect(151, 148, ((long)MAP*148/307), 10, ILI9341_GREEN); else { tft.fillRect(151, 148, 148, 10, ILI9341_GREEN); tft.fillRect(151, 160, (((long)MAP-307-500)*148/303), 10, ILI9341_CYAN); // delete the -500 convenience number when you hook this up to a real sensor. } tft.fillRect(151, 221, 148, 14, ILI9341_BLACK); // KR = random(256); // delete this except for demo purposes if(KR<100) { tft.fillRect(151, 221, ((long)KR*148/128), 12, ILI9341_GREEN); tft.fillRect(151, 236, ((long)KR*148/128), 2, ILI9341_YELLOW); } else { tft.fillRect(151, 221, ((long)KR*148/128), 12, ILI9341_RED); tft.fillRect(151, 236, ((long)KR*148/128), 2, ILI9341_YELLOW); } return; case 4: tft.fillRect(110, 59, 30, 50, ILI9341_BLACK); tft.fillRect(100, 150, 55, 70, ILI9341_BLACK); if(SC_DUTY > 20) { tft.fillRect(117, 60, 16, 31, ILI9341_BLUE); tft.fillTriangle(112, 90, 125, 105, 138, 90, ILI9341_BLUE); tft.fillRect(109, 160, 32, 31, ILI9341_BLUE); tft.fillTriangle(100, 190, 125, 215, 150, 190, ILI9341_BLUE); } else if(SC_spool == 1) { tft.fillRect(117, 60, 16, 31, ILI9341_BLUE); tft.fillTriangle(112, 90, 125, 105, 138, 90, ILI9341_BLUE); tft.fillRect(117, 160, 16, 31, ILI9341_BLUE); tft.fillTriangle(112, 190, 125, 205, 138, 190, ILI9341_BLUE); } else { tft.drawRect(117, 60, 16, 31, ILI9341_BLUE); tft.drawTriangle(112, 90, 125, 105, 138, 90, ILI9341_BLUE); tft.drawFastHLine(118, 90, 14, ILI9341_BLACK); tft.drawRect(117, 160, 16, 31, ILI9341_BLUE); tft.drawTriangle(112, 190, 125, 205, 138, 190, ILI9341_BLUE); tft.drawFastHLine(118, 190, 14, ILI9341_BLACK); } // N2O_VALVE = 1; // Delete this except for demo purposes if(N2O_VALVE == 1) { tft.fillTriangle(244, 195, 264, 212, 264, 177, ILI9341_BLUE); tft.fillRect(266, 191, 35, 8, ILI9341_BLUE); } else { tft.fillTriangle(244, 195, 264, 212, 264, 177, ILI9341_BLACK); tft.fillTriangle(221, 177, 221, 212, 241, 195, ILI9341_BLACK); tft.fillRect(266, 191, 35, 8, ILI9341_BLACK); } /* (SC_DUTY-1500)/500 SC_DUTY+=5; if(SC_DUTY >= 255) // Delete this except for demo purposes SC_DUTY=0; */ tft.fillRect(189, 69, 85, 64, ILI9341_BLACK); tft.drawRect(190, 70, ((long)(SC_DUTY-1500)*42/500), 60, ILI9341_BLUE); tft.drawFastVLine(189, 70, 60, ILI9341_BLACK); tft.drawFastHLine(189, 129, ((long)(SC_DUTY-1500)*42/500), ILI9341_BLACK); tft.drawFastHLine((189+(long)(SC_DUTY-1500)*42/500), 130, (42-(long)(SC_DUTY-1500)*42/500), ILI9341_BLUE); tft.drawRect(230, 70, ((long)(SC_DUTY-1500)*41/500+1), 60, ILI9341_BLUE); tft.drawFastHLine(231, 129, ((long)(SC_DUTY-1500)*41/500-1), ILI9341_BLACK); tft.drawFastHLine((230+(long)(SC_DUTY-1500)*41/500), 130, (41-(long)(SC_DUTY-1500)*41/500), ILI9341_BLUE); tft.fillRect(280, 65, 15, 70, ILI9341_BLACK); tft.fillRect(280, (135 - (long)(SC_DUTY-1500)*70/500), 15, ((long)(SC_DUTY-1500)*70/500), ILI9341_BLUE); tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE); tft.fillRect(279, 144, 20, 10, ILI9341_BLACK); tft.setCursor(280, 145); tft.println((SC_DUTY-1500)/5); if(COOLING) { tft.fillCircle(40, 210, 12, ILI9341_BLUE); tft.drawRoundRect(34, 60, 12, 150, 6, ILI9341_BLUE); tft.drawRoundRect(35, 60, 10, 150, 5, ILI9341_BLUE); tft.drawRoundRect(36, 60, 8, 150, 4, ILI9341_BLUE); } else { tft.fillCircle(40, 210, 10, ILI9341_PINK); tft.drawRoundRect(35, 60, 10, 150, 5, ILI9341_PINK); tft.drawRoundRect(36, 60, 8, 150, 4, ILI9341_PINK); } // FET_TMP = random(120); // delete this except for demo purposes tft.fillCircle(40, 210, 8, ILI9341_BLACK); tft.fillRect(37, 70, 6, 150, ILI9341_BLACK); if((FET_TMP < 100) & (FET_TMP > 20)) { // Can't deal with negative numbers very well so limits are offset by +20 tft.fillCircle(40, 210, 8, ILI9341_GREEN); tft.fillRect(37, 209-((long)FET_TMP*140/120), 6, ((long)FET_TMP*140/120), ILI9341_GREEN); } else { tft.fillCircle(40, 210, 8, ILI9341_RED); tft.fillRect(37, 209-((long)FET_TMP*140/120), 6, ((long)FET_TMP*140/120), ILI9341_RED); } return; case 5: /* BATT = random(600, 860); CAPACITY = -35.05*atan(-10*(BATT*5*0.000977)+35.5) + 51; // Comment this out for the real thing */ tft.fillRect(233, 130, 40, 15, ILI9341_BLACK); tft.fillRect(190, 220, 20, 10, ILI9341_BLACK); tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE); tft.setCursor(190, 135); tft.println("BATT ="); tft.setCursor(233, 135); tft.println(BATT*5*7*0.000977); tft.setCursor(263, 135); tft.println("V"); tft.setCursor(200, 220); tft.println(""); tft.setCursor(190, 220); tft.println(CAPACITY); tft.setCursor(210, 220); tft.println("SECONDS"); // AVR_TMP = random(80); // delete this except for demo purposes // PSU_TMP = random(80); tft.fillRect(17, 65, 6, 140, ILI9341_BLACK); tft.fillRect(77, 65, 6, 140, ILI9341_BLACK); if((AVR_TMP < 70) & (AVR_TMP > 20)) { // Can't deal with negative numbers very well so limits are offset by +20 tft.fillCircle(20, 210, 8, ILI9341_GREEN); tft.fillRect(17, 209-(((long)AVR_TMP+10)*155/70), 6, (((long)AVR_TMP+10)*155/70), ILI9341_GREEN); } else { tft.fillCircle(20, 210, 8, ILI9341_RED); tft.fillRect(17, 209-(((long)AVR_TMP+10)*155/70), 6, (((long)AVR_TMP+10)*155/70), ILI9341_RED); } if((PSU_TMP < 70) & (PSU_TMP > 20)) { // Can't deal with negative numbers very well so limits are offset by +20 tft.fillCircle(80, 210, 8, ILI9341_GREEN); tft.fillRect(77, 209-((long)PSU_TMP*140/80), 6, ((long)PSU_TMP*140/80), ILI9341_GREEN); } else { tft.fillCircle(80, 210, 8, ILI9341_RED); tft.fillRect(77, 209-((long)PSU_TMP*140/80), 6, ((long)PSU_TMP*140/80), ILI9341_RED); } tft.fillRect(231, 90, 37, 19, ILI9341_BLACK); if((BATT < 1020) & (BATT > 705)) tft.fillRect(231, (109 -((long)BATT-600)*19/260), 37, (((long)BATT-600)*19/260), ILI9341_GREEN); else tft.fillRect(231, (109 -((long)BATT-600)*19/260), 37, (((long)BATT-600)*19/260), ILI9341_RED); tft.fillRect(176, 90, 37, 19, ILI9341_BLACK); if((BATT < 1020) & (BATT > 705)) tft.fillRect(176, (109 -((long)BATT-600)*19/260), 37, (((long)BATT-600)*19/260), ILI9341_GREEN); else tft.fillRect(176, (109 -((long)BATT-600)*19/260), 37, (((long)BATT-600)*19/260), ILI9341_RED); tft.fillRect(167, 190, 108, 20, ILI9341_BLACK); if(CAPACITY >= 30) tft.fillRect(168, 190, (CAPACITY*0.01*106), 20, ILI9341_GREEN); if((CAPACITY >= 10) & (CAPACITY < 30)) tft.fillRect(168, 190, (CAPACITY*0.01*106), 20, ILI9341_YELLOW); if(CAPACITY < 10) tft.fillRect(168, 190, (CAPACITY*0.01*106), 20, ILI9341_RED); return; case 6: tft.fillRect(74, 54, 30, 42, ILI9341_BLACK); tft.setTextColor(ILI9341_WHITE); tft.setCursor(75,55); tft.println(RPM); tft.setCursor(75,63); tft.println(TPS); tft.setCursor(75,71); tft.println(MAP); tft.setCursor(75,79); tft.println(AFR); tft.setCursor(75,87); tft.println(KR); tft.fillRect(74, 126, 30, 50, ILI9341_BLACK); tft.setCursor(75,127); tft.println(BATT); tft.setCursor(75,135); tft.println(CAPACITY); tft.fillRect(74, 208, 30, 43, ILI9341_BLACK); tft.setCursor(75,208); tft.println(AVR_TMP); tft.setCursor(75,216); tft.println(PSU_TMP); tft.setCursor(75,224); tft.println(FET_TMP); tft.setCursor(75,232); tft.println(COOLING); tft.fillRect(259, 54, 30, 20, ILI9341_BLACK); tft.setCursor(260,55); tft.println(SC_ENABLE); tft.setCursor(260,63); tft.println(SC_DUTY); tft.fillRect(259, 104, 30, 42, ILI9341_BLACK); tft.setCursor(260,105); tft.println(N2O_ENABLE); tft.setCursor(260,113); tft.println(N2O_SWITCH); tft.setCursor(260,121); tft.println(IAT_OVERRIDE); tft.setCursor(260,129); tft.println(N2O_VALVE); tft.fillRect(259, 166, 30, 10, ILI9341_BLACK); tft.setCursor(260,167); tft.println(SYNTH_CODE); return; default: return; } } void update_IO(void) { int tmp; TPS = analogRead(15); COOLING = digitalRead(22); MAP = analogRead(0); SC_ENABLE = digitalRead(42); AFR = analogRead(8); // AFR9 = 144, AFR12.1 = 413 , AFR12.9 = 481, AFR16 = 748 N2O_ENABLE = digitalRead(43); /* CELL1 = analogRead(9); CELL2 = analogRead(10); CELL3 = analogRead(11); CELL4 = analogRead(12); CELL5 = analogRead(13); */ BATT = analogRead(11); tmp = CAPACITY; CAPACITY = -35.05*atan(-10*(BATT*5*0.000977)+35.5) + 51; if(CAPACITY > tmp) CAPACITY = tmp; PSU_TMP = analogRead(1); FET_TMP = analogRead(4); N2O_SWITCH = analogRead(5); RPM = 60.0/((float)ICR4*0.000004); // See if there's a way I can do this without division or floats KR = ICR5*2/350; // 2 coming from the Tiny seems to correspond to 350 here SYNTH_CODE = OCR3A; // faultCheck(); // Restore this when there aren't a million faults due to the unit not connected to all sensors } void faultCheck() { if(PSU_TMP > 800){ // If battery temperature is too high generate a fault OCR3A = 60000; return; } else if(KR > 10){ // If KR is too high generate a fault OCR3A = 56000; return; } else if(FET_TMP > 800){ // If FET temperature is too high generate a fault OCR3A = 52000; return; } else if(AFR > 600){ // If AFR is too lean during boost or spray generate a fault OCR3A = 48000; return; } else if(MAP > 800){ // If boost pressure exceeds 7 PSI generate a fault OCR3A = 44000; return; } else if(BATT < 200){ // If battery undervolt generate a fault OCR3A = 40000; return; } else if(CAPACITY < 15){ // If capacity is low generate a fault OCR3A = 36000; return; } else if(AVR_TMP > 800){ // If Arduino temp is too high generate a fault OCR3A = 32000; return; } else OCR3A = 65000; // If nothing generates a fault, generate the idle code, which does nothing return; // Maybe need a 2nd idle code for when verbose audio is on? } ISR(TIMER4_CAPT_vect) { // 58X crank sensor has 29 holes high and 29 holes low so a falling edge occurs once per revolution, setting ICR4 TCNT4 = 0; // The first thing you do when the capture unit fires the interrupt is clear the counter so it can resume with minimal delay. // No need to do anything else. The count is stored in registers for convenient retrieval } /* ISR (TIMER4_OVF_vect) { // Put code here if you need to handle overflows } */ ISR(TIMER5_CAPT_vect) { // The period of the incoming pulse is directly proportional to the intensity of the knock. // If scaled down to an 8bit number, the period will exactly match the FFT magnitude from the Tiny TCNT5 = 0; // The first thing you do when the capture unit fires the interrupt is clear the counter so it can resume with minimal delay. // No need to do anything else. The count is stored in registers for convenient retrieval } /* ISR (TIMER5_OVF_vect) { // Put code here if you need to handle overflows } */ void tempDecrease() { AVR_TMP--; } void tempIncrease() { AVR_TMP++; } boolean boostCheck() { // Responsible for deciding if all conditions are met for applying boost at all if( (TPS > 921) & (MAP > 921) & (AFR < 500) & (KR < 10) & (PSU_TMP > 80) & (FET_TMP > 80) & (BATT > 22.4) ) return 1; // If the stars align and everything is great, pass the boost check else //Check all values above return 0; // Otherwise fail it } boolean sprayCheck() { // Responsible for deciding if all conditions are met for applying nitrous at all if( (RPM > 3000) & (TPS > 921) & (MAP > 921) & (AFR < 500) & (KR < 10) ) return 1; // If the stars align and everything is great, pass the nitrous check else //Check all values above return 0; // Otherwise fail it } void boostControl(boolean armed) { // Responsible for deciding what boost value to apply and for making the transition byte tmpRPM; if((!armed) & (!SC_out.attached())) // If the SC was already off and is still off, then do nothing and return return; if((!armed) & (SC_out.attached())) { // If the SC was running and is now off, bring it to idle and shut down SC_out.write(1500); delay(100); SC_out.detach(); return; } if((armed) & (!SC_out.attached())) { // If the SC was not running but now should be, attach it to pin 9 and idle it. SC_out.attach(9); SC_out.write(1500); } if((armed) & (SC_out.attached())) { // If the SC was running and should remain running, decide how much boost to apply tmpRPM = RPM/100; // Grab the first 2 digits of the RPM and truncate the rest - gives the array index number we want boostCheck(); // Now it's serious. Check if you can apply REAL boost if((tmpRPM >= 22) & (boostCheck())) { if(SC_BASE_DUTY[tmpRPM] > SC_DUTY) SC_out.write(++SC_DUTY); if(SC_BASE_DUTY[tmpRPM] < SC_DUTY) SC_out.write(--SC_DUTY); } else { // If RPM too low for boost or the boost check fails for some reason if((SC_spool) & (SC_DUTY < 1600)) // If spooling is on and SC is under spool speed SC_out.write(++SC_DUTY); // Increase and write new duty to SC if((SC_spool) & (SC_DUTY > 1600)) // If spooling is on and SC is over spool speed SC_out.write(--SC_DUTY); // Decrease and write new duty to SC if((!SC_spool) & (SC_DUTY < 1500)) // If spooling is off and SC is under idle speed SC_out.write(++SC_DUTY); // Increase and write new duty to SC if((!SC_spool) & (SC_DUTY > 1500)) // If spooling is off and SC is over idle speed SC_out.write(--SC_DUTY); // Decrease and write new duty to SC return; } } return; } void sprayControl(boolean armed) { // Responsible for deciding what whether or not to spray nitrous if((armed) & (sprayCheck()) & (!N2O_SWITCH)) { // If the system is armed, the conditions are right and the control is automatic, open the valve IAT_OVERRIDE = 1; // Tell the PCM to inject more fuel N2O_VALVE = 1; // Spray nitrous return; } else // Otherwise if((armed) & (N2O_SWITCH) & (analogRead(A5) < 500)) { // if the system is armed, control is manual and the button is depressed, open the valve IAT_OVERRIDE = 1; // Tell the PCM to inject more fuel N2O_VALVE = 1; // Spray nitrous return; } else { // Otherwise if neither of these conditions are met N2O_VALVE = 0; // Close the nitrous valve IAT_OVERRIDE = 0; // Ruturn to normal fueling return; } }