А на С++ оверклокать вроде можно аж до 300 мегагерц, оценивал только по работающему или нет дисплею, скорость шины SPI снижал значительно, на порядок...
Осталось найти где в драйверах задаётся скорость шины, под микропитоном при инициализации SPI прямо в строке инициализации
было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует
Можно, если размер кадра сдуть до 128*64 или 64*64.
нашёл скетч под mbed ядро там три картинки полноцветные, тестирование показало, что этот SPI самый медленный.
Итоги по скорости SPI (из коробки)
1. microPython - 22MHz
2. ядро Фила - 12MHz (было зажато в библиотеке GFX- удалось выжать 25MHz при частоте процессора 133MHz)
3. Mbed - софтовый 400KHz (хард привязан к SPI0 без переделки схемы не проверить, точнее изучать надо, пока не востребовано)
Честно говоря, как-то не вижу практического смысла в псевдораскраске монохромного изображения.
Если кто-то сможет объяснить - с удовольствием выслушаю.
А вот поднимавшийся в теме вопрос производительности, на мой взгляд, с практической точки зрения гораздо важнее.
Хочу показать один из возможных вариантов вывода картинки с перекодировкой одноразрядного цвета в 16-разрядный.
Дисплей, правда, какой оказался под рукой. А оказался 3.3-вольтовый 220х176 с параллельным интерфейсом. Параллельный, конечно, быстрее. Но, учитывая, что с одной стороны вся реализация протокола сугубо софтверная (против аппаратного SPI), а с другой - что у 328 при использовании COM-порта нет ни одного полного 8-разрядного порта, и "порт" приходится комбинировать из двух посредством битовых операций, разница с аппаратным SPI получается не очень большой.
Ну а если учесть, что в связи с 3-вольтовостью дисплея был использован Pro Mini 3.3V 8 MHz, частоту вывода порядка 10 fps можно считать вполне приемлемой.
Базовый пример заработал. Мне не хватило фантазии догадаться что в аргументах надо drawBitmap_(0,0,ris_1,128,160,COL1,COL1,COL3,COL3); я упрямо писал drawBitmap_(0,0,ris_1,128,160,COL1(),COL1(),COL3(),COL3());
// РИСУНОК контур - 4 цвета
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
extern const unsigned char ris_1[];
int i, j;// пришлось вынести из функции отрисовки картинки
void setup(void) {
// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
tft.fillScreen(ST7735_BLACK);
tft.setRotation(0);//ориентация экрана
}
void loop() {
drawBitmap_(0,0,ris_1,128,160,COL1,COL1,COL3,COL3);
delay(500);
drawBitmap_(0,0,ris_1,128,160,COL2,COL2,COL4,COL4);
delay(500);
}
/////////////////////////////////////////////////////////////////////
void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,const uint16_t (*COLor_1)(),const uint16_t (*COLor_2)(),const uint16_t (*COLor_3)(),const uint16_t (*COLor_4)()) {
bool flag=true;//
if(x<0||x+w>128||y<0||y+h>160){return;}
tft.setAddrWindow(x,y,x+w-1,y+h-1);
int byteWidth = (w + 7) / 8;
uint8_t byte_;uint8_t byte_st;
//
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
digitalWrite(TFT_DC, HIGH);
digitalWrite(TFT_CS, LOW);
for(j=0; j<h; j++) {
for(i=0; i<w; i++) {
if(i & 7) {byte_ <<= 1;byte_st <<= 1;}
else { byte_ = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}}
if(byte_ & 0x80)
{
if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3()>>8);SPI.transfer(COLor_3());}//цвет контура левого верхнего плана
else { SPI.transfer(COLor_1()>>8);SPI.transfer(COLor_1());}// цвет раскраски внутри контура
flag=false;
}
else {
if(!flag||byte_st & 0x80){SPI.transfer(COLor_4()>>8);SPI.transfer(COLor_4());}//цвет контура правого нижнего плана
else {SPI.transfer(COLor_2()>>8);SPI.transfer(COLor_2());} // цвет фона
flag=true;
}
}
}
digitalWrite(TFT_CS, HIGH);
SPI.endTransaction();
///
}
/////////////////////////////////////////////////////////////////////
//варианты функций - раскрасок
const uint16_t COL1(){// 1 позиция в аргументах - цвет раскраски изображения внутри контура
return tft.Color565(255-j,j,0);
}
const uint16_t COL2(){// 2 позиция в аргументах - цвет фона
return tft.Color565(235-j,j+50,0);
}
const uint16_t COL3(){//3 позиция в аргументах - цвет контура левого верхнего плана
return tft.Color565(255,255,155);
}
const uint16_t COL4(){//4 позиция в аргументах - цвет контура правого нижнего плана
return tft.Color565(0,0,0);
}
/////////////////////////////////////////////////////////////////////
Вы хотите сказать, что два вышеприведенные изображения эквивалентны?
......
Отож!
Т.е. цель не достигается. Тогда зачем все это?
Они определённым образом имеют сходства. Изначально, цель из Ч/Б изображения получать цветное. - т.е. заведомо эквивалента нет. Но идея с расширением целей по мере увязания в болоте мне ясна :) Т.е. исходник берём цветной и как то его выводим на экран.
Что касается функций - все цели операции достигнуты, подсказали как правильно сделать.
Оказывается можно значения локальных переменных одних функций передавать другим функциям (счётчики i и j - задание цвета от его положения)
// РИСУНОК контур 4 цвета
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
extern const unsigned char ris_1[];
void setup(void) {
// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
tft.fillScreen(ST7735_BLACK);
tft.setRotation(0);//ориентация экрана
}
void loop() {
drawBitmap_(0,0,ris_1,128,160,COL1,COL2,COL3,COL4);
delay(500);
}
/////////////////////////////////////////////////////////////////////
void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,const uint16_t (*COLor_1)(int &i,int &j),const uint16_t (*COLor_2)(int &i,int &j),const uint16_t (*COLor_3)(int &i,int &j),const uint16_t (*COLor_4)(int &i,int &j)) {
bool flag=true;//
if(x<0||x+w>128||y<0||y+h>160){return;}
tft.setAddrWindow(x,y,x+w-1,y+h-1);
int byteWidth = (w + 7) / 8;
uint8_t byte_;uint8_t byte_st;
//
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
digitalWrite(TFT_DC, HIGH);
digitalWrite(TFT_CS, LOW);
for(int j=0; j<h; j++) {
for( int i=0; i<w; i++) {
if(i & 7) {byte_ <<= 1;byte_st <<= 1;}
else { byte_ = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}}
if(byte_ & 0x80)
{
if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3(i,j)>>8);SPI.transfer(COLor_3(i,j));}//цвет контура левого верхнего плана
else { SPI.transfer(COLor_1(i,j)>>8);SPI.transfer(COLor_1(i,j));}// цвет раскраски внутри контура
flag=false;
}
else {
if(!flag||byte_st & 0x80){SPI.transfer(COLor_4(i,j)>>8);SPI.transfer(COLor_4(i,j));}//цвет контура правого нижнего плана
else {SPI.transfer(COLor_2(i,j)>>8);SPI.transfer(COLor_2(i,j));} // цвет фона
flag=true;
}
}
}
digitalWrite(TFT_CS, HIGH);
SPI.endTransaction();
///
}
/////////////////////////////////////////////////////////////////////
//варианты функций - раскрасок
const uint16_t COL1(int &i,int &j){// 1 позиция в аргументах - цвет раскраски изображения внутри контура
return tft.Color565(255-j/2,190-j,0);
}
const uint16_t COL2(int &i,int &j){// 2 позиция в аргументах - цвет фона
return tft.Color565(225-i/2,160-i,0);
}
const uint16_t COL3(int &i,int &j){// 3 позиция в аргументах - цвет контура левого верхнего плана
return tft.Color565(200,200,100);
}
const uint16_t COL4(int &i,int &j){// 4 позиция в аргументах - цвет контура правого нижнего плана
return tft.Color565(75,75,75);
}
/////////////////////////////////////////////////////////////////////
Но самое смешное, что я в аргументах основной функции ссылаюсь или указываю на переменные которые только будут в ней объявлены. И это работает, хоть и алогично.
я не пробовал больше, надо в библиотеке (Adafruit_GFX) частоту поправить, по идее должна работать и 33.250MHZ и на 66.5MHz
В ядре 2.5.4 изменили структуру каталогов, теперь установки хард SPI тут - arduino-1.8.19/portable/packages/rp2040/hardware/rp2040/2.5.4/ArduinoCore-API/api/
абстрактно - да, нагруженный - что-то уже сомневаюсь, падают уровни, довольно сильно, на 30 мегагерцах CLK уже порядка 2.2 вольта
И таки да, ядро не умеет быстрее 40 наносекунд, взял скетч прекрасно это делающий под ядром MBED, а вот под 2.5.4...
Учитывая, что изначально HARDWARE SPI заточен на частоту 4 Мегагерца, крутить кино на этой плате никто не собирался...
("не для того мама доченьку растила")
SPI - это последовательный интерфейс, если кто не знает.
не думал, что это секрет )))
PS попробовал для RP2040 другую библиотеку TFT_eSPI, результат прежний CLK 40 наносекунд...
значит дальнейшее ускорение через правку чего-то в ядре фила
Если кому-то понадобится конфигурационный файл User_Setup.h для ST7735 1.8" SPI 128*160
// TO RP2040 & ST7735 (SPI1)
//
// USER DEFINED SETTINGS
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// See the User_Setup_Select.h file if you wish to be able to define multiple
// setups and then easily select which setup file is used by the compiler.
//
// If this file is edited correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// Note that some sketches are designed for a particular TFT pixel width/height
// User defined information reported by "Read_User_Setup" test & diagnostics example
#define USER_SETUP_INFO "User_Setup"
// Define to disable all #warnings in library (can be put in User_Setup_Select.h)
//#define DISABLE_ALL_LIBRARY_WARNINGS
// ##################################################################################
//
// Section 1. Call up the right driver file and any options for it
//
// ##################################################################################
// Define STM32 to invoke optimised processor support (only for STM32)
//#define STM32
// Defining the STM32 board allows the library to optimise the performance
// for UNO compatible "MCUfriend" style shields
//#define NUCLEO_64_TFT
//#define NUCLEO_144_TFT
// STM32 8 bit parallel only:
// If STN32 Port A or B pins 0-7 are used for 8 bit parallel data bus bits 0-7
// then this will improve rendering performance by a factor of ~8x
//#define STM_PORTA_DATA_BUS
//#define STM_PORTB_DATA_BUS
// Tell the library to use parallel mode (otherwise SPI is assumed)
//#define TFT_PARALLEL_8_BIT
//#defined TFT_PARALLEL_16_BIT // **** 16 bit parallel ONLY for RP2040 processor ****
// Display type - only define if RPi display
//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER // Generic driver for common displays
//#define ILI9341_2_DRIVER // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172
#define ST7735_DRIVER // Define additional parameters below for this display
//#define ILI9163_DRIVER // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
//#define ST7796_DRIVER
//#define SSD1351_DRIVER
//#define SSD1963_480_DRIVER
//#define SSD1963_800_DRIVER
//#define SSD1963_800ALT_DRIVER
//#define ILI9225_DRIVER
//#define GC9A01_DRIVER
// Some displays support SPI reads via the MISO pin, other displays have a single
// bi-directional SDA pin and the library will try to read this via the MOSI line.
// To use the SDA line for reading data from the TFT uncomment the following line:
// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 and GC9A01 display only
// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display
#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below
// #define M5STACK
// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH 80
#define TFT_WIDTH 128
// #define TFT_WIDTH 172 // ST7789 172 x 320
// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320
#define TFT_HEIGHT 160
// #define TFT_HEIGHT 128
// #define TFT_HEIGHT 240 // ST7789 240 x 240
// #define TFT_HEIGHT 320 // ST7789 240 x 320
// #define TFT_HEIGHT 240 // GC9A01 240 x 240
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or stray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128 // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
#define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset
// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.
// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF
// ##################################################################################
//
// Section 2. Define the pins that are used to interface with the display here
//
// ##################################################################################
// If a backlight control signal is available then define the TFT_BL pin in Section 2
// below. The backlight will be turned ON when tft.begin() is called, but the library
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
// sketch. e.g. with digitalWrite(TFT_BL, LOW);
// #define TFT_BL 32 // LED back-light control pin
// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW)
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for ESP8266 NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labelled AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######
// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
// but saves pins for other functions. It is best not to connect MISO as some displays
// do not tristate that line when chip select is high!
// Note: Only one SPI device can share the FLASH SPI lines, so a SPI touch controller
// cannot be connected as well to the same SPI signals.
// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS PIN_D3
//#define TFT_DC PIN_D5 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 15 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// For ESP32 Dev board (only tested with GC9A01 display)
// The hardware SPI can be mapped to any pins
//#define TFT_MOSI 15 // In some display driver board, it might be written as "SDA" and so on.
//#define TFT_SCLK 14
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 27 // Data Command control pin
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 22 // LED back-light
//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// For the M5Stack module use these #define lines
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 14 // Chip select control pin
//#define TFT_DC 27 // Data Command control pin
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 32 // LED back-light (required for M5Stack)
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
// The library supports 8 bit parallel TFTs with the ESP32, the pin
// selection below is compatible with ESP32 boards in UNO format.
// Wemos D32 boards need to be modified, see diagram in Tools folder.
// Only ILI9481 and ILI9341 based displays have been tested!
// Parallel bus is only supported for the STM32 and ESP32
// Example below is for ESP32 Parallel interface with UNO displays
// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed)
//#define TFT_PARALLEL_8_BIT
// The ESP32 and TFT the pins used for testing are:
//#define TFT_CS 33 // Chip select control pin (library pulls permanently low
//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
//#define TFT_RST 32 // Reset pin, toggles on startup
//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
//#define TFT_RD 2 // Read strobe control pin
//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
//#define TFT_D1 13 // so a single register write sets/clears all bits.
//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect
//#define TFT_D3 25 // TFT screen update performance.
//#define TFT_D4 17
//#define TFT_D5 16
//#define TFT_D6 27
//#define TFT_D7 14
// ###### EDIT THE PINs BELOW TO SUIT YOUR STM32 SPI TFT SETUP ######
// The TFT can be connected to SPI port 1 or 2
//#define TFT_SPI_PORT 1 // SPI port 1 maximum clock rate is 55MHz
//#define TFT_MOSI PA7
//#define TFT_MISO PA6
//#define TFT_SCLK PA5
//#define TFT_SPI_PORT 2 // SPI port 2 maximum clock rate is 27MHz
//#define TFT_MOSI PB15
//#define TFT_MISO PB14
//#define TFT_SCLK PB13
// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select
//#define TFT_CS D5 // Chip select control pin to TFT CS
//#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select)
//#define TFT_RST D7 // Reset pin to TFT RST (or RESET)
// OR alternatively, we can use STM32 port reference names PXnn
//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5
//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6
//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset
// Use an Arduino pin for initial testing as connecting to processor reset
// may not work (pulse too short at power up?)
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT
// ##################################################################################
//
// Section 4. Other options
//
// ##################################################################################
// For RP2040 processor and SPI displays, uncomment the following line to use the PIO interface.
//#define RP2040_PIO_SPI // Leave commented out to use standard RP2040 SPI port interface
// For the RP2040 processor define the SPI port channel used (default 0 if undefined)
#define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used
#define TFT_MISO 12
#define TFT_MOSI 15
#define TFT_SCLK 14
#define TFT_CS 13 // Chip select control pin
#define TFT_DC 11 // Data Command control pin
#define TFT_RST 10 // Reset pin (could connect to RST pin)
// For the STM32 processor define the SPI port channel used (default 1 if undefined)
//#define TFT_SPI_PORT 2 // Set to 1 for SPI port 1, or 2 for SPI port 2
// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display 27 MHz works OK.
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
// #define SPI_FREQUENCY 27000000
#define SPI_FREQUENCY 33000000
// #define SPI_FREQUENCY 40000000
// #define SPI_FREQUENCY 55000000 // STM32 SPI1 only (SPI2 maximum is 27MHz)
// #define SPI_FREQUENCY 67000000 (на ядре Фила не отрабатывает)
// #define SPI_FREQUENCY 80000000
// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY 20000000
// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
#define SPI_TOUCH_FREQUENCY 2500000
// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line:
//#define USE_HSPI_PORT
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// Transaction support is required if other SPI devices are connected.
// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect
// #define SUPPORT_TRANSACTIONS
void Adafruit_SPITFT::startWrite(void) {
SPI_BEGIN_TRANSACTION();
if (_cs >= 0)
SPI_CS_LOW();
}
/*!
@brief Call after issuing command(s) or data to display. Performs
chip-deselect (if required) and ends an SPI transaction (if
using hardware SPI and transactions are supported). Required
for all display types; not an SPI-specific function.
*/
void Adafruit_SPITFT::endWrite(void) {
if (_cs >= 0)
SPI_CS_HIGH();
SPI_END_TRANSACTION();
}
Дернуть CS достаточно - у вас же уже инициализация дисплея уже прошла, значит SPI уже запущен.
tft.setAddrWindow(x, y, w, h); у вас оказался выше и не передался на устройство !!! и при этом напишите tft.setAddrWindow(x, y, w, h); в стиле вашей библиотеки = скопируйте из вашего скетча.
Почему вами используется не актуальная версия библиотеки ???
Теперь просто белый экран. tft.setAddrWindow(x, y, w, h); он же вроде самодостаточен в рамках библиотеки. Старая библиотека... не знаю откуда она у меня бралась. Как экранчик заработал так и пошло по накатанной.
А на С++ оверклокать вроде можно аж до 300 мегагерц, оценивал только по работающему или нет дисплею, скорость шины SPI снижал значительно, на порядок...
Осталось найти где в драйверах задаётся скорость шины, под микропитоном при инициализации SPI прямо в строке инициализации
коды цветов
Вот для AVR SPI 8 МГц вывод буфера из flash и ram на максимальной скорости:
void writebuff(const uint8_t buff[], uint16_t count) { while (count--) { SPDR=pgm_read_byte(buff++); asm volatile("RJMP .+0"); asm volatile("RJMP .+0"); asm volatile("RJMP .+0"); } } void writebuff(uint8_t buff[], uint16_t count) { while (count--) { SPDR=buff++[0]; asm volatile("RJMP .+0"); asm volatile("RJMP .+0"); asm volatile("RJMP .+0"); asm volatile("NOP"); } }GOLD явно какой-то странный.
выдрал в скетче на питоне, согласен, как-бы не яркий белый должен быть
GOLD явно какой-то странный.
выдрал в скетче на питоне, согласен, как-бы не яркий белый должен быть
и совпадает с GRAY из этой же таблицы ...
Вот для AVR SPI 8 МГц вывод буфера из flash и ram на максимальной скорости:
void writebuff(const uint8_t buff[], uint16_t count) { while (count--) { SPDR=pgm_read_byte(buff++); asm volatile("RJMP .+0"); asm volatile("RJMP .+0"); asm volatile("RJMP .+0"); } } void writebuff(uint8_t buff[], uint16_t count) { while (count--) { SPDR=buff++[0]; asm volatile("RJMP .+0"); asm volatile("RJMP .+0"); asm volatile("RJMP .+0"); asm volatile("NOP"); } }Это получается можно сделать ещё быстрее вывод картинки?
Я всё же не поленился и перемножил 9 кадров в секунду на ... и получил около 3 МГц :)
и совпадает с GRAY из этой же таблицы ...
мало ли в Бразилии Педров )))
ЗЫ с SPI почти разобрался (на 90% точно) ...сам был злобный буратино...всё регулируется если правильно библиотекой пользоваться... )))
5 МГц съедают ваши раскраски и перевод из битов в байты цвета ...
Была бы MEGA - можно было бы весь кадр в цвете послать за раз на скорости ~8 МГц
было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует
было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует
Можно, если размер кадра сдуть до 128*64 или 64*64.
было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует
Можно, если размер кадра сдуть до 128*64 или 64*64.
нашёл скетч под mbed ядро там три картинки полноцветные, тестирование показало, что этот SPI самый медленный.
Итоги по скорости SPI (из коробки)
1. microPython - 22MHz
2. ядро Фила - 12MHz (было зажато в библиотеке GFX- удалось выжать 25MHz при частоте процессора 133MHz)
3. Mbed - софтовый 400KHz (хард привязан к SPI0 без переделки схемы не проверить, точнее изучать надо, пока не востребовано)
:)
А я пытаюсь в функцию в качестве аргумента вставить функцию ... и не работает, но компилируется.
// РИСУНОК контур 4 цвета #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library #include <SPI.h> #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); extern const unsigned char ris_1[]; int i, j;// пришлось вынести из функции отрисовки картинки void setup(void) { // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab tft.fillScreen(ST7735_BLACK); tft.setRotation(0);//ориентация экрана } void loop() { drawBitmap_(0,0,ris_1,128,160,COLor1(),COLor2(),COLor3(),COLor4()); delay(200); } ///////////////////////////////////////////////////////////////////// void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,const uint16_t (*COLor_1)(),const uint16_t (*COLor_2)(),const uint16_t (*COLor_3)(),const uint16_t (*COLor_4)()) { bool flag=true;// if(x<0||x+w>128||y<0||y+h>160){return;} tft.setAddrWindow(x,y,x+w-1,y+h-1); int byteWidth = (w + 7) / 8; uint8_t byte_;uint8_t byte_st; // SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(TFT_DC, HIGH); digitalWrite(TFT_CS, LOW); for(j=0; j<h; j++) { for(i=0; i<w; i++) { if(i & 7) {byte_ <<= 1;byte_st <<= 1;} else { byte_ = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}} if(byte_ & 0x80) { if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3()>>8);SPI.transfer(COLor_3());}//цвет контура левого верхнего плана else { SPI.transfer(COLor_1()>>8);SPI.transfer(COLor_1());}// цвет раскраски внутри контура flag=false; } else { if(!flag||byte_st & 0x80){SPI.transfer(COLor_4()>>8);SPI.transfer(COLor_4());}//цвет контура правого нижнего плана else {SPI.transfer(COLor_2()>>8);SPI.transfer(COLor_2());} // цвет фона flag=true; } } } digitalWrite(TFT_CS, HIGH); SPI.endTransaction(); /// } ///////////////////////////////////////////////////////////////////// const uint16_t COLor1(){//цвет раскраски изображения внутри контура return tft.Color565(255-j,j,0); } const uint16_t COLor2(){// цвет фона return tft.Color565(235-j,j+50,0); } const uint16_t COLor3(){//цвет контура левого верхнего плана return tft.Color565(255,255,155); } const uint16_t COLor4(){//цвет контура правого нижнего плана return tft.Color565(0,0,0); } /////////////////////////////////////////////////////////////////////Чего то сегодня олимпиада вспомнилась...
Честно говоря, как-то не вижу практического смысла в псевдораскраске монохромного изображения.
Если кто-то сможет объяснить - с удовольствием выслушаю.
А вот поднимавшийся в теме вопрос производительности, на мой взгляд, с практической точки зрения гораздо важнее.
Хочу показать один из возможных вариантов вывода картинки с перекодировкой одноразрядного цвета в 16-разрядный.
Дисплей, правда, какой оказался под рукой. А оказался 3.3-вольтовый 220х176 с параллельным интерфейсом. Параллельный, конечно, быстрее. Но, учитывая, что с одной стороны вся реализация протокола сугубо софтверная (против аппаратного SPI), а с другой - что у 328 при использовании COM-порта нет ни одного полного 8-разрядного порта, и "порт" приходится комбинировать из двух посредством битовых операций, разница с аппаратным SPI получается не очень большой.
Ну а если учесть, что в связи с 3-вольтовостью дисплея был использован Pro Mini 3.3V 8 MHz, частоту вывода порядка 10 fps можно считать вполне приемлемой.
// Arduino Pro or Pro Mini // Atmega328P (3.3 v, 8 MHz) // 220x176 #include "UTFT.h" #include "pictures.h" extern uint8_t SmallFont[]; // GND -- GND // 3V3 -- 3.3V // CS -- A3 // RS -- A2 // WR -- A1 // RD -- 3.3V // RST -- A0 // LED -- GND // DB0 -- 8 // DB1 -- 9 // DB2 -- 2 // DB3 -- 3 // DB4 -- 4 // DB5 -- 5 // DB6 -- 6 // DB7 -- 7 // // Remember to change the model parameter to suit your display module! #define LCD_CS A3 // Chip Select goes to Analog 3 #define LCD_RS A2 // Command/Data goes to Analog 2 #define LCD_WR A1 // LCD Write goes to Analog 1 #define LCD_RST A0 // UTFT tft(LGDP4524,LCD_RS,LCD_WR,LCD_CS,LCD_RST); void setup() { pinMode(13, OUTPUT); digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200); digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); Serial.begin(115200); Serial.println("Start LGDP4524"); delay(100); randomSeed(analogRead(0)); tft.InitLCD(); tft.setFont(SmallFont); } uint16_t pattern1[] = { 0x0000, 0x0000, 0x0000, 0x0000, // 0 = 0000 0x0000, 0x0000, 0x0000, 0xffff, // 1 = 0001 0x0000, 0x0000, 0xffff, 0x0000, // 2 = 0010 0x0000, 0x0000, 0xffff, 0xffff, // 3 = 0011 0x0000, 0xffff, 0x0000, 0x0000, // 4 = 0100 0x0000, 0xffff, 0x0000, 0xffff, // 5 = 0101 0x0000, 0xffff, 0xffff, 0x0000, // 6 = 0110 0x0000, 0xffff, 0xffff, 0xffff, // 7 = 0111 0xffff, 0x0000, 0x0000, 0x0000, // 8 = 1000 0xffff, 0x0000, 0x0000, 0xffff, // 9 = 1001 0xffff, 0x0000, 0xffff, 0x0000, // a = 1010 0xffff, 0x0000, 0xffff, 0xffff, // b = 1011 0xffff, 0xffff, 0x0000, 0x0000, // c = 1100 0xffff, 0xffff, 0x0000, 0xffff, // d = 1101 0xffff, 0xffff, 0xffff, 0x0000, // e = 1110 0xffff, 0xffff, 0xffff, 0xffff}; // f = 1111 void setPixel(word color) { PORTB = (color>>8) & 0x3; PORTD = (color>>8) & 0xFD; PORTC &= 0xfd; // WR = A1 PORTC |= 0x02; // WR = A1 PORTB = (color&0xFF) & 0x3; PORTD = (color&0xFF) & 0xFD; PORTC &= 0xfd; // WR = A1 PORTC |= 0x02; // WR = A1 } void inline draw8pix(uint8_t b) { uint8_t register bb = (b >> 4) * 4; setPixel(pattern1[bb++]); setPixel(pattern1[bb++]); setPixel(pattern1[bb++]); setPixel(pattern1[bb]); bb = (b & 0x0f) * 4; setPixel(pattern1[bb++]); setPixel(pattern1[bb++]); setPixel(pattern1[bb++]); setPixel(pattern1[bb]); } void loop() { static int n = 0; static int oldTime; Serial.print("Step "); Serial.print(n++); Serial.print(", time: "); Serial.println(millis() - oldTime - 1000); oldTime = millis(); int t0 = millis(); tft.clrScr(); int t1 = millis(); tft.print("ABCDEFGHIJKLMNOPQ", 1, 0); tft.print("ABCDEFGHIJKLMNOPQ", 9, 16); tft.print("ABCDEFGHIJKLMNOPQ", 17, 32); tft.print("ABCDEFGHIJKLMNOPQ", 25, 48); tft.print("ABCDEFGHIJKLMNOPQ", 33, 64); tft.print("ABCDEFGHIJKLMNOPQ", 41, 80); tft.print("ABCDEFGHIJKLMNOPQ", 49, 96); tft.print("ABCDEFGHIJKLMNOPQ", 57, 112); tft.print("ABCDEFGHIJKLMNOPQ", 65, 128); tft.print("ABCDEFGHIJKLMNOPQ", 73, 144); int t2 = millis(); const unsigned char * ris; static int nn = 0; switch(n & 3) { case 0 : ris = ris_1; break; case 1 : ris = ris_2; break; case 2 : ris = ris_3; break; case 3 : ris = ris_4; break; } PORTC &= 0xf7; // CS = A3 tft.setXY(0, 0, 159, 127); for(int i = 0; i < (128*160)/8; i++) { draw8pix(pgm_read_byte(ris + i)); //&data[(ty*sx)+tx])); } PORTC |= 0x08; // CS = A3 int t3 = millis(); tft.print("Clr:", 0, 161); tft.printNumI(t1-t0, 32, 161); // очистка экрана ~228мс (6 мкс/пиксель) tft.print(",Text:", 56, 161); tft.printNumI(t2-t1, 104, 161); // 10 строк по 18 символов ~527мс (2.93мс/символ ~30 мкс/пискель) tft.print(",Draw:", 128, 161); tft.printNumI(t3-t2, 176, 161); // 20480 пикселей за 102 мс - менее 40 тактов (5 мкс) на пиксель delay (1000); }Собственно вывод с перекодировкой осуществляется в строках 128-133 и 54-94.
Для сравнения приводится примерно такой же по количеству пикселей вывод текста стандартными средствами библиотеки. Занимает в 5 раз больше времени.
Честно говоря, как-то не вижу практического смысла в псевдораскраске монохромного изображения.
Если кто-то сможет объяснить - с удовольствием выслушаю.
:)
А как вы в про мини 168 сделаете электронную версию значка?, иными подходами.
// РИСУНОК контур 4 цвета #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library #include <SPI.h> #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); extern const unsigned char ris_1[]; int i, j;// пришлось вынести из функции отрисовки картинки void setup(void) { // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab tft.fillScreen(ST7735_BLACK); tft.setRotation(0);//ориентация экрана } void loop() { drawBitmap_(0,0,ris_1,128,160); delay(200); } ///////////////////////////////////////////////////////////////////// void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h) { bool flag=true;// if(x<0||x+w>128||y<0||y+h>160){return;} tft.setAddrWindow(x,y,x+w-1,y+h-1); int byteWidth = (w + 7) / 8; uint8_t byte_;uint8_t byte_st; // SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(TFT_DC, HIGH); digitalWrite(TFT_CS, LOW); for(j=0; j<h; j++) { for(i=0; i<w; i++) { if(i & 7) {byte_ <<= 1;byte_st <<= 1;} else { byte_ = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}} if(byte_ & 0x80) { if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3()>>8);SPI.transfer(COLor_3());}//цвет контура левого верхнего плана else { SPI.transfer(COLor_1()>>8);SPI.transfer(COLor_1());}// цвет раскраски внутри контура flag=false; } else { if(!flag||byte_st & 0x80){SPI.transfer(COLor_4()>>8);SPI.transfer(COLor_4());}//цвет контура правого нижнего плана else {SPI.transfer(COLor_2()>>8);SPI.transfer(COLor_2());} // цвет фона flag=true; } } } digitalWrite(TFT_CS, HIGH); SPI.endTransaction(); /// } ///////////////////////////////////////////////////////////////////// const uint16_t COLor_1(){//цвет раскраски изображения внутри контура return tft.Color565(150-i,100-i/1.5,50); } const uint16_t COLor_2(){// цвет фона if(i<35||i>84||j<75||j>145||(i>=35&&i<45&&j>135)){return tft.Color565(245-i,165-j/2,0);} else{return tft.Color565(200-1.6*j,140,170);} } const uint16_t COLor_3(){//цвет контура левого верхнего плана return tft.Color565(255,255,50); } const uint16_t COLor_4(){//цвет контура правого нижнего плана return tft.Color565(0,0,0); } /////////////////////////////////////////////////////////////////////Другой вопрос как вставить аргументами конкретные функции раскраски в функцию вывода картинки...хотя ответ на этом форуме мне попадался - никак :)
Другой вопрос как вставить аргументами конкретные функции раскраски в функцию вывода картинки...хотя ответ на этом форуме мне попадался - никак :)
Ну вы не там ищете видимо ...
https://wokwi.com/projects/343480636730770003
Другой вопрос как вставить аргументами конкретные функции раскраски в функцию вывода картинки...хотя ответ на этом форуме мне попадался - никак :)
Ну вы не там ищете видимо ...
https://wokwi.com/projects/343480636730770003
я еще кофе с утра не попил...не соображу никак )))
Если надо и параметры передать, то
void red(unsigned long d) { digitalWrite(3, HIGH); delay(d); digitalWrite(3, LOW); } void green(unsigned long d) { digitalWrite(2, HIGH); delay(d); digitalWrite(2, LOW); } void blink(void userfunc(unsigned long), unsigned long d) { userfunc(d); } void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); } void loop() { blink(red,200); blink(green,1000); }Евгений Петрович нас в угол поставит и скажет как писать АБСОЛЮТНО верно !
Базовый пример заработал. Мне не хватило фантазии догадаться что в аргументах надо drawBitmap_(0,0,ris_1,128,160,COL1,COL1,COL3,COL3); я упрямо писал drawBitmap_(0,0,ris_1,128,160,COL1(),COL1(),COL3(),COL3());
// РИСУНОК контур - 4 цвета #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library #include <SPI.h> #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); extern const unsigned char ris_1[]; int i, j;// пришлось вынести из функции отрисовки картинки void setup(void) { // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab tft.fillScreen(ST7735_BLACK); tft.setRotation(0);//ориентация экрана } void loop() { drawBitmap_(0,0,ris_1,128,160,COL1,COL1,COL3,COL3); delay(500); drawBitmap_(0,0,ris_1,128,160,COL2,COL2,COL4,COL4); delay(500); } ///////////////////////////////////////////////////////////////////// void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,const uint16_t (*COLor_1)(),const uint16_t (*COLor_2)(),const uint16_t (*COLor_3)(),const uint16_t (*COLor_4)()) { bool flag=true;// if(x<0||x+w>128||y<0||y+h>160){return;} tft.setAddrWindow(x,y,x+w-1,y+h-1); int byteWidth = (w + 7) / 8; uint8_t byte_;uint8_t byte_st; // SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(TFT_DC, HIGH); digitalWrite(TFT_CS, LOW); for(j=0; j<h; j++) { for(i=0; i<w; i++) { if(i & 7) {byte_ <<= 1;byte_st <<= 1;} else { byte_ = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}} if(byte_ & 0x80) { if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3()>>8);SPI.transfer(COLor_3());}//цвет контура левого верхнего плана else { SPI.transfer(COLor_1()>>8);SPI.transfer(COLor_1());}// цвет раскраски внутри контура flag=false; } else { if(!flag||byte_st & 0x80){SPI.transfer(COLor_4()>>8);SPI.transfer(COLor_4());}//цвет контура правого нижнего плана else {SPI.transfer(COLor_2()>>8);SPI.transfer(COLor_2());} // цвет фона flag=true; } } } digitalWrite(TFT_CS, HIGH); SPI.endTransaction(); /// } ///////////////////////////////////////////////////////////////////// //варианты функций - раскрасок const uint16_t COL1(){// 1 позиция в аргументах - цвет раскраски изображения внутри контура return tft.Color565(255-j,j,0); } const uint16_t COL2(){// 2 позиция в аргументах - цвет фона return tft.Color565(235-j,j+50,0); } const uint16_t COL3(){//3 позиция в аргументах - цвет контура левого верхнего плана return tft.Color565(255,255,155); } const uint16_t COL4(){//4 позиция в аргументах - цвет контура правого нижнего плана return tft.Color565(0,0,0); } /////////////////////////////////////////////////////////////////////Добавив () вы не указатель передали, а пытались вызвать именно в этом месте саму функцию ...
Все мы не с учебником по C/C++ в руках родились, но многие знают его почти наизусть ...
Это хорошо когда вокруг знающие и отзывчивые люди.
Это хорошо когда вокруг знающие и отзывчивые люди.
для этого форумы и придумали, для тех, для кого это просто хобби )))
А как вы в про мини 168 сделаете электронную версию значка?, иными подходами.
Вы хотите сказать, что два вышеприведенные изображения эквивалентны?
Другой вопрос как вставить аргументами конкретные функции раскраски в функцию вывода картинки...хотя ответ на этом форуме мне попадался - никак :)
Т.е. цель не достигается. Тогда зачем все это?
[А что, с этим подходом получилось?
Вы хотите сказать, что два вышеприведенные изображения эквивалентны?
......
Отож!
Т.е. цель не достигается. Тогда зачем все это?
Они определённым образом имеют сходства. Изначально, цель из Ч/Б изображения получать цветное. - т.е. заведомо эквивалента нет. Но идея с расширением целей по мере увязания в болоте мне ясна :) Т.е. исходник берём цветной и как то его выводим на экран.
Что касается функций - все цели операции достигнуты, подсказали как правильно сделать.
Более медведистый медведь.
Оказывается можно значения локальных переменных одних функций передавать другим функциям (счётчики i и j - задание цвета от его положения)
// РИСУНОК контур 4 цвета #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library #include <SPI.h> #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); extern const unsigned char ris_1[]; void setup(void) { // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab tft.fillScreen(ST7735_BLACK); tft.setRotation(0);//ориентация экрана } void loop() { drawBitmap_(0,0,ris_1,128,160,COL1,COL2,COL3,COL4); delay(500); } ///////////////////////////////////////////////////////////////////// void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,const uint16_t (*COLor_1)(int &i,int &j),const uint16_t (*COLor_2)(int &i,int &j),const uint16_t (*COLor_3)(int &i,int &j),const uint16_t (*COLor_4)(int &i,int &j)) { bool flag=true;// if(x<0||x+w>128||y<0||y+h>160){return;} tft.setAddrWindow(x,y,x+w-1,y+h-1); int byteWidth = (w + 7) / 8; uint8_t byte_;uint8_t byte_st; // SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(TFT_DC, HIGH); digitalWrite(TFT_CS, LOW); for(int j=0; j<h; j++) { for( int i=0; i<w; i++) { if(i & 7) {byte_ <<= 1;byte_st <<= 1;} else { byte_ = pgm_read_byte(bitmap + j * byteWidth + i / 8);if(j>0){byte_st = pgm_read_byte(bitmap + (j-1) * byteWidth + i / 8);}} if(byte_ & 0x80) { if(flag||!(byte_st & 0x80)){SPI.transfer(COLor_3(i,j)>>8);SPI.transfer(COLor_3(i,j));}//цвет контура левого верхнего плана else { SPI.transfer(COLor_1(i,j)>>8);SPI.transfer(COLor_1(i,j));}// цвет раскраски внутри контура flag=false; } else { if(!flag||byte_st & 0x80){SPI.transfer(COLor_4(i,j)>>8);SPI.transfer(COLor_4(i,j));}//цвет контура правого нижнего плана else {SPI.transfer(COLor_2(i,j)>>8);SPI.transfer(COLor_2(i,j));} // цвет фона flag=true; } } } digitalWrite(TFT_CS, HIGH); SPI.endTransaction(); /// } ///////////////////////////////////////////////////////////////////// //варианты функций - раскрасок const uint16_t COL1(int &i,int &j){// 1 позиция в аргументах - цвет раскраски изображения внутри контура return tft.Color565(255-j/2,190-j,0); } const uint16_t COL2(int &i,int &j){// 2 позиция в аргументах - цвет фона return tft.Color565(225-i/2,160-i,0); } const uint16_t COL3(int &i,int &j){// 3 позиция в аргументах - цвет контура левого верхнего плана return tft.Color565(200,200,100); } const uint16_t COL4(int &i,int &j){// 4 позиция в аргументах - цвет контура правого нижнего плана return tft.Color565(75,75,75); } /////////////////////////////////////////////////////////////////////Но самое смешное, что я в аргументах основной функции ссылаюсь или указываю на переменные которые только будут в ней объявлены. И это работает, хоть и алогично.
было бы с десяток-другой кадров в динамике и можно посмотреть как мультики рисует
Если использовать, например, FM24C256-G с её 32 кБ памяти, в качестве места хранения картинок то может и получиться.
IMHO намного проще на Меге 2560 попробовать.
IMHO намного проще на Меге 2560 попробовать.
у меня для этой самой штуки есть RP2040 )))
IMHO намного проще на Меге 2560 попробовать.
у меня для этой самой штуки есть RP2040 )))
Толку то, если частоту spi поднять никак не получается через библиотеки, тогда уж через sdk и напрямую к экрану обращаться.
IMHO намного проще на Меге 2560 попробовать.
у меня для этой самой штуки есть RP2040 )))
как не получается, 25 мегагерц получается, мало?
Мало конечно) МК же может бОльше!
я не пробовал больше, надо в библиотеке (Adafruit_GFX) частоту поправить, по идее должна работать и 33.250MHZ и на 66.5MHz
В ядре 2.5.4 изменили структуру каталогов, теперь установки хард SPI тут - arduino-1.8.19/portable/packages/rp2040/hardware/rp2040/2.5.4/ArduinoCore-API/api/
Скорость порта по умолчанию не изменилась - 4MHz
абстрактно - да, нагруженный - что-то уже сомневаюсь, падают уровни, довольно сильно, на 30 мегагерцах CLK уже порядка 2.2 вольта
И таки да, ядро не умеет быстрее 40 наносекунд, взял скетч прекрасно это делающий под ядром MBED, а вот под 2.5.4...

Учитывая, что изначально HARDWARE SPI заточен на частоту 4 Мегагерца, крутить кино на этой плате никто не собирался...
("не для того мама доченьку растила")
Учитывая, что изначально HARDWARE SPI заточен на частоту 4 Мегагерца, крутить кино на этой плате никто не собирался...
SPI - это последовательный интерфейс, если кто не знает.
SPI - это последовательный интерфейс, если кто не знает.
не думал, что это секрет )))
PS попробовал для RP2040 другую библиотеку TFT_eSPI, результат прежний CLK 40 наносекунд...
значит дальнейшее ускорение через правку чего-то в ядре фила
Если кому-то понадобится конфигурационный файл User_Setup.h для ST7735 1.8" SPI 128*160
Код для AVR с флеш до 64K. Кварц 16 МГц. SPI на скорости 16/2=8 МГц.
Вывод из flash ~22 FPS для кадра размером 128х160:
void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color, uint16_t bg) { uint8_t b(0); uint8_t bc(0); uint16_t tc(0); int16_t c = w * h; tft.startWrite(); tft.setAddrWindow(x, y, w, h); asm volatile( "mloop_%=: \n" " LPM %[b],%a[bm]+ \n" " LDI %[bc],1 \n" "loop_%=: \n" " SBRC %[b],7 \n" " MOVW %[tc],%[color] \n" " SBRS %[b],7 \n" " MOVW %[tc],%[bg] \n" " IN __tmp_reg__,%[spdr]-1 \n" " OUT %[spdr],%B[tc] \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " IN __tmp_reg__,%[spdr]-1 \n" " OUT %[spdr],%A[tc] \n" " SBIW %[c],1 \n" " BREQ exit_%= \n" " NOP \n" " LSL %[b] \n" " LSL %[bc] \n" " BRCS mloop_%= \n" " RJMP .+0 \n" " NOP \n" " RJMP loop_%= \n" "exit_%=: \n" : : [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [tc] "r" (tc), [color] "w" (color), [bg] "w" (bg), [spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c) : ); tft.endWrite(); }Это многоцветный рисунок?
Тестировал на ваших ris_1..4.
2 цвета - один для установленных битов, второй для сброшенных.
Ч\Б значит рисунок, я просто не понял почему 64К, у меня опыты на уно.
Для UNO этот код подходит!!! Там где >64К (мега и др.) - немного другая адресация памяти и надо менять код.
Сейчас попробую тогда.
Не, не пошло ругается на tft.startWrite();, нет его видно в моей версии библиотеки.
https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/st7735-160-na-128-podsvetka-barakhlit?page=3#comment-666486
Надо CS подёргать
void Adafruit_SPITFT::startWrite(void) { SPI_BEGIN_TRANSACTION(); if (_cs >= 0) SPI_CS_LOW(); } /*! @brief Call after issuing command(s) or data to display. Performs chip-deselect (if required) and ends an SPI transaction (if using hardware SPI and transactions are supported). Required for all display types; not an SPI-specific function. */ void Adafruit_SPITFT::endWrite(void) { if (_cs >= 0) SPI_CS_HIGH(); SPI_END_TRANSACTION(); }void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color, uint16_t bg) { uint8_t b(0); uint8_t bc(0); uint16_t tc(0); int16_t c = w * h; // tft.startWrite(); tft.setAddrWindow(x, y, w, h); SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(TFT_DC, HIGH); digitalWrite(TFT_CS, LOW); asm volatile( "mloop_%=: \n" " LPM %[b],%a[bm]+ \n" " LDI %[bc],1 \n" "loop_%=: \n" " SBRC %[b],7 \n" " MOVW %[tc],%[color] \n" " SBRS %[b],7 \n" " MOVW %[tc],%[bg] \n" " OUT %[spdr],%B[tc] \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " OUT %[spdr],%A[tc] \n" " SBIW %[c],1 \n" " BREQ exit_%= \n" " LSL %[b] \n" " LSL %[bc] \n" " NOP \n" " BRCS mloop_%= \n" " RJMP .+0 \n" " NOP \n" " RJMP loop_%= \n" "exit_%=: \n" : : [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [tc] "r" (tc), [color] "w" (color), [bg] "w" (bg), [spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c) : ); // tft.endWrite(); digitalWrite(TFT_CS, HIGH); SPI.endTransaction(); }Вот так сделал и не прокатило, а раньше прокатывало :) - появилась очень быстрая череда чб полос.
Дернуть CS достаточно - у вас же уже инициализация дисплея уже прошла, значит SPI уже запущен.
tft.setAddrWindow(x, y, w, h); у вас оказался выше и не передался на устройство !!! и при этом напишите tft.setAddrWindow(x, y, w, h); в стиле вашей библиотеки = скопируйте из вашего скетча.
Почему вами используется не актуальная версия библиотеки ???
void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color, uint16_t bg) { uint8_t b(0); uint8_t bc(0); uint16_t tc(0); int16_t c = w * h; // tft.startWrite(); // tft.setAddrWindow(x, y, w, h); SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(TFT_DC, HIGH); digitalWrite(TFT_CS, LOW); tft.setAddrWindow(x, y, w, h); asm volatile( "mloop_%=: \n" " LPM %[b],%a[bm]+ \n" " LDI %[bc],1 \n" "loop_%=: \n" " SBRC %[b],7 \n" " MOVW %[tc],%[color] \n" " SBRS %[b],7 \n" " MOVW %[tc],%[bg] \n" " OUT %[spdr],%B[tc] \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " OUT %[spdr],%A[tc] \n" " SBIW %[c],1 \n" " BREQ exit_%= \n" " LSL %[b] \n" " LSL %[bc] \n" " NOP \n" " BRCS mloop_%= \n" " RJMP .+0 \n" " NOP \n" " RJMP loop_%= \n" "exit_%=: \n" : : [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [tc] "r" (tc), [color] "w" (color), [bg] "w" (bg), [spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c) : ); // tft.endWrite(); digitalWrite(TFT_CS, HIGH); SPI.endTransaction(); }Теперь просто белый экран. tft.setAddrWindow(x, y, w, h); он же вроде самодостаточен в рамках библиотеки. Старая библиотека... не знаю откуда она у меня бралась. Как экранчик заработал так и пошло по накатанной.
Кстати я сделал вывод пикселя независимо от библиотеки. Попиксельный вывод с этой функцией дал скорость 0.8 кадра в секунду :)
///////////////////////////////////////////////////////////////////// void pixel_(uint8_t x0, uint8_t y0,uint16_t COLor) { SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(TFT_DC, HIGH); digitalWrite(TFT_CS, LOW); digitalWrite(TFT_DC, LOW);SPI.transfer(0x2A); // Column addr set digitalWrite(TFT_DC, HIGH); SPI.transfer(0x00); SPI.transfer(x0); // XSTART SPI.transfer(0x00); // SPI.transfer(x0+1); // XEND digitalWrite(TFT_DC, LOW); SPI.transfer(0x2B); // Row addr set digitalWrite(TFT_DC, HIGH); SPI.transfer(0x00); SPI.transfer(y0); // YSTART SPI.transfer(0x00); // SPI.transfer(y0+1); // YEND digitalWrite(TFT_DC, LOW); SPI.transfer(0x2C); // write to RAM // digitalWrite(TFT_DC, HIGH); SPI.transfer(COLor>> 8); SPI.transfer(COLor); digitalWrite(TFT_CS, HIGH); SPI.endTransaction(); } //////////////////////////////////////////////////////////////////////9 digitalWrite(); даёт заметную задержку. Попробуй использовать bitSet() и bitClear() Люк! https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bi... https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bi...
Добавил в коде #236 чтение=сброс битов в SPSR - попробуйте на досуге ...
Вот весь код:
const unsigned char ris_1[]PROGMEM = { 0X00, 0X00, 0X00, 0X00, 0X80, 0X00, 0X00, 0X05, 0XB5, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X00, 0X00, 0X00, 0X5A, 0X40, 0X94, 0XA0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0X14, 0X40, 0X02, 0XA8, 0X08, 0X55, 0X0E, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X08, 0X40, 0X01, 0X14, 0XB1, 0X03, 0X08, 0XA1, 0XA4, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0X00, 0X04, 0X02, 0XC0, 0X2C, 0X52, 0X00, 0XC0, 0X08, 0X00, 0X00, 0X00, 0X04, 0X88, 0X44, 0X14, 0X01, 0X20, 0X10, 0XAA, 0XB2, 0XAB, 0XAA, 0X28, 0X00, 0X88, 0X80, 0X00, 0X10, 0X01, 0X00, 0X00, 0X08, 0X00, 0X0B, 0XC0, 0X55, 0X54, 0X90, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X10, 0X40, 0X04, 0X42, 0X93, 0X54, 0X82, 0X26, 0X12, 0X40, 0X00, 0X01, 0X00, 0X80, 0X00, 0X00, 0X41, 0X01, 0X11, 0X0B, 0X45, 0XA9, 0X51, 0X01, 0X41, 0X02, 0X00, 0X00, 0X00, 0X00, 0X08, 0X24, 0X00, 0X04, 0X00, 0X45, 0X4A, 0XA2, 0X0E, 0XD4, 0X80, 0X08, 0X00, 0X00, 0X00, 0X00, 0X40, 0X80, 0X14, 0X20, 0XA1, 0X55, 0X76, 0XB5, 0XBB, 0XFA, 0X08, 0X80, 0X08, 0X00, 0X00, 0X04, 0X00, 0X00, 0X80, 0X81, 0X08, 0X96, 0XAD, 0X56, 0XFF, 0XAF, 0XC0, 0X20, 0X20, 0X00, 0X00, 0X40, 0X02, 0X08, 0X04, 0X14, 0XA2, 0X55, 0X5A, 0XAD, 0XF4, 0X48, 0X32, 0X00, 0X00, 0X00, 0X00, 0X00, 0X10, 0X01, 0X12, 0X8A, 0X89, 0X57, 0X6A, 0X5B, 0XAF, 0XB5, 0X5C, 0X24, 0X00, 0X00, 0X00, 0X00, 0X80, 0X20, 0X00, 0X20, 0X6A, 0X57, 0X5B, 0X6F, 0X5A, 0XEA, 0XA5, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X84, 0X94, 0X0A, 0X95, 0X5A, 0XEA, 0XBA, 0XFF, 0XAD, 0X52, 0XC8, 0X40, 0X04, 0X00, 0X80, 0X04, 0X00, 0X01, 0X55, 0X55, 0XB7, 0X55, 0XAD, 0X4B, 0XD5, 0X55, 0X41, 0X00, 0X00, 0X00, 0X00, 0X10, 0X02, 0X48, 0X0A, 0XBA, 0XDB, 0XBA, 0XD6, 0XBE, 0XED, 0X54, 0X54, 0X00, 0X00, 0X00, 0X10, 0X40, 0X90, 0X02, 0XB7, 0XED, 0X6D, 0X6D, 0X7A, 0XAB, 0X5F, 0XAB, 0X20, 0X00, 0X00, 0X00, 0X01, 0X00, 0X02, 0XA8, 0X4A, 0XBB, 0X77, 0XD7, 0XAA, 0XAA, 0XEA, 0XE9, 0X49, 0X00, 0X00, 0X00, 0X80, 0X02, 0X20, 0X02, 0XAD, 0XF5, 0XAD, 0X7D, 0XFF, 0X5A, 0XBF, 0X7D, 0X34, 0X20, 0X00, 0X00, 0X04, 0X00, 0X09, 0X14, 0X2B, 0XDE, 0XDF, 0XD6, 0XB5, 0XEB, 0X55, 0XAB, 0X8E, 0X80, 0X00, 0X00, 0X10, 0X10, 0X84, 0X42, 0XAF, 0X77, 0X7B, 0X7F, 0XEF, 0X5D, 0X55, 0X74, 0XF3, 0X00, 0X00, 0X00, 0X40, 0X00, 0X21, 0X11, 0X55, 0XDB, 0XEF, 0XFB, 0X7D, 0XEB, 0XB5, 0X5E, 0X8D, 0XA2, 0X00, 0X00, 0X00, 0X44, 0X04, 0X4A, 0X5B, 0XBE, 0XBD, 0XDF, 0XF7, 0X7D, 0X6A, 0XA3, 0X56, 0X40, 0X00, 0X00, 0X00, 0X00, 0X81, 0X24, 0XAE, 0XEB, 0XF7, 0XFF, 0XDF, 0XD7, 0XD6, 0XBD, 0XD1, 0X50, 0X00, 0X00, 0X82, 0X10, 0X10, 0X52, 0X57, 0XBF, 0XDF, 0XFF, 0XFF, 0XFD, 0X75, 0XA6, 0XB1, 0XA0, 0X04, 0X00, 0X08, 0X40, 0X05, 0X09, 0XFA, 0XFD, 0XFF, 0X76, 0XFF, 0XF7, 0XBA, 0XBB, 0XFC, 0X50, 0X00, 0X04, 0X00, 0X02, 0X40, 0XA5, 0X2F, 0XDF, 0X7B, 0XFF, 0XFD, 0XBF, 0XD7, 0XCD, 0X56, 0X20, 0X00, 0X00, 0X20, 0X00, 0X0B, 0X4A, 0XF6, 0XF7, 0XDF, 0XFF, 0XEF, 0XFD, 0XFD, 0X75, 0XFD, 0X14, 0X00, 0X00, 0X01, 0X00, 0X8A, 0X95, 0XDF, 0XFD, 0XFF, 0XFF, 0XFF, 0XFF, 0X6E, 0XDB, 0X57, 0X90, 0X00, 0X00, 0X04, 0X12, 0X2B, 0X2F, 0X7D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XFB, 0XB7, 0XFE, 0XDA, 0X00, 0X00, 0X40, 0X00, 0X0E, 0X2B, 0XFF, 0XBF, 0XFB, 0X6F, 0X7F, 0XDF, 0XDE, 0XED, 0X57, 0XA8, 0X00, 0X00, 0X00, 0X40, 0XB8, 0X77, 0XDB, 0XF7, 0X7F, 0XFF, 0XFF, 0XFF, 0X77, 0X7B, 0XBD, 0XCE, 0X00, 0X00, 0X01, 0X02, 0X59, 0X5D, 0X7F, 0XFF, 0XFF, 0XFF, 0XFD, 0XBF, 0XFD, 0XDE, 0XEE, 0XA5, 0X00, 0X00, 0X04, 0X01, 0X69, 0XB7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XEB, 0X77, 0XF2, 0X80, 0X00, 0X80, 0X14, 0XA2, 0XAF, 0XFF, 0XDF, 0XFF, 0XFF, 0XFF, 0XF7, 0XEE, 0XBE, 0XBD, 0XB4, 0X40, 0X00, 0X00, 0X02, 0XA5, 0X7F, 0XF7, 0X7F, 0XFF, 0XFF, 0XFF, 0XFD, 0XFB, 0XF7, 0XD7, 0XE9, 0X10, 0X00, 0X10, 0X91, 0X04, 0XB6, 0XFF, 0XFF, 0XFD, 0XFF, 0XEE, 0XFF, 0X6F, 0XBD, 0X7F, 0X7D, 0X02, 0X00, 0X00, 0X04, 0X53, 0XAF, 0XFF, 0XFF, 0XEF, 0XFF, 0XFF, 0XBF, 0XFE, 0XEF, 0XAB, 0XED, 0X00, 0X00, 0X02, 0X42, 0X4A, 0XBF, 0XDE, 0XFF, 0X7F, 0XFF, 0XFF, 0XEF, 0X6F, 0XFA, 0XFF, 0XBA, 0X00, 0X02, 0X08, 0X10, 0X05, 0X77, 0X7F, 0XFD, 0XFF, 0XFF, 0XFF, 0XFB, 0XFD, 0XAF, 0X5E, 0XFB, 0X80, 0X20, 0X21, 0X4A, 0X49, 0XBF, 0XFF, 0XF7, 0XFF, 0XFF, 0XBF, 0XFE, 0XF7, 0XFD, 0XEF, 0XEC, 0X80, 0X00, 0X04, 0XA0, 0X0A, 0XD7, 0XFF, 0XDF, 0XFF, 0XFD, 0XFF, 0X7F, 0XBF, 0XBF, 0XBF, 0X76, 0X40, 0X00, 0X18, 0X04, 0X85, 0XBE, 0XFF, 0X7F, 0XFF, 0XFF, 0XFD, 0XEE, 0XFD, 0XFB, 0X77, 0XDF, 0X20, 0X00, 0X50, 0X00, 0X16, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XEF, 0XEF, 0XDF, 0XF2, 0X90, 0X00, 0X42, 0X41, 0X02, 0XBB, 0XFF, 0XFF, 0XF6, 0XDB, 0XFF, 0XFF, 0XFF, 0XFE, 0XFD, 0XAD, 0X44, 0X08, 0XA0, 0X11, 0X1A, 0XC1, 0X5B, 0XED, 0XBF, 0XE4, 0X55, 0XED, 0XB6, 0XFB, 0XBF, 0XF6, 0X80, 0X00, 0X80, 0X82, 0X84, 0X05, 0X7F, 0X7F, 0XFD, 0XAA, 0XAA, 0X7F, 0XFF, 0XDF, 0XFF, 0XBA, 0XD4, 0X80, 0X04, 0X01, 0X14, 0X05, 0X5F, 0XFF, 0XF7, 0XDD, 0X15, 0XBF, 0XF7, 0X7A, 0XDE, 0XED, 0X40, 0X00, 0X01, 0X4A, 0X84, 0X17, 0XFD, 0XF7, 0X7F, 0XFE, 0XDF, 0XFE, 0XDD, 0XFF, 0XFF, 0XF5, 0X50, 0X00, 0X12, 0X02, 0X08, 0X49, 0X5F, 0XDF, 0XFF, 0XFF, 0X7B, 0X7F, 0XFF, 0XF6, 0XBF, 0XDA, 0X90, 0X80, 0X01, 0X45, 0X09, 0X77, 0XFF, 0XFF, 0XFF, 0XFB, 0XFF, 0XFD, 0XEF, 0XFF, 0XFF, 0X6D, 0X52, 0X00, 0X04, 0X02, 0X8A, 0XDF, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XDD, 0XB7, 0XF5, 0X54, 0X00, 0X41, 0X25, 0X15, 0XFA, 0XBF, 0XFF, 0XFD, 0XDF, 0XFE, 0XEF, 0XFB, 0X7F, 0XFF, 0XAD, 0X28, 0X90, 0X14, 0X86, 0X8B, 0XEF, 0XFD, 0XFF, 0XFF, 0XFF, 0XF7, 0XFE, 0XAF, 0XF7, 0XAF, 0XFF, 0X8A, 0X00, 0X02, 0X05, 0X0E, 0XFD, 0XAF, 0XFF, 0XFF, 0XFF, 0XBF, 0XFF, 0XFF, 0XFE, 0XFF, 0XED, 0X65, 0X40, 0X54, 0X92, 0X97, 0XAB, 0XF6, 0XEF, 0XFF, 0XF5, 0XEF, 0XFF, 0XBB, 0X77, 0XFF, 0XBF, 0XA9, 0X54, 0X00, 0X02, 0X16, 0XF5, 0X5B, 0XBF, 0XFF, 0XFE, 0X95, 0XFE, 0XDF, 0XFF, 0XDD, 0XFD, 0XB2, 0X50, 0X15, 0X05, 0X1B, 0XAA, 0XAD, 0X7F, 0XF7, 0X75, 0XED, 0X7B, 0XEF, 0XDD, 0X7F, 0XFF, 0X5A, 0X94, 0X00, 0X10, 0X8F, 0XD5, 0X75, 0X7F, 0XFF, 0XFE, 0XBA, 0XBF, 0XBB, 0X7F, 0XFF, 0XFB, 0XEA, 0X43, 0X10, 0X42, 0X16, 0X4A, 0XBE, 0XBF, 0XDF, 0XB5, 0XDF, 0X7F, 0XDF, 0XF7, 0XEF, 0XEF, 0XD2, 0XA8, 0X09, 0X04, 0X1B, 0X20, 0XAB, 0X2F, 0XFD, 0XF4, 0X2D, 0XDD, 0XB7, 0XBB, 0X7E, 0XFA, 0XB9, 0X51, 0X00, 0X02, 0X16, 0X8F, 0X56, 0X9F, 0XFE, 0XAB, 0XD2, 0XEF, 0XFD, 0XFF, 0XFF, 0XFE, 0XD4, 0XA8, 0X08, 0X08, 0X1A, 0X3C, 0X2B, 0X3F, 0X75, 0XD7, 0X01, 0X7F, 0XDF, 0X6B, 0XDF, 0XEB, 0X5E, 0XA4, 0X08, 0X22, 0X4A, 0X78, 0X1A, 0X9F, 0XFF, 0X6F, 0X26, 0XB7, 0XF7, 0XFE, 0XFD, 0XFF, 0XD2, 0XAA, 0X08, 0X84, 0X14, 0X28, 0X9B, 0X37, 0XD7, 0XDF, 0X03, 0X5E, 0XFF, 0XAF, 0XF7, 0XB5, 0X6D, 0X44, 0X40, 0X0A, 0X16, 0XD0, 0X35, 0X3E, 0XFF, 0X7E, 0X82, 0XFF, 0XED, 0XFB, 0X7F, 0XDD, 0XAB, 0X69, 0X10, 0X04, 0X2B, 0X28, 0X55, 0X5B, 0XED, 0XCB, 0X2B, 0X6D, 0XFF, 0XF7, 0XEE, 0XB6, 0XB4, 0XA0, 0X08, 0X82, 0X0A, 0X57, 0X6E, 0X6F, 0XBF, 0X75, 0XBD, 0XBF, 0XFF, 0X7D, 0XBF, 0XDB, 0X5A, 0X5A, 0X00, 0X08, 0X54, 0X0A, 0XDA, 0X3E, 0XF7, 0XBA, 0XA6, 0XD5, 0XED, 0XEF, 0XFF, 0X6D, 0XEB, 0X24, 0X10, 0X00, 0X2A, 0XA5, 0X6C, 0XFB, 0XFD, 0XDF, 0X7B, 0X7F, 0X7F, 0XFA, 0XFA, 0XD5, 0X5D, 0X54, 0X00, 0X04, 0X01, 0X4A, 0XD8, 0X2F, 0XB7, 0X6B, 0XDD, 0XD5, 0XFB, 0X5F, 0XDF, 0XBA, 0XD5, 0X95, 0X14, 0X40, 0X55, 0XAD, 0XE8, 0XBE, 0XEF, 0XFE, 0XFF, 0XFF, 0XEF, 0XF5, 0X75, 0X68, 0X35, 0X54, 0X00, 0X00, 0X22, 0XB7, 0X54, 0X7B, 0XBD, 0XF7, 0XF6, 0XAE, 0XFD, 0X5F, 0XDA, 0XDE, 0X8D, 0X6A, 0X00, 0X00, 0X52, 0XDA, 0XF8, 0XDE, 0XFF, 0XDE, 0XBF, 0XEB, 0XBB, 0XF5, 0X6D, 0X6C, 0XC5, 0X56, 0X20, 0X00, 0X4A, 0XB7, 0X51, 0X77, 0XB7, 0XFF, 0XFB, 0X7F, 0XFD, 0XBB, 0XB7, 0X3B, 0X42, 0XAB, 0X00, 0X01, 0X2D, 0XFD, 0XF1, 0X7D, 0X7D, 0XFF, 0XFF, 0XFA, 0XDB, 0XDD, 0X6D, 0XAE, 0XD4, 0XDA, 0X42, 0X00, 0X1B, 0X57, 0X55, 0XAF, 0XAF, 0XBE, 0XFF, 0XDF, 0XFE, 0XEB, 0XAE, 0XFA, 0X42, 0X6F, 0X00, 0X08, 0X6D, 0XFD, 0XF2, 0XFA, 0XFB, 0XFF, 0XFF, 0XFF, 0XD7, 0X5D, 0X55, 0X3D, 0XA9, 0X5A, 0X00, 0X20, 0X37, 0X57, 0XA5, 0XDF, 0X5F, 0X7F, 0XFD, 0XFF, 0XFD, 0XF6, 0XAD, 0X76, 0XA9, 0XB7, 0X00, 0X00, 0X5D, 0XFD, 0XC7, 0X75, 0XD7, 0XFF, 0XFF, 0XFD, 0XF6, 0XAD, 0X55, 0XFF, 0X9D, 0X5A, 0X00, 0X20, 0X5F, 0X57, 0X55, 0XFF, 0X5B, 0XEF, 0XFF, 0XFF, 0XDE, 0XF7, 0X1B, 0XBD, 0XD4, 0XFF, 0X00, 0X80, 0X6B, 0XDF, 0XAF, 0XFF, 0XED, 0XFE, 0XEF, 0XDF, 0XFB, 0XAD, 0X5F, 0XFF, 0X6E, 0X57, 0X04, 0X00, 0X3E, 0XEA, 0XCB, 0X6D, 0XB6, 0XFF, 0XFF, 0XFE, 0XFD, 0X75, 0X55, 0XED, 0XFE, 0X5D, 0X00, 0X00, 0X5B, 0XBF, 0X9F, 0XFF, 0XDB, 0XFF, 0XFE, 0XFF, 0XEE, 0XAE, 0XBF, 0XFF, 0X6D, 0X3F, 0X00, 0X00, 0X37, 0X6A, 0XCB, 0XFF, 0X6E, 0XBF, 0XFF, 0XF7, 0XF7, 0X75, 0X4B, 0XFD, 0XFF, 0X7F, 0X00, 0X00, 0X5D, 0XBF, 0X97, 0XFF, 0XFD, 0XEF, 0XFB, 0XFF, 0X7A, 0XBA, 0XB7, 0XBE, 0XF6, 0XBA, 0X00, 0X00, 0X2E, 0XD7, 0X4D, 0XFF, 0XB7, 0X7F, 0X7F, 0XBF, 0XEF, 0X56, 0XDB, 0X75, 0X7B, 0X3F, 0X00, 0X00, 0X35, 0X7E, 0X07, 0X76, 0XFF, 0XBB, 0XFF, 0XFD, 0XFD, 0X7B, 0X4F, 0XFF, 0X5E, 0XBB, 0X01, 0X00, 0X2F, 0XBB, 0X53, 0XDF, 0XBF, 0X6F, 0XFF, 0XF7, 0XDF, 0X55, 0X77, 0X6B, 0XBB, 0X7D, 0X00, 0X00, 0X28, 0XEF, 0X01, 0X7A, 0XA5, 0XBE, 0XF7, 0X7F, 0XBA, 0XDA, 0X9F, 0XDA, 0XED, 0X3E, 0X00, 0X08, 0X2B, 0XBE, 0X92, 0XDD, 0XFE, 0XFF, 0XBF, 0XFE, 0XFF, 0X6E, 0XDF, 0XB7, 0XEE, 0XF6, 0X00, 0X00, 0X2A, 0XFF, 0XE0, 0XAB, 0XFB, 0XF6, 0XFF, 0XD7, 0XF5, 0X55, 0XAE, 0XEA, 0XB5, 0X5B, 0X04, 0X40, 0X2B, 0X75, 0X5A, 0X7F, 0XBF, 0XBF, 0XBB, 0X7F, 0XFE, 0XBA, 0XBF, 0XB5, 0X7B, 0X7E, 0X20, 0X00, 0X25, 0XDE, 0XFF, 0XED, 0XEE, 0XF7, 0XDF, 0XFD, 0XDB, 0X6F, 0X57, 0XA5, 0X55, 0XD5, 0X04, 0X80, 0X32, 0XFB, 0XB7, 0XFE, 0XFB, 0XDE, 0XEF, 0XDF, 0XFE, 0XB5, 0XBD, 0X95, 0X5A, 0XBA, 0X00, 0X00, 0X15, 0XAE, 0XFE, 0XF7, 0XFF, 0XF7, 0X5A, 0XF7, 0X7B, 0X6A, 0XAF, 0X6A, 0X8A, 0XCE, 0X00, 0X00, 0X52, 0XFB, 0XFF, 0XDF, 0XDE, 0XDD, 0XF7, 0XDD, 0XFE, 0XBE, 0XBB, 0X95, 0X55, 0X4A, 0X00, 0X00, 0X35, 0X57, 0X77, 0XFD, 0XF7, 0XFE, 0XBF, 0X7F, 0XEB, 0X55, 0XBE, 0XD0, 0XAA, 0X8A, 0X00, 0X00, 0X29, 0XBB, 0XBE, 0XFF, 0XFF, 0XD7, 0XDB, 0XF7, 0XFD, 0X7E, 0XBB, 0X40, 0X55, 0X00, 0X00, 0X00, 0X2A, 0XDE, 0XFF, 0XEF, 0XFB, 0X7E, 0XED, 0XBE, 0XF6, 0XAA, 0XAE, 0X80, 0XA2, 0X04, 0X00, 0X10, 0X11, 0X2B, 0XEB, 0XFE, 0XDF, 0XEF, 0X5E, 0XFB, 0XFD, 0XDD, 0X4D, 0X00, 0X14, 0X10, 0X00, 0X00, 0X35, 0XAE, 0XBF, 0XBB, 0XFA, 0XBB, 0XF7, 0XDF, 0XDA, 0X77, 0X40, 0X00, 0X00, 0X00, 0X04, 0X00, 0X15, 0X55, 0XFB, 0XFF, 0XBF, 0XEE, 0XBA, 0XFB, 0XF7, 0XBA, 0X80, 0X00, 0X00, 0X00, 0X10, 0X00, 0X0A, 0XA9, 0X5D, 0X6A, 0XE5, 0X3B, 0XDF, 0XEF, 0X7D, 0X5D, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, 0X15, 0XC5, 0X56, 0XB5, 0XB6, 0XD6, 0XED, 0X7F, 0XEE, 0XF6, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X09, 0X68, 0X49, 0X4A, 0X9B, 0X59, 0X5F, 0XF7, 0XBA, 0XBA, 0X80, 0X00, 0X00, 0X00, 0X00, 0X10, 0X15, 0XB4, 0X22, 0X51, 0X55, 0X25, 0X76, 0XDE, 0XFE, 0XED, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X08, 0XFA, 0X05, 0X6A, 0XAE, 0X90, 0X9F, 0XFB, 0XFA, 0XF4, 0X00, 0X00, 0X00, 0X00, 0X40, 0X00, 0X0A, 0X7D, 0X4A, 0XBB, 0X7B, 0X60, 0XED, 0X7F, 0XFD, 0XBA, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0A, 0XB7, 0X2B, 0XED, 0XDD, 0XA2, 0XBB, 0XEF, 0XD6, 0XE8, 0X00, 0X00, 0X00, 0X20, 0X00, 0X80, 0X06, 0X7F, 0X8E, 0XBF, 0X77, 0XA2, 0XD6, 0XFB, 0XFD, 0XE0, 0X00, 0X04, 0X20, 0X80, 0X00, 0X00, 0X05, 0X5E, 0XD7, 0XF5, 0XDE, 0XC5, 0XFD, 0XEF, 0XFB, 0X70, 0X02, 0X10, 0X00, 0X00, 0X00, 0X00, 0X83, 0XBF, 0X9A, 0XBF, 0X76, 0X97, 0X7B, 0XFF, 0X6D, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X84, 0X00, 0X02, 0XAF, 0XCF, 0XEB, 0XDE, 0XAD, 0XFF, 0X57, 0XFB, 0XA0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X9F, 0X8B, 0X7D, 0X6E, 0XB7, 0XEB, 0XFF, 0XF7, 0X80, 0X10, 0X00, 0X00, 0X00, 0X00, 0X04, 0X01, 0XDE, 0XCF, 0XD7, 0XBB, 0X5A, 0XFE, 0XEE, 0XDE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X10, 0X00, 0X6B, 0XCF, 0X7D, 0XDE, 0X6F, 0XFD, 0XDF, 0XF6, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XD7, 0XC7, 0XD6, 0XBD, 0X55, 0XDF, 0XFF, 0XDC, 0X00, 0X00, 0X00, 0X01, 0X02, 0X20, 0X80, 0X00, 0X6F, 0XCD, 0XFB, 0XDA, 0XDF, 0XFF, 0XAD, 0XE8, 0X00, 0X40, 0X20, 0X08, 0X00, 0X00, 0X00, 0X00, 0X37, 0XA7, 0X6E, 0XBD, 0X57, 0X7D, 0XFF, 0X50, 0X01, 0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X37, 0XC7, 0XF6, 0XD5, 0X7E, 0XF7, 0XAF, 0XA0, 0X20, 0X00, 0X00, 0X00, 0X00, 0X02, 0X00, 0X00, 0X1A, 0XC5, 0X5B, 0X7D, 0X5B, 0XFF, 0XFE, 0X80, 0X00, 0X00, 0X00, 0X00, 0X08, 0X40, 0X00, 0X02, 0X1B, 0XE7, 0XF6, 0XB5, 0XFF, 0XFF, 0XBF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0A, 0XC2, 0XEF, 0X7A, 0XB7, 0XBF, 0XF6, 0X00, 0X00, 0X00, 0X21, 0X00, 0X01, 0X00, 0X00, 0X00, 0X0D, 0XE3, 0XB5, 0XAB, 0XFE, 0XFD, 0XBC, 0X80, 0X80, 0X00, 0X80, 0X00, 0X00, 0X00, 0X04, 0X20, 0X05, 0X61, 0X6E, 0XF7, 0XDF, 0XFF, 0X7A, 0X02, 0X02, 0X00, 0X00, 0X00, 0X44, 0X00, 0X20, 0X00, 0X04, 0XD1, 0XF5, 0XAA, 0XFF, 0XF7, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X02, 0X01, 0X04, 0X00, 0X00, 0X02, 0XF0, 0XB6, 0XEF, 0XFF, 0XFE, 0XD0, 0X00, 0X00, 0X04, 0X00, 0X10, 0X11, 0X00, 0X00, 0X00, 0X40, 0X50, 0XDB, 0XAF, 0XFB, 0XBF, 0X60, 0X00, 0X00, 0X00, 0X00, 0X80, 0X04, 0X00, 0X00, 0X01, 0X00, 0X38, 0X6D, 0XAF, 0XEF, 0XFB, 0X80, 0X00, 0X00, 0X00, 0X04, 0X00, 0X22, 0X00, 0X00, 0X04, 0X01, 0X2C, 0X2B, 0X5F, 0XFF, 0XED, 0X00, 0X04, 0X22, 0X20, 0X20, 0X00, 0X89, 0X10, 0X00, 0X10, 0X00, 0X14, 0X5D, 0XBF, 0XBE, 0XFC, 0X00, 0X00, 0X00, 0X01, 0X00, 0X00, 0X04, 0X00, 0X41, 0X00, 0X00, 0X0E, 0X12, 0XBF, 0XFF, 0XD8, 0X00, 0X20, 0X00, 0X00, 0X00, 0X02, 0X51, 0X00, 0X00, 0X00, 0X00, 0X03, 0X0A, 0X7F, 0XF7, 0X70, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X88, 0X00, 0X00, 0X00, 0X00, 0X05, 0X01, 0XFE, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X80, 0X00, 0X48, 0X22, 0X42, 0X04, 0X00, 0X00, 0X02, 0XC5, 0XFF, 0XFD, 0X80, 0X01, 0X00, 0X88, 0X04, 0X11, 0X02, 0X88, 0X00, 0X00, 0X00, 0X00, 0X01, 0X7F, 0XDF, 0XEF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X40, 0X02, 0X52, 0X10, 0X00, 0X00, 0X10, 0X80, 0XAB, 0X7B, 0XBC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11, 0X09, 0X00, 0X20, 0X11, 0X00, 0X00, 0X5D, 0XEE, 0XF8, 0X00, 0X08, 0X08, 0X02, 0X10, 0X00, 0X04, 0XA4, 0X00, 0X00, 0X40, 0X00, 0X00, 0X27, 0X7B, 0XE0, 0X00, 0X00, 0X00, 0X88, 0X00, 0X00, 0XA2, 0X51, 0X00, 0X01, 0X00, 0X00, 0X00, 0X09, 0XAD, 0X40, 0X00, 0X00, 0X00, 0X00, 0X01, 0X04, 0X19, 0X24, 0X02, 0X00, 0X00, 0X00, 0X00, 0X02, 0X55, 0X00, 0X00, 0X40, 0X20, 0X00, 0X04, 0X11, 0X45, 0X49, 0X08, 0X10, 0X00, 0X01, 0X08, 0X00, 0X10, 0X00, 0X01, 0X00, 0X00, 0X00, 0X40, 0X00, 0X14, 0X90, 0X00, 0X00, 0X00, 0X08, 0X01, 0X00, 0X84, 0X00, 0X00, 0X00, 0X00, 0X44, 0X00, 0X05, 0X4A, 0X05, 0X00, 0X00, 0X00, 0X20, 0X23, 0X02, 0XF8, 0X00, 0X00, 0X00, 0X81, 0X00, 0X00, 0X10, 0XA5, 0X68, 0X00, 0X00, 0X00, 0X80, 0X07, 0XF0, 0X20, 0X00, 0X10, 0X00, 0X00, 0X00, 0X08, 0X85, 0X11, 0X01, 0X00, 0X88, 0X80, 0X00, 0X87, 0XF0, 0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X80, 0X12, 0XAA, 0X48, 0X10, 0X00, 0X04, 0X00, 0X27, 0X41, 0X80, 0X04, 0X00, 0X00, 0X00, 0X04, 0X00, 0X09, 0X15, 0X25, 0X00, 0X00, 0X00, 0X02, 0X0C, 0X05, 0X00, 0X00, 0X00, 0X00, 0X08, 0X20, 0X04, 0XA5, 0X52, 0X90, 0X00, 0X80, 0X00, 0X00, 0X9A, 0X42, 0X00, 0X00, 0X00, 0X01, 0X00, 0X80, 0X20, 0X29, 0X28, 0X44, 0X02, 0X04, 0X00, 0X04, 0X10, 0X08, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0XAA, 0XA5, 0X22, 0X08, 0X00, 0X40, 0X10, 0X31, 0X20, 0X00, 0X80, 0X00, 0X10, 0X00, 0X02, 0X02, 0X2A, 0X2A, 0XA9, 0X00, 0X10, 0X02, 0X01, 0X20, 0X00, 0X00, 0X00, 0X00, 0X80, 0X08, 0X10, 0X04, 0XAA, 0XA4, 0X92, 0X00, 0X00, 0X00, 0X08, 0X64, 0X80, 0X04, 0X00, 0X02, 0X00, 0X01, 0X00, 0X01, 0X55, 0X2A, 0X44, 0X10, 0X00, 0X00, 0X22, 0X00, 0X00, 0X00, 0X00, 0X20, 0X00, 0X00, 0X00, 0X2A, 0XA4, 0XA2, 0X28, 0X40, 0X81, 0X10, 0X80, 0X49, 0X00, 0X00, 0X00, 0X80, 0X00, 0X20, 0X24, 0X01, 0X2A, 0XA8, 0X82, 0X00, 0X08, 0X00, 0X14, 0X00, 0X00, 0X20, 0X00, 0X00, 0X00, 0X02, 0X00, 0XAA, 0XA9, 0X4A, 0XA8, 0X02, 0X00, 0X00, 0X40, 0X10, 0X04, 0X00, 0X00, 0X00, 0X01, 0X00, 0X00, 0X02, 0X54, 0X44, 0X41 }; const unsigned char ris_2[]PROGMEM = { 0X50, 0X00, 0X02, 0X10, 0X80, 0X08, 0X09, 0X24, 0X84, 0X81, 0X24, 0X80, 0X10, 0X00, 0X15, 0X40, 0XA9, 0X02, 0XA8, 0XA5, 0X28, 0X24, 0X24, 0X92, 0X02, 0X51, 0X49, 0X28, 0XA5, 0X54, 0X49, 0X2A, 0XA0, 0X00, 0X12, 0X12, 0X20, 0X12, 0X12, 0XAA, 0X85, 0X42, 0X24, 0X90, 0X08, 0X89, 0X25, 0X50, 0X54, 0X81, 0X41, 0X48, 0X90, 0X28, 0X4A, 0X49, 0X44, 0XA1, 0X52, 0X48, 0X52, 0X20, 0X14, 0X92, 0XA8, 0X00, 0X14, 0X25, 0X20, 0X04, 0X29, 0X25, 0X22, 0X82, 0X95, 0X24, 0X09, 0X4A, 0X45, 0X48, 0XA2, 0X01, 0X49, 0X48, 0X90, 0X28, 0X4A, 0XAA, 0X82, 0X50, 0XA4, 0XA8, 0X52, 0X24, 0X88, 0XAA, 0X58, 0X80, 0X22, 0X25, 0X20, 0X14, 0X29, 0X54, 0XA2, 0XA2, 0X92, 0X94, 0X08, 0X89, 0X02, 0X24, 0XA1, 0X01, 0X14, 0X90, 0X81, 0X20, 0X4A, 0X4A, 0X82, 0X81, 0X54, 0XA2, 0X25, 0X24, 0X90, 0X52, 0XA8, 0X00, 0X42, 0X4A, 0X50, 0X14, 0X29, 0X52, 0X42, 0X62, 0X4A, 0X48, 0X28, 0X92, 0X0F, 0XAC, 0X52, 0X08, 0X94, 0X92, 0X82, 0X28, 0X55, 0X4A, 0XA2, 0X81, 0X55, 0X2A, 0X12, 0X4A, 0X8A, 0XDA, 0XA8, 0X80, 0X22, 0X48, 0X40, 0X08, 0X4A, 0XAA, 0XA2, 0XA5, 0X45, 0XA4, 0X25, 0X22, 0X8D, 0X68, 0XA2, 0X08, 0X49, 0X25, 0X44, 0X28, 0X54, 0XAA, 0X82, 0XAF, 0X28, 0XA8, 0X12, 0X40, 0X4F, 0X95, 0X58, 0X80, 0X24, 0X95, 0X02, 0X24, 0X52, 0XAA, 0XA2, 0XB5, 0XD1, 0X64, 0X49, 0X22, 0X0D, 0XD0, 0XA2, 0X08, 0X2A, 0X52, 0XA4, 0X14, 0X2A, 0XAA, 0XA2, 0XAE, 0XAE, 0X54, 0X2A, 0X90, 0X2A, 0X8A, 0X50, 0X80, 0X41, 0X49, 0X02, 0X28, 0X55, 0X55, 0X42, 0XAA, 0XFF, 0XAA, 0X12, 0X42, 0XA5, 0X51, 0X54, 0X0A, 0X14, 0X94, 0X88, 0X24, 0X55, 0X55, 0X42, 0XAB, 0XF7, 0XE8, 0X29, 0X21, 0X54, 0X48, 0XA9, 0X00, 0X0A, 0X45, 0X06, 0X14, 0X55, 0X55, 0X62, 0XA5, 0XBE, 0XB4, 0X25, 0X40, 0X22, 0X85, 0X50, 0X8A, 0X21, 0X29, 0X08, 0X28, 0X55, 0X55, 0X82, 0XCB, 0XFF, 0XD4, 0X2A, 0X43, 0X48, 0X50, 0XA4, 0X00, 0X14, 0X94, 0X8A, 0X28, 0X55, 0X56, 0XA3, 0X49, 0X4C, 0XAA, 0X29, 0X20, 0X90, 0X8A, 0X92, 0X8A, 0X0A, 0X4A, 0X14, 0X28, 0X55, 0X6A, 0XA2, 0X8B, 0X3A, 0XD4, 0X25, 0X45, 0X20, 0X20, 0XA8, 0X01, 0X11, 0X52, 0X0A, 0X14, 0X55, 0XAA, 0XC2, 0XC9, 0X6E, 0X4A, 0X2A, 0X82, 0X94, 0X95, 0X52, 0X8A, 0X04, 0X95, 0X14, 0X28, 0X56, 0XAD, 0X43, 0X05, 0XFF, 0XD4, 0X29, 0X44, 0X48, 0X22, 0X54, 0X01, 0X0A, 0X48, 0X2A, 0X2C, 0X5A, 0XB6, 0XC5, 0X92, 0XD7, 0XD4, 0X25, 0X02, 0XA4, 0X49, 0X51, 0X0A, 0X05, 0X55, 0X12, 0X28, 0X6A, 0XD5, 0X62, 0X91, 0X6E, 0XD4, 0X2A, 0X8A, 0X50, 0X12, 0X48, 0X81, 0X08, 0X94, 0X2A, 0X14, 0X55, 0X5B, 0X43, 0X72, 0XFF, 0XB4, 0X2A, 0X85, 0X2A, 0X24, 0XAA, 0X0A, 0X85, 0X52, 0X2A, 0X28, 0X56, 0XD5, 0XA2, 0X91, 0XCB, 0XEA, 0X2A, 0X09, 0X44, 0X11, 0X51, 0X04, 0X42, 0X48, 0X2A, 0X2C, 0X5B, 0X5A, 0XC3, 0X72, 0XFD, 0X54, 0X2A, 0X8A, 0XA8, 0X24, 0XA8, 0X89, 0X05, 0X28, 0X54, 0X28, 0X6A, 0XAE, 0XA2, 0XC1, 0XB7, 0XEC, 0X2A, 0X09, 0X24, 0X12, 0XA5, 0X04, 0X82, 0XA8, 0X54, 0X28, 0X55, 0XEB, 0X43, 0X46, 0XFF, 0X34, 0X55, 0X15, 0X55, 0X14, 0X90, 0X0A, 0X42, 0X54, 0XAA, 0X2C, 0X6E, 0XB5, 0XE5, 0XAD, 0XBD, 0XAA, 0X2A, 0X15, 0X24, 0X09, 0X55, 0X01, 0X41, 0X50, 0X54, 0X28, 0X55, 0X5D, 0X42, 0XB7, 0XC2, 0X54, 0X2B, 0X00, 0X00, 0X24, 0XA9, 0X0A, 0X52, 0XA8, 0XAA, 0X2C, 0X6D, 0XD6, 0XC3, 0X2F, 0XE9, 0XB6, 0X34, 0X00, 0X00, 0X12, 0XA4, 0X89, 0X41, 0X40, 0XAD, 0X34, 0X5B, 0X6B, 0X62, 0X7B, 0XEA, 0XDA, 0X2A, 0X00, 0X00, 0X09, 0X52, 0X05, 0X21, 0X31, 0X54, 0X14, 0X6D, 0XBD, 0XA1, 0X5F, 0XB6, 0XAA, 0X2C, 0X36, 0XED, 0X0A, 0X54, 0X88, 0XA0, 0XA1, 0X6A, 0X34, 0X56, 0XD6, 0XC5, 0X6F, 0XE9, 0XB4, 0X34, 0X55, 0X2A, 0X85, 0X22, 0X05, 0X51, 0X51, 0X56, 0X28, 0X7B, 0X6B, 0X62, 0XBD, 0XB7, 0X5A, 0X2A, 0X2A, 0XA5, 0X08, 0XD4, 0X8A, 0X48, 0XA2, 0XAA, 0X2C, 0X55, 0XBD, 0X95, 0XAF, 0XDF, 0XEC, 0X2C, 0X55, 0X54, 0X85, 0XF2, 0X05, 0X28, 0XA1, 0X6C, 0X34, 0X6E, 0XD6, 0XCE, 0XBF, 0X75, 0XB4, 0X54, 0X55, 0X55, 0X0A, 0XB9, 0X09, 0X50, 0X42, 0XAA, 0X2C, 0X5B, 0X6D, 0X2B, 0X2D, 0XAF, 0XEC, 0X58, 0X55, 0X55, 0X41, 0X7A, 0X85, 0X48, 0X43, 0X5A, 0X34, 0X6D, 0XB6, 0X9D, 0X7F, 0XFF, 0XB4, 0X6C, 0X5A, 0XAA, 0X85, 0X28, 0X0A, 0X54, 0X45, 0X6C, 0X2A, 0X36, 0XDC, 0X6B, 0X2E, 0XAB, 0XEC, 0X28, 0XAA, 0XA9, 0X44, 0XF2, 0X89, 0X54, 0X45, 0X56, 0X34, 0X3B, 0X75, 0X5E, 0X7B, 0XFE, 0XE8, 0X68, 0XAB, 0X55, 0X02, 0XF5, 0X05, 0X28, 0X05, 0XB4, 0X2E, 0X2D, 0XD9, 0X76, 0X5E, 0XAF, 0XB4, 0XB0, 0XB5, 0X55, 0X45, 0XB8, 0X8A, 0XAA, 0X0A, 0XAA, 0X35, 0X17, 0X65, 0XBD, 0X77, 0X7A, 0XD8, 0XD8, 0XD5, 0X55, 0X40, 0XF5, 0X04, 0XAA, 0X0A, 0XDE, 0X2E, 0X1A, 0XD5, 0X6E, 0X5D, 0XDF, 0XA0, 0XA9, 0X5B, 0X55, 0X43, 0X59, 0X0A, 0XA4, 0X0B, 0X6A, 0X35, 0X87, 0X66, 0XFA, 0X77, 0X75, 0XD1, 0XD0, 0XAA, 0XAA, 0XA1, 0XF4, 0X8A, 0X9A, 0X0A, 0XAA, 0X2E, 0X81, 0X97, 0XBC, 0XBD, 0XDE, 0X82, 0XB1, 0XDA, 0XD5, 0X52, 0X72, 0X04, 0XAA, 0X16, 0XDC, 0X35, 0XC0, 0X15, 0XEC, 0XEE, 0XF7, 0X07, 0X61, 0X6B, 0X5A, 0XA1, 0X1A, 0X8A, 0XAB, 0X1A, 0XAA, 0X2E, 0XF0, 0X2F, 0X7A, 0X7B, 0X5B, 0X1A, 0XD1, 0XAD, 0X55, 0X50, 0X54, 0X8A, 0XAA, 0X95, 0XB6, 0XB7, 0X5E, 0X5B, 0XD8, 0XB7, 0X76, 0XF7, 0X65, 0X55, 0X55, 0X45, 0XFA, 0X54, 0XAA, 0X6A, 0XAD, 0X5A, 0XE9, 0X2F, 0X75, 0X7D, 0XDD, 0XAD, 0XBB, 0XB6, 0XD5, 0X5A, 0XD1, 0X52, 0XAA, 0XAD, 0XDB, 0XED, 0XBA, 0X5D, 0XDC, 0XDB, 0X76, 0XF6, 0XD6, 0XDB, 0X5A, 0XA4, 0XFA, 0X95, 0X55, 0XB6, 0X6D, 0X5B, 0X64, 0XB7, 0XF0, 0XFD, 0XED, 0X5B, 0X7A, 0XAA, 0XAA, 0XAA, 0XDA, 0X55, 0X55, 0X55, 0XB6, 0XEE, 0XD2, 0X5E, 0XAD, 0X57, 0XDE, 0XED, 0XAD, 0XDB, 0X6A, 0XAA, 0XE9, 0X4A, 0XAA, 0XAA, 0XDB, 0X5B, 0XAD, 0XB7, 0XF0, 0XFA, 0XEB, 0XB6, 0XD6, 0XB5, 0X55, 0X55, 0XBA, 0XA9, 0X55, 0XB7, 0X55, 0XB6, 0XB6, 0XDA, 0X89, 0X6F, 0X5D, 0X6F, 0X7B, 0X6D, 0XAD, 0X54, 0XF4, 0X55, 0X56, 0XAA, 0XEE, 0XDA, 0XAD, 0X6F, 0XE1, 0XF9, 0XD6, 0XDA, 0XD6, 0XD6, 0XD5, 0XAB, 0X5A, 0XA5, 0X55, 0X5D, 0X5B, 0X75, 0XFF, 0XB5, 0X41, 0X5A, 0XBB, 0XB7, 0X6D, 0XBA, 0XB6, 0XA9, 0X52, 0X95, 0X55, 0X6B, 0X6D, 0XAA, 0XAA, 0XDF, 0X82, 0XF5, 0X56, 0XED, 0XB6, 0XAB, 0X55, 0X55, 0X49, 0X55, 0X55, 0XAD, 0XB6, 0XAB, 0XFF, 0XB5, 0X51, 0XB8, 0X5B, 0X76, 0XDA, 0XD5, 0XAA, 0XAA, 0XAA, 0X55, 0X56, 0XB5, 0X5A, 0XAE, 0XDD, 0XEE, 0XC2, 0XE9, 0X77, 0XAB, 0X6D, 0XBE, 0X6D, 0X55, 0X55, 0X4A, 0XAA, 0XD6, 0XEC, 0XAB, 0XFF, 0X75, 0X41, 0XD9, 0X5D, 0X6D, 0XAA, 0XA1, 0X92, 0XAA, 0XA9, 0X2A, 0XAA, 0XAB, 0X52, 0XB7, 0XEB, 0XDB, 0X02, 0XF3, 0X77, 0XAA, 0XAA, 0XAD, 0X49, 0X55, 0X54, 0XAA, 0XAD, 0X75, 0XB2, 0XAE, 0XDE, 0XE8, 0X81, 0XDA, 0XED, 0X76, 0XED, 0X56, 0XB6, 0XB5, 0X4A, 0XA9, 0X55, 0X9E, 0XC9, 0X5B, 0XFB, 0X50, 0X12, 0XFB, 0XB7, 0XDB, 0X55, 0XAA, 0XAA, 0XD5, 0X52, 0X55, 0X56, 0XE5, 0X45, 0X6F, 0XAE, 0XCA, 0X09, 0XDE, 0XED, 0X6D, 0X54, 0XD4, 0XAD, 0X55, 0X55, 0X4A, 0XAA, 0XBB, 0XA2, 0XBE, 0XF5, 0X74, 0X2A, 0XF5, 0XFB, 0XBE, 0XAF, 0X5B, 0X55, 0X55, 0X49, 0X2A, 0XB5, 0X4D, 0X09, 0X57, 0XAB, 0X50, 0X78, 0XB7, 0X56, 0XEB, 0XF5, 0XB5, 0XB6, 0XAA, 0XAA, 0XAA, 0XAB, 0X75, 0X84, 0XBE, 0XD5, 0X49, 0XDA, 0XF5, 0XEF, 0X5D, 0X5A, 0XDA, 0XDA, 0XD5, 0X54, 0XAA, 0XAD, 0XAE, 0X22, 0XAB, 0XAA, 0XA3, 0X69, 0XB7, 0X5B, 0XEB, 0XAF, 0X6F, 0X55, 0X55, 0X52, 0XAA, 0XAA, 0XB5, 0X09, 0X5F, 0XE9, 0X0F, 0XFC, 0XDB, 0XFD, 0X7D, 0X69, 0X22, 0XB6, 0XAA, 0X95, 0X4A, 0XB5, 0X57, 0X22, 0X5B, 0X74, 0X3D, 0X55, 0X6A, 0XAB, 0XAB, 0XAD, 0X5A, 0XD5, 0XB5, 0X54, 0XAA, 0XAB, 0X6A, 0X04, 0XAF, 0XDD, 0XEF, 0XF9, 0XF7, 0XBE, 0XEE, 0XD5, 0XAD, 0X5A, 0XAA, 0XAA, 0X55, 0X55, 0XBB, 0X00, 0X55, 0XFA, 0XB5, 0X55, 0X53, 0X6B, 0X55, 0X5A, 0XD2, 0XA5, 0X55, 0X52, 0XAA, 0XAD, 0X56, 0X92, 0X8B, 0X7F, 0XBF, 0XBC, 0XED, 0XDD, 0XD6, 0XAA, 0XAA, 0X95, 0X6A, 0X95, 0X4A, 0XAA, 0XDB, 0X00, 0X2B, 0XDA, 0XD5, 0X6D, 0XA7, 0X77, 0X55, 0X56, 0XD5, 0X6A, 0XAB, 0X49, 0X2A, 0XB5, 0X6A, 0X85, 0X15, 0X7F, 0XEF, 0XF4, 0XED, 0XBB, 0XFB, 0X6A, 0XAD, 0X55, 0X55, 0X2A, 0XAA, 0XAB, 0X5B, 0X40, 0X45, 0XB7, 0X6A, 0XBD, 0X56, 0XDD, 0X55, 0XAB, 0X55, 0X5B, 0X6A, 0XA9, 0X55, 0X55, 0XAD, 0X88, 0X12, 0XDF, 0XF5, 0XD5, 0XCD, 0XEF, 0XBD, 0X5D, 0X2A, 0XAD, 0X55, 0X4A, 0X4A, 0XAD, 0X6A, 0XC1, 0X44, 0XBB, 0XBC, 0XFC, 0XAD, 0X75, 0X6D, 0XD5, 0XDD, 0XAA, 0XAA, 0XA9, 0X55, 0X55, 0XB7, 0X60, 0X09, 0X56, 0XF7, 0X2D, 0X6F, 0XAF, 0XDA, 0XAA, 0X54, 0XB6, 0XDB, 0X4A, 0XAA, 0XAA, 0XAA, 0XD8, 0X21, 0X5F, 0XFE, 0XB6, 0XD5, 0XFA, 0XBE, 0XAB, 0X55, 0X55, 0X55, 0X29, 0X2A, 0XB6, 0XDD, 0XB4, 0X84, 0X2B, 0X7F, 0XDC, 0XDB, 0X5F, 0XEB, 0X6D, 0XAA, 0XAD, 0XAA, 0X95, 0X52, 0XAA, 0XAB, 0X6E, 0X01, 0X55, 0XED, 0XAA, 0XDD, 0XEA, 0XBD, 0XB6, 0XDB, 0X6A, 0XB5, 0X52, 0XAA, 0XAB, 0X6D, 0XB5, 0X08, 0X2B, 0X7F, 0XE6, 0XF6, 0XBD, 0XD5, 0X55, 0X51, 0X2D, 0X55, 0X4A, 0X4A, 0XAD, 0X56, 0XDE, 0XA1, 0X0A, 0XDF, 0XFA, 0XB5, 0XEB, 0X7B, 0X55, 0X55, 0XAB, 0X55, 0X55, 0X2A, 0XAA, 0XB5, 0X6B, 0XC0, 0X52, 0XF5, 0XBA, 0XD7, 0X7E, 0XD7, 0XBB, 0XBE, 0XB5, 0XAA, 0XA9, 0X55, 0X55, 0XAD, 0XB5, 0X70, 0X0A, 0X9F, 0XEC, 0XE9, 0XAB, 0XBA, 0XAC, 0XA5, 0X4A, 0XB5, 0X54, 0XAA, 0XAA, 0XB6, 0XDE, 0XDC, 0X81, 0X6B, 0X7F, 0X7B, 0XFD, 0XE5, 0X52, 0X9A, 0XAA, 0XAA, 0XAA, 0X95, 0X55, 0X55, 0X6B, 0X6A, 0X14, 0X9D, 0XFE, 0XB6, 0XAB, 0X5B, 0XB7, 0X6A, 0XAA, 0XD5, 0X52, 0X52, 0XAD, 0XB7, 0X5B, 0XBF, 0X42, 0X57, 0X6F, 0XBD, 0XFE, 0XED, 0X6D, 0XBB, 0X6D, 0X55, 0X55, 0X4A, 0XAA, 0XAA, 0XED, 0X6A, 0XC0, 0XAA, 0XFB, 0XDE, 0XAB, 0XBB, 0XB5, 0X55, 0XAA, 0XAA, 0XA8, 0XAA, 0XAA, 0XDB, 0X56, 0XDD, 0XB8, 0X0B, 0X5F, 0X6B, 0XF6, 0XDE, 0XDE, 0XEE, 0XB6, 0XD5, 0X55, 0X2A, 0X55, 0X55, 0X7B, 0X6B, 0XED, 0X25, 0XED, 0XFE, 0XAF, 0X6B, 0X6B, 0X5A, 0XD5, 0X55, 0X52, 0XA5, 0X55, 0X5B, 0XAD, 0XBD, 0X5E, 0X85, 0X5F, 0XD6, 0XFA, 0XFB, 0XB5, 0XB5, 0X5A, 0XAA, 0XA9, 0X2A, 0X04, 0XA4, 0X2A, 0X07, 0XB5, 0X41, 0X76, 0XFB, 0XAF, 0X84, 0X5E, 0XA2, 0XD4, 0XAA, 0XAA, 0XA8, 0XF0, 0XD8, 0XDB, 0X1A, 0XEE, 0X70, 0XAF, 0XBB, 0XDA, 0XBB, 0XAB, 0X41, 0X56, 0XAA, 0XA8, 0X92, 0X8C, 0XA8, 0X55, 0X1D, 0XBA, 0X6A, 0X35, 0X6A, 0XBD, 0X2E, 0X8D, 0XE0, 0XB4, 0XAA, 0XA5, 0X41, 0X54, 0XA8, 0X6E, 0X16, 0XD4, 0X3C, 0X17, 0XFB, 0XEA, 0X75, 0XC6, 0XA8, 0X54, 0XAA, 0XAA, 0X52, 0XAA, 0XA8, 0XB5, 0X1B, 0X7C, 0X57, 0X0A, 0XDB, 0X5C, 0X5E, 0XA3, 0X50, 0X6A, 0XAA, 0XA9, 0X21, 0X54, 0XA8, 0X57, 0X16, 0XD4, 0X3A, 0X83, 0XF5, 0X68, 0X6B, 0X42, 0XCC, 0X2C, 0XAA, 0XAA, 0X90, 0X95, 0X54, 0XB5, 0X1B, 0X6A, 0X1F, 0XC5, 0XBA, 0XB8, 0XB5, 0XE3, 0X6A, 0X16, 0XAA, 0XA4, 0X50, 0X2A, 0XB0, 0X5A, 0X0D, 0XBA, 0X2A, 0X96, 0XEC, 0XE8, 0XDE, 0XA1, 0X54, 0X14, 0XAA, 0XA9, 0X48, 0X02, 0XA8, 0XAD, 0X16, 0XD3, 0X1B, 0XCB, 0XF5, 0XB0, 0X6B, 0X41, 0XAB, 0X0A, 0XAA, 0XAA, 0X50, 0X01, 0X54, 0X00, 0X1B, 0X6D, 0X0D, 0X17, 0X5B, 0X50, 0XB5, 0XE1, 0X55, 0X0A, 0X55, 0X51, 0X2A, 0X00, 0X50, 0XFF, 0X15, 0XB6, 0X0E, 0XAD, 0XE9, 0XF0, 0XDE, 0XA1, 0XAA, 0X84, 0XA9, 0X2A, 0X89, 0XA0, 0X58, 0X12, 0X1A, 0XD5, 0X8B, 0X37, 0XB4, 0XA8, 0X6A, 0XA1, 0X4D, 0X02, 0XA5, 0X51, 0X54, 0X50, 0X48, 0XD5, 0X0E, 0XAB, 0X0C, 0X5E, 0XE8, 0X70, 0XB6, 0XC1, 0X6A, 0XC2, 0X55, 0X54, 0X23, 0X2C, 0X50, 0X5A, 0X15, 0XA4, 0X86, 0X57, 0XB4, 0X58, 0X5B, 0X62, 0XAA, 0XA0, 0XAA, 0XAA, 0X94, 0XA2, 0X58, 0X55, 0X1A, 0XDB, 0X44, 0XBD, 0XD4, 0X68, 0XD5, 0XA3, 0X4A, 0XA0, 0XA9, 0X51, 0X42, 0X54, 0X24, 0XAB, 0X0B, 0X4D, 0X80, 0XAF, 0X68, 0X5C, 0X6D, 0X42, 0XAA, 0XA0, 0X95, 0X54, 0X25, 0X2A, 0XA8, 0X55, 0X1A, 0XB5, 0X42, 0X7B, 0XB4, 0X6A, 0X36, 0X85, 0X6A, 0XA8, 0X52, 0X49, 0X40, 0X90, 0X50, 0X55, 0X0B, 0X56, 0XE1, 0X5D, 0XA8, 0X2A, 0X55, 0XCD, 0XA5, 0X50, 0XA9, 0X52, 0X22, 0X49, 0X48, 0X55, 0X15, 0X55, 0X40, 0XB7, 0X6C, 0X76, 0X2A, 0X15, 0X4A, 0XA8, 0X4A, 0XA9, 0X44, 0XA2, 0XA0, 0X28, 0X0A, 0X0B, 0X22, 0XDD, 0XB4, 0X0B, 0X8D, 0X55, 0X25, 0X54, 0XA9, 0X54, 0X29, 0X0A, 0X4A, 0X96, 0XA5, 0X55, 0XB8, 0XBE, 0XD5, 0X5D, 0X51, 0X24, 0X92, 0XAA, 0X95, 0X49, 0X44, 0X52, 0X92, 0X10, 0X28, 0XA1, 0X52, 0XEB, 0X5A, 0X15, 0X4A, 0X82, 0XA2, 0X92, 0X49, 0X24, 0X22, 0X89, 0X15, 0X14, 0XA8, 0XAA, 0XA1, 0X5E, 0XD4, 0X0A, 0XEA, 0XC5, 0X51, 0X55, 0X54, 0XB2, 0X94, 0X54, 0X49, 0X4A, 0XA8, 0X51, 0X62, 0XFB, 0X6E, 0X8B, 0X2B, 0X42, 0XAA, 0X49, 0X22, 0XA8, 0X42, 0X92, 0X25, 0X54, 0XA8, 0XAA, 0X81, 0X5D, 0X52, 0X05, 0XA5, 0X42, 0XA1, 0X54, 0X95, 0X4A, 0X29, 0X24, 0X2A, 0X89, 0X50, 0XB5, 0X45, 0XB6, 0X2D, 0X82, 0XAA, 0X85, 0X55, 0X52, 0XA8, 0XA1, 0X44, 0X92, 0X12, 0X55, 0X50, 0XAA, 0X82, 0XFB, 0X34, 0XA2, 0XAA, 0XA2, 0X94, 0X8A, 0X45, 0X58, 0X12, 0X48, 0X09, 0X4A, 0X48, 0XAA, 0X82, 0XAC, 0X16, 0X81, 0X4A, 0X82, 0X52, 0XA9, 0X2A, 0XA5, 0X48, 0X92, 0X00, 0XA9, 0X50, 0X55, 0X02, 0XF6, 0X14, 0XE1, 0X65, 0X42, 0X8A, 0X55, 0X50, 0X90, 0X22, 0X25, 0X00, 0X15, 0X50, 0XAA, 0X05, 0XB4, 0X14, 0X90, 0X8A, 0XA1, 0X29, 0X44, 0X8A, 0XAA, 0X89, 0X48, 0X80, 0X09, 0X28, 0XAA, 0X82, 0XEE, 0X16, 0X68, 0X6A, 0X84, 0X15, 0X2A, 0X52, 0X50, 0X44, 0X12, 0X50, 0X05, 0X48, 0X52, 0X05, 0XB4, 0X14, 0XA8, 0X25, 0X42, 0X89, 0X51, 0X25, 0X55, 0X29, 0X44, 0X95, 0X0A, 0X50, 0XAA, 0X86, 0XEA, 0X15, 0X50, 0X0A, 0X42, 0XA4, 0X8A, 0X90, 0XA0, 0X02, 0X29, 0X24, 0X85, 0X28, 0X4A, 0X83, 0X5A, 0X14, 0XAC, 0X29, 0X42, 0X55, 0X24, 0X4A, 0XAA, 0XA8, 0X82, 0X49, 0X08, 0XA0, 0XA9, 0X0D, 0XEA, 0X2A, 0X52, 0X05, 0X01, 0X20, 0XA9, 0X21, 0X50, 0X02, 0X28, 0X24, 0X85, 0X50, 0X55, 0X45, 0X54, 0X2A, 0XAA, 0X0A, 0XC5, 0X55, 0X12, 0X4A, 0X4A, 0XA8, 0X84, 0X92, 0X52, 0X08, 0X8A, 0X4B, 0XD8, 0X52, 0X49, 0X09, 0X01, 0X08, 0XA4, 0X91, 0X28, 0X02, 0X50, 0X49, 0X09, 0X60, 0X51, 0X4A, 0XA8, 0X94, 0XA5, 0X04, 0XA2, 0X51, 0X11, 0X08, 0XA1, 0X28, 0X0A, 0X04, 0X92, 0X10, 0XAA, 0X97, 0XD4, 0X52, 0X54, 0X8A, 0X41, 0X40, 0X88, 0X45, 0X54, 0X02, 0XA0, 0X28, 0X09, 0X48, 0X14, 0X0A, 0XA1, 0X48, 0X92, 0X42, 0X82, 0X21, 0X25, 0X20, 0X90, 0XA0, 0X08, 0X81, 0X52, 0X42, 0XA2, 0X97, 0X6A, 0XA5, 0X29, 0X08, 0X10, 0X88, 0X90, 0X94, 0XA9, 0X0A, 0XA2, 0X24, 0X09, 0X28, 0X4A, 0X89, 0X89, 0X14, 0X85, 0X65, 0X4A, 0X24, 0X44, 0X02, 0XA0, 0X20, 0X08, 0X89, 0X50, 0X95, 0X24, 0X56, 0X64, 0XAA, 0X54, 0X94, 0XA1, 0X49, 0X12, 0XA8, 0X9A, 0X09, 0X22, 0X22, 0X25, 0X22, 0X92, 0X8A, 0XAA, 0XA2, 0XAA, 0X4A, 0X4C, 0X92, 0X48, 0X44, 0XA0, 0XA0, 0X88, 0X91, 0X48, 0X94, 0X54, 0X5A, 0XD5, 0X2A, 0XA5, 0X51, 0X22, 0X49, 0X25, 0X22, 0X94, 0X0A, 0X22, 0X4A, 0X12, 0X4A, 0XA9, 0XAE, 0X52, 0XAA, 0X55, 0X56, 0XAA, 0XA5, 0X52, 0X94, 0XA9, 0X20, 0X89, 0X11, 0X4A, 0XA5, 0X22, 0XDA, 0X95, 0X55, 0XAA, 0XA9, 0X55, 0X55, 0X4A, 0X52, 0X90, 0X44, 0X24, 0X48, 0XA4, 0X94, 0XA9, 0XAD, 0X6D, 0X55, 0X55, 0X56, 0XAA, 0XAA, 0XAA, 0XAA, 0XA9, 0X12, 0X89, 0X25, 0X12, 0X55, 0X50, 0X06, 0X96, 0XED, 0X6A, 0XAA, 0XAD, 0X55, 0X55, 0X55, 0X44, 0X00, 0X20, 0X92, 0X55, 0X55, 0X50, 0X05, 0X5B, 0X56, 0XB6, 0XDA, 0XB5, 0XBA, 0XDB, 0X6D, 0X30, 0XAA, 0X8A, 0X49, 0X4A, 0XAA, 0XA0, 0X0E, 0XAD, 0XAD, 0XDB, 0X6D, 0XAE, 0XD5, 0XB6, 0XB6, 0X92, 0X00, 0X21, 0X12, 0X29, 0X55, 0X58, 0X05, 0X76, 0XEB, 0X5D, 0X56, 0XB5, 0X7B, 0X6D, 0XDB, 0X50, 0X55, 0X14, 0X49, 0X55, 0X2A, 0XD0, 0X02, 0X9F, 0XB9, 0XD6, 0XED, 0XB7, 0X96, 0XFB, 0X77, 0X4A, 0X70, 0XA2, 0X92, 0X44, 0XAA, 0XB9, 0X15, 0X4A, 0XEE, 0XDE, 0XB5, 0XF5, 0XDB, 0XAF, 0XDD, 0X28, 0X8A, 0X08, 0X49, 0X2A, 0XAA, 0XAA, 0X9D, 0X7F, 0XBD, 0XEB, 0XDF, 0X55, 0X77, 0XFD, 0XFF, 0XA5, 0X25, 0X65, 0X24, 0X91, 0X2A, 0XA9, 0X03, 0X0D, 0XDF, 0X6E, 0XDA, 0XEF, 0XB5, 0XB7, 0X6B, 0X2A, 0X94, 0X9A, 0XD5, 0X55, 0X4A, 0XAA, 0XC2, 0X6F, 0XF7, 0XFF, 0XFB, 0XBD, 0XFF, 0XFF, 0XFF, 0X56, 0XEB, 0X56, 0XB6, 0XDA, 0XB5, 0X53, 0X03, 0X57, 0XFF, 0XDE, 0XDF, 0XFF, 0XB7, 0XFF, 0XFF, 0X56, 0XA5, 0XDD, 0XDD, 0XB7, 0X55, 0X59, 0X61, 0XA9, 0XBD, 0X7B, 0XFD, 0XED, 0XFD, 0X5B, 0X6F, 0X57, 0XE9, 0XDF, 0XFF, 0XFA, 0XEA, 0XA5, 0X61, 0X40, 0X3F, 0XF7, 0X56, 0XB7, 0XAF, 0XEF, 0XFF, 0X56, 0X2C, 0X77, 0X77, 0X6F, 0XB5, 0X40, 0X00, 0X01, 0X07, 0XFD, 0XFF, 0XDE, 0XF5, 0X7F, 0XFF, 0X57, 0XEF, 0X1F, 0XFF, 0XFF, 0XFD, 0X51, 0X20, 0X28, 0X0B, 0XFF, 0XDB, 0XFF, 0XFF, 0XFF, 0XFF, 0X4F, 0XDD, 0XDF, 0XFD, 0XFF, 0XD6, 0X84, 0X10, 0X00, 0X1F, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0X57, 0X7B, 0XDE, 0XDF, 0XFD, 0XFF, 0XFB, 0XA4, 0X95, 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XF7, 0XDF, 0X5F, 0XF7, 0XDF, 0XFF, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0XFF, 0XFF, 0XFF }; const unsigned char ris_3[]PROGMEM = { 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 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, 0XFF, 0XC0, 0X03, 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, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X80, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0XFF, 0XC1, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XFF, 0X83, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XFF, 0X0F, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XFE, 0X1F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X03, 0XFC, 0X3F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X03, 0XF8, 0X7F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X07, 0XF0, 0XFF, 0XFF, 0X01, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X07, 0XE1, 0XFF, 0XFC, 0X07, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X07, 0XC3, 0XFF, 0XF8, 0X0F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X07, 0X83, 0XFF, 0XF0, 0X3F, 0XFF, 0X00, 0X00, 0X03, 0XE0, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X07, 0X07, 0XFF, 0XC0, 0X7F, 0XFE, 0X00, 0X80, 0X1F, 0XFC, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X07, 0X0F, 0XFF, 0X81, 0XFF, 0XFC, 0X07, 0XF8, 0X7F, 0XFF, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X06, 0X1F, 0XFF, 0X03, 0XFF, 0XF8, 0X1F, 0XF8, 0XFF, 0XFF, 0X80, 0X7C, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X3F, 0XFE, 0X07, 0XFF, 0XF0, 0X3F, 0XF0, 0XFF, 0XFF, 0XC0, 0X7E, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X7F, 0XF8, 0X1F, 0XFF, 0XE0, 0X7F, 0XF1, 0XFF, 0X7F, 0XC0, 0X7E, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X7F, 0XF0, 0X3F, 0XFF, 0XC0, 0XFF, 0XE1, 0XF8, 0X0F, 0XE0, 0X7F, 0X01, 0XC0, 0X03, 0X80, 0X00, 0XFF, 0XE0, 0X7F, 0XFF, 0X83, 0XFF, 0XE3, 0XF0, 0X03, 0XE0, 0X7F, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XFF, 0XC0, 0XFF, 0XFF, 0X07, 0XFF, 0XC3, 0XF0, 0X03, 0XF0, 0X7F, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XFE, 0X01, 0XFF, 0XFE, 0X0F, 0XFF, 0X87, 0XE3, 0XE1, 0XF8, 0X3F, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X7F, 0XF8, 0X3F, 0XFF, 0X87, 0XE7, 0XF0, 0XFC, 0X3F, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X1F, 0XE0, 0X7F, 0XFF, 0X0F, 0XCF, 0XF8, 0XFF, 0XFF, 0X01, 0XC0, 0X03, 0X80, 0X03, 0XFE, 0X00, 0X00, 0X00, 0XFF, 0XFE, 0X0F, 0XCF, 0XF8, 0X7F, 0XFF, 0X01, 0XC0, 0X03, 0X80, 0X0F, 0XFF, 0XF8, 0X00, 0X01, 0XFF, 0XFE, 0X1F, 0XCF, 0XF8, 0X3F, 0XFE, 0X01, 0XC0, 0X03, 0X80, 0X1F, 0XFF, 0XFF, 0X80, 0X03, 0XFF, 0XFC, 0X1F, 0XCF, 0XFC, 0X1F, 0XFC, 0X01, 0XC0, 0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XF0, 0X03, 0XFF, 0XF8, 0X3F, 0X8F, 0XFC, 0X07, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XFE, 0X01, 0XFF, 0XF8, 0X3F, 0X87, 0XFE, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X0F, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XF0, 0X7F, 0X87, 0XFF, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X0F, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XE0, 0XFF, 0X87, 0XFF, 0X80, 0X1F, 0X01, 0XC0, 0X03, 0X80, 0X0F, 0XFF, 0XFF, 0XFF, 0XF8, 0X0F, 0XE0, 0XFF, 0X07, 0XFF, 0XC0, 0X7F, 0X01, 0XC0, 0X03, 0X80, 0X07, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X01, 0XFF, 0X07, 0XFF, 0XE0, 0X7F, 0X81, 0XC0, 0X03, 0X80, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0XFE, 0X07, 0XFF, 0XF0, 0X7F, 0X81, 0XC0, 0X03, 0X80, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X3C, 0X07, 0XFF, 0XF0, 0XFF, 0X81, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X07, 0XFF, 0XF0, 0XFF, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0X80, 0X00, 0X0F, 0XFF, 0XF0, 0XFF, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFE, 0X0F, 0X0F, 0XFF, 0XE0, 0X7F, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X3F, 0XF0, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XE0, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X7F, 0XFF, 0X80, 0X1F, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XC0, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X7F, 0XFF, 0XF8, 0X03, 0XFF, 0XFF, 0XFF, 0XC3, 0XFF, 0X80, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X7F, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XC0, 0XFC, 0X02, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0XFF, 0XFF, 0XFF, 0XE0, 0X07, 0XFF, 0XFF, 0XC0, 0X00, 0X0F, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X1F, 0XFF, 0X80, 0X00, 0X1F, 0X80, 0X01, 0XC0, 0X03, 0X80, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0X80, 0X01, 0XC0, 0X03, 0X80, 0X00, 0XFF, 0X80, 0X7F, 0XFF, 0XF0, 0X00, 0X00, 0X07, 0X0F, 0X8F, 0XC0, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XFC, 0X00, 0X1F, 0XFF, 0XFC, 0X03, 0XF8, 0X07, 0X8F, 0X8F, 0XE0, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XF8, 0X00, 0X07, 0XFF, 0XFC, 0X0F, 0XFE, 0X07, 0X8F, 0XC7, 0XF0, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XF1, 0X80, 0X01, 0XFF, 0XFC, 0X1F, 0XFF, 0X07, 0X8F, 0XC7, 0XF0, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XF1, 0XF0, 0XF0, 0XFF, 0XFC, 0X3F, 0XFF, 0X87, 0X87, 0XC7, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X03, 0XE1, 0XE3, 0XFC, 0X7F, 0XF8, 0X7E, 0X3F, 0X87, 0X87, 0XE3, 0XFC, 0X01, 0XC0, 0X03, 0X80, 0X03, 0XE1, 0XE7, 0XFE, 0X1F, 0XF8, 0X7C, 0X1F, 0X87, 0XC7, 0XE3, 0XFC, 0X01, 0XC0, 0X03, 0X80, 0X03, 0XE3, 0XE7, 0XFE, 0X03, 0XE0, 0X7E, 0X0F, 0X87, 0XC7, 0XE3, 0XFE, 0X01, 0XC0, 0X03, 0X80, 0X07, 0XE3, 0XC7, 0XFE, 0X00, 0X00, 0X7E, 0X0F, 0X87, 0XC7, 0XE1, 0XFE, 0X01, 0XC0, 0X03, 0X80, 0X07, 0XE3, 0XC7, 0XFE, 0X00, 0X00, 0X3F, 0X0F, 0X87, 0XC7, 0XF1, 0XFF, 0X01, 0XC0, 0X03, 0X80, 0X07, 0XE3, 0XE0, 0XFE, 0X00, 0X00, 0X3F, 0X0F, 0X87, 0XC3, 0XF0, 0XFF, 0X81, 0XC0, 0X03, 0X80, 0X0F, 0XE1, 0XE0, 0X7C, 0X00, 0X00, 0X00, 0X1F, 0X87, 0XC3, 0XF0, 0XFF, 0X81, 0XC0, 0X03, 0X80, 0X1F, 0XE1, 0XF0, 0X7C, 0X0F, 0XE0, 0X00, 0X3F, 0X07, 0XE3, 0XF0, 0XFF, 0X81, 0XC0, 0X03, 0X80, 0X1F, 0XF1, 0XFF, 0XF8, 0X3F, 0XF8, 0X00, 0XFF, 0X07, 0XE3, 0XF8, 0XFF, 0XC1, 0XC0, 0X03, 0X80, 0X3F, 0XF0, 0XFF, 0XF0, 0X7F, 0XF8, 0X03, 0XFE, 0X07, 0XE3, 0XF8, 0X7F, 0XC1, 0XC0, 0X03, 0X80, 0X7F, 0XF8, 0X7F, 0XC1, 0XFF, 0XF8, 0X07, 0XFE, 0X07, 0XE3, 0XF8, 0X7F, 0XC1, 0XC0, 0X03, 0X80, 0XFF, 0XFC, 0X1F, 0X03, 0XFF, 0XF0, 0X0F, 0XFC, 0X07, 0XE1, 0XFC, 0X7F, 0XE1, 0XC0, 0X03, 0X81, 0XFF, 0XFE, 0X00, 0X0F, 0XFF, 0XF0, 0X1F, 0XF8, 0X03, 0XE1, 0XFC, 0X3F, 0XE1, 0XC0, 0X03, 0X81, 0XFF, 0XFF, 0X80, 0X3F, 0XFF, 0XF0, 0X1F, 0XF8, 0X03, 0XE1, 0XFC, 0X3F, 0XE1, 0XC0, 0X03, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XF0, 0X03, 0XF1, 0XFE, 0X3F, 0XE1, 0XC0, 0X03, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X03, 0XF1, 0XFE, 0X1F, 0XC1, 0XC0, 0X03, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X03, 0XF1, 0XFE, 0X1F, 0XC1, 0XC0, 0X03, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X3F, 0X00, 0X03, 0XF0, 0XFF, 0X0F, 0X81, 0XC0, 0X03, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0X03, 0XF0, 0XFF, 0X07, 0X01, 0XC0, 0X03, 0X83, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, 0X83, 0XF0, 0XFF, 0X00, 0X01, 0XC0, 0X03, 0X83, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0X83, 0XF0, 0XFF, 0X80, 0X01, 0XC0, 0X03, 0X87, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0X83, 0XF8, 0XFF, 0X80, 0X01, 0XC0, 0X03, 0X87, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0XC3, 0XF8, 0XFF, 0X80, 0X01, 0XC0, 0X03, 0X87, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0XC3, 0XF8, 0X7F, 0XC0, 0X01, 0XC0, 0X03, 0X87, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0X8F, 0XF0, 0X3F, 0XC3, 0XF8, 0X7F, 0XC0, 0X01, 0XC0, 0X03, 0X87, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0X8F, 0XF0, 0X3F, 0XC3, 0XF8, 0X7F, 0XC0, 0X01, 0XC0, 0X03, 0X87, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0X8F, 0XE0, 0X1F, 0XC3, 0XF8, 0X7F, 0XC0, 0X01, 0XC0, 0X03, 0X87, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0X8F, 0XE0, 0X3F, 0XC3, 0XF8, 0X7F, 0XE0, 0X01, 0XC0, 0X03, 0X80, 0X78, 0X00, 0X7F, 0XFF, 0XFF, 0X8F, 0XE0, 0X3F, 0XC3, 0XF8, 0X7F, 0XE0, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0X87, 0XF0, 0X7F, 0XC3, 0XF8, 0X3F, 0XE0, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0X87, 0XF0, 0XFF, 0XC3, 0XF8, 0X3F, 0XF0, 0X01, 0XC0, 0X03, 0X80, 0X3F, 0XF8, 0X03, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0X83, 0XFC, 0X3F, 0XF0, 0X01, 0XC0, 0X03, 0X80, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0X87, 0XFF, 0XFF, 0X87, 0XFC, 0X3F, 0XF0, 0X01, 0XC0, 0X03, 0X81, 0XFF, 0XFF, 0XE0, 0X3F, 0XFF, 0X87, 0XFF, 0XFF, 0X87, 0XFC, 0X3F, 0XF0, 0X01, 0XC0, 0X03, 0X80, 0XFF, 0XFF, 0XF8, 0X1F, 0XFF, 0X83, 0XFF, 0XFF, 0X87, 0XFC, 0X3F, 0XF0, 0X01, 0XC0, 0X03, 0X80, 0X7F, 0XFF, 0XFC, 0X1F, 0XFF, 0X83, 0XFF, 0XFF, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X01, 0XFF, 0XFE, 0X0F, 0XFF, 0X81, 0XFF, 0XFF, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X01, 0XFF, 0X07, 0XFF, 0X80, 0X00, 0XFE, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0XFF, 0X87, 0XFF, 0X80, 0X00, 0X00, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X7F, 0X83, 0XFF, 0X80, 0X00, 0X00, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X3F, 0XC3, 0XFF, 0XC3, 0XFF, 0X00, 0X07, 0XFC, 0X1F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X1F, 0XC0, 0X7F, 0XC3, 0XFF, 0XC3, 0XFF, 0XFC, 0X07, 0XFC, 0X0F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XC3, 0XFF, 0XC3, 0XFF, 0XFF, 0X07, 0XFC, 0X0F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XC1, 0XFF, 0XC3, 0XFF, 0XFE, 0X07, 0XFC, 0X0F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X1F, 0XFF, 0XFF, 0XE1, 0XFF, 0XC1, 0XC0, 0X7E, 0X0F, 0XFC, 0X0F, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X0F, 0XFF, 0XFF, 0XE1, 0XFF, 0XC1, 0XE0, 0X7E, 0X07, 0XF8, 0X07, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X03, 0XFF, 0XFF, 0XE1, 0XFF, 0XC1, 0XF0, 0X7C, 0X07, 0XF8, 0X07, 0XF8, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X3F, 0XFF, 0XE1, 0XFF, 0XE0, 0XF0, 0XFC, 0X07, 0XF8, 0X03, 0XF0, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X0F, 0XFF, 0XE1, 0XFF, 0XE0, 0X7B, 0XF8, 0X07, 0XF8, 0X01, 0XE0, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X07, 0XFF, 0XE1, 0XFF, 0XE0, 0X7F, 0XF0, 0X07, 0XF0, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X01, 0XFF, 0XC1, 0XFF, 0XE0, 0X3F, 0XE0, 0X07, 0XF0, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X3E, 0X01, 0XFE, 0X00, 0X1F, 0XC0, 0X03, 0XE0, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0X80, 0X03, 0X80, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X06, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0X03, 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, 0XC0, 0X03, 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, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00 }; const unsigned char ris_4[]PROGMEM = { 0X00, 0X00, 0X00, 0X01, 0XE0, 0X00, 0X24, 0X07, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X04, 0X00, 0X00, 0X1F, 0XF0, 0X98, 0XF8, 0X0C, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0X3F, 0X00, 0X42, 0XF8, 0X00, 0X3F, 0X9E, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0XC0, 0X00, 0X8E, 0XF0, 0X03, 0X98, 0X83, 0XC1, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0C, 0X00, 0X00, 0X0C, 0XE1, 0X1C, 0X00, 0X01, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1C, 0X01, 0X80, 0X18, 0XF2, 0X39, 0XFF, 0XF0, 0X78, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X10, 0X28, 0X98, 0X31, 0XE8, 0X7F, 0XFF, 0XFE, 0X2C, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11, 0X40, 0X02, 0X03, 0XC1, 0XE9, 0XC0, 0X12, 0X06, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X80, 0X01, 0X83, 0X81, 0XF0, 0X80, 0X01, 0X0B, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X30, 0XC3, 0XC7, 0X10, 0X03, 0XC0, 0X85, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X40, 0X60, 0X5B, 0X77, 0X13, 0X1F, 0XFE, 0X80, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X06, 0X30, 0X80, 0X8E, 0X3E, 0X3A, 0XFF, 0XFF, 0XC0, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, 0X06, 0X16, 0X1F, 0X8D, 0X96, 0X3E, 0X3F, 0XF8, 0X00, 0X70, 0X2C, 0X00, 0X00, 0X00, 0X00, 0X00, 0X19, 0X93, 0XEF, 0XC9, 0XB7, 0X1A, 0X3F, 0XC1, 0X72, 0X3C, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X09, 0X00, 0X10, 0XF0, 0X37, 0X58, 0X7F, 0X06, 0XFF, 0X2F, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XC4, 0X00, 0X19, 0X37, 0XF9, 0XFE, 0X7F, 0X87, 0X81, 0XC8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X06, 0X46, 0X1A, 0X09, 0XB7, 0X72, 0XD8, 0XFF, 0XF0, 0X59, 0XEC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X88, 0X02, 0XEF, 0XFC, 0XFB, 0X12, 0X33, 0X1F, 0XCE, 0X1C, 0X70, 0X00, 0X00, 0X00, 0X00, 0X00, 0X81, 0X97, 0XFB, 0XFF, 0X7B, 0XFF, 0XB0, 0X08, 0XFF, 0XC3, 0X18, 0X40, 0X00, 0X00, 0X00, 0X00, 0X03, 0X88, 0X07, 0XFA, 0X6D, 0X8F, 0XF0, 0X59, 0XFE, 0X70, 0X08, 0X00, 0X00, 0X00, 0X00, 0X00, 0X78, 0X30, 0X07, 0XF9, 0X2E, 0XFC, 0XFF, 0X9B, 0XFF, 0XFC, 0X3C, 0X30, 0X00, 0X00, 0X00, 0X00, 0X31, 0X1E, 0X3F, 0XFD, 0X27, 0XDF, 0X7F, 0XE1, 0X1F, 0XFF, 0XEF, 0X10, 0X00, 0X00, 0X00, 0X00, 0X9C, 0XC7, 0XBF, 0XFD, 0XFC, 0X87, 0X37, 0XBC, 0X0D, 0XFC, 0X73, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFE, 0XE1, 0XE7, 0XD7, 0XDE, 0XFF, 0X76, 0X3B, 0XF0, 0X06, 0X1D, 0XCC, 0X00, 0X00, 0X00, 0X06, 0X00, 0XFC, 0X63, 0X8F, 0X8F, 0XFF, 0XFF, 0X1F, 0XEC, 0X03, 0X86, 0X60, 0X00, 0X00, 0X00, 0X00, 0X03, 0XDC, 0X1F, 0XEF, 0XDF, 0XFF, 0XFF, 0XFF, 0XE6, 0X5E, 0XC1, 0XB0, 0X00, 0X00, 0X00, 0X00, 0X18, 0X50, 0X3F, 0X3F, 0XFF, 0XFF, 0XFF, 0XF3, 0XE3, 0XFF, 0XF0, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X51, 0XE1, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XBA, 0X8F, 0XFC, 0X70, 0X00, 0X00, 0X00, 0X00, 0X80, 0XC3, 0X0F, 0XFE, 0X9F, 0XFF, 0X7F, 0XFF, 0XDE, 0XE3, 0XFC, 0X38, 0X00, 0X00, 0X00, 0X03, 0X83, 0XC2, 0X7E, 0X00, 0X0F, 0XFF, 0XE3, 0XFC, 0XFB, 0X70, 0X7F, 0X10, 0X00, 0X00, 0X00, 0X06, 0X0B, 0X81, 0XE3, 0XFF, 0XFF, 0XFF, 0XFD, 0XFF, 0X3F, 0XBB, 0XEF, 0X8C, 0X00, 0X00, 0X00, 0X00, 0X0F, 0X0F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XD9, 0XEB, 0XFF, 0XCC, 0X00, 0X00, 0X00, 0X20, 0X0E, 0X1C, 0XFF, 0X7F, 0XFC, 0X9F, 0XBF, 0XF7, 0XEE, 0X7F, 0X3D, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X7C, 0X37, 0XE0, 0X3A, 0X7F, 0XFF, 0XF3, 0XFC, 0X73, 0X3F, 0XDE, 0XCE, 0X00, 0X00, 0X00, 0X00, 0XFC, 0XDE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0X39, 0XBC, 0XC7, 0XE7, 0X00, 0X00, 0X00, 0X01, 0XF9, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0X8E, 0XCE, 0X73, 0XB3, 0XC0, 0X00, 0X00, 0X8F, 0XF3, 0X4F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC3, 0XF6, 0X6F, 0X1B, 0XF1, 0XC0, 0X00, 0X00, 0X1F, 0XE2, 0X3E, 0XFF, 0XFF, 0XFF, 0X7F, 0X8F, 0XF8, 0XFF, 0X7C, 0XEF, 0XF9, 0X30, 0X00, 0X00, 0X02, 0X64, 0X77, 0XFF, 0XFF, 0XFF, 0XFF, 0XFA, 0X7F, 0X35, 0XFE, 0XE7, 0XED, 0X10, 0X00, 0X00, 0X08, 0X69, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0X9F, 0XDF, 0XFF, 0XFD, 0X80, 0X00, 0X08, 0X03, 0X43, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XEE, 0X4F, 0X9F, 0XFE, 0X00, 0X00, 0X08, 0X26, 0X56, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XF7, 0X6F, 0XCE, 0XF9, 0X80, 0X00, 0X01, 0XFC, 0X0C, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFD, 0XFE, 0XFB, 0XBF, 0XFE, 0X6D, 0XC0, 0X00, 0X07, 0XF8, 0X09, 0XC0, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0X3D, 0X7F, 0XBF, 0XBF, 0XF4, 0X40, 0X00, 0X1C, 0X05, 0X93, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFD, 0X9F, 0X9F, 0XB7, 0X20, 0X00, 0X38, 0X00, 0X86, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XDF, 0X8B, 0X50, 0X00, 0X60, 0X20, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XFF, 0XFF, 0X7B, 0XC5, 0X0C, 0X00, 0XC0, 0X71, 0X9B, 0XC0, 0XFF, 0XFF, 0XFF, 0XC0, 0X7B, 0XFB, 0XFF, 0X7B, 0XBF, 0XF9, 0X8E, 0X00, 0XC8, 0X03, 0X96, 0X00, 0X3F, 0XFF, 0XFD, 0X00, 0X20, 0X3D, 0XFF, 0XD3, 0XBF, 0XFC, 0XC7, 0X00, 0X88, 0X03, 0X94, 0X07, 0X1F, 0XFF, 0XF9, 0X8C, 0X00, 0X36, 0XFB, 0XFF, 0XFF, 0XFF, 0X63, 0X00, 0X1A, 0XC3, 0X8C, 0X07, 0XDF, 0X7F, 0XF3, 0XDE, 0X1F, 0XBE, 0XF7, 0XFF, 0XFF, 0XF2, 0X20, 0X80, 0X13, 0X83, 0X88, 0X03, 0XFF, 0XFF, 0XF7, 0XFE, 0XFF, 0XFF, 0XF7, 0XFD, 0X3F, 0XFD, 0XD0, 0X40, 0X05, 0X81, 0X88, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XBF, 0XDB, 0XFA, 0X40, 0X85, 0XC3, 0X8D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0XDF, 0X9F, 0X80, 0X7D, 0X20, 0X01, 0X07, 0X9D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XEF, 0XD7, 0X80, 0X0C, 0X80, 0XD4, 0X87, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XFF, 0XDF, 0X9F, 0X8E, 0X00, 0X5F, 0X87, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XAF, 0XFF, 0XC7, 0X84, 0XDF, 0X87, 0X8F, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XF7, 0XFF, 0XFF, 0X61, 0XE0, 0X15, 0X03, 0X9F, 0XE8, 0XE3, 0XFF, 0XFF, 0XF8, 0X01, 0XFF, 0X9F, 0XFF, 0XDF, 0XFE, 0XB0, 0X78, 0X14, 0X87, 0X1F, 0XFC, 0X30, 0X7F, 0XFF, 0XF9, 0XD8, 0XFF, 0X9F, 0XFF, 0X7F, 0XF7, 0X1E, 0X1E, 0X14, 0X03, 0X1F, 0XEF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFC, 0X3F, 0XDF, 0XFB, 0XFF, 0XFF, 0XCF, 0X07, 0X98, 0XC7, 0X1F, 0XC7, 0XFE, 0X3F, 0XFF, 0XFC, 0XFF, 0X1F, 0XDF, 0XF3, 0XDF, 0XE7, 0XE3, 0XE1, 0X98, 0X87, 0X1F, 0X80, 0XFF, 0X3F, 0XFE, 0XF0, 0X1F, 0XFF, 0X0F, 0XBB, 0XFF, 0XF8, 0XF8, 0XD9, 0X98, 0X87, 0X1F, 0X0F, 0X77, 0X1F, 0XF8, 0XE1, 0XF3, 0XEF, 0XCF, 0XFB, 0XFF, 0XFE, 0X7C, 0X6C, 0X08, 0X0B, 0X1E, 0X3E, 0X43, 0X1F, 0XF8, 0X07, 0X80, 0XEF, 0XDF, 0X7F, 0XDF, 0XFF, 0X1E, 0XFE, 0X08, 0X86, 0X1E, 0X78, 0X19, 0X1F, 0XF2, 0X4F, 0X02, 0X7F, 0XFB, 0XE7, 0XFF, 0XF9, 0XC3, 0X8F, 0X18, 0X86, 0X1E, 0X30, 0X9B, 0X1F, 0XF7, 0XFF, 0X23, 0X0E, 0XFB, 0XDF, 0XFF, 0XFD, 0XF6, 0XC7, 0X18, 0X8E, 0X1E, 0X98, 0X1B, 0X3F, 0XF7, 0XBF, 0X03, 0XFF, 0XE7, 0X7F, 0XFF, 0XBE, 0X73, 0XB3, 0X18, 0XCE, 0X3F, 0XD8, 0X73, 0X3F, 0XE7, 0XC7, 0X03, 0XFF, 0XFD, 0XF3, 0XEF, 0X9D, 0X18, 0XF9, 0X18, 0X46, 0X0E, 0X7F, 0XF7, 0X7F, 0XF7, 0XCB, 0X7E, 0X7F, 0XFF, 0XF7, 0XFF, 0X2F, 0XDE, 0X6C, 0X58, 0X04, 0X2E, 0X0F, 0XEE, 0X7F, 0XFB, 0X10, 0X30, 0X11, 0XFF, 0XFF, 0XFF, 0X0F, 0XE7, 0X34, 0X18, 0X04, 0X2C, 0X80, 0X1C, 0X7F, 0XFD, 0X9C, 0X06, 0X38, 0XFD, 0XFD, 0XFF, 0XFD, 0XFF, 0X1E, 0X00, 0X04, 0X09, 0X81, 0XF8, 0X7F, 0XFF, 0X87, 0XFF, 0XFC, 0XFF, 0XFD, 0XFF, 0XF0, 0XFF, 0X8E, 0X00, 0X04, 0X33, 0XEF, 0XF8, 0X7F, 0XC7, 0XF3, 0XFF, 0XEF, 0XFF, 0XFF, 0XF9, 0XF0, 0X39, 0XCD, 0X00, 0X00, 0X73, 0XBF, 0XB8, 0X7E, 0XF7, 0XF8, 0X7B, 0XCF, 0XFF, 0XFF, 0XF9, 0X7C, 0X1F, 0XE7, 0X00, 0X00, 0X7A, 0X96, 0X78, 0X76, 0XFF, 0XFF, 0X0F, 0XC6, 0X79, 0XFB, 0X3C, 0X1E, 0XC6, 0XE7, 0X00, 0X00, 0X48, 0X4E, 0X78, 0XFE, 0XFF, 0XFF, 0XF8, 0X70, 0X79, 0XFF, 0XFF, 0X1E, 0XC1, 0XF3, 0X00, 0X00, 0X59, 0XFE, 0X79, 0XFE, 0X7F, 0XFC, 0XFF, 0X9E, 0XBF, 0XFB, 0XFF, 0X0E, 0XF4, 0XFF, 0X00, 0X00, 0X1B, 0XEB, 0X71, 0XFF, 0XBD, 0XFF, 0XFF, 0XFF, 0XFD, 0XFF, 0XEE, 0X7C, 0X42, 0X7F, 0X00, 0X00, 0X3F, 0X3F, 0XF3, 0XBF, 0XBE, 0X7F, 0XFF, 0XF7, 0XF6, 0XFF, 0X0E, 0X7E, 0XE9, 0X3B, 0X00, 0X00, 0X3F, 0XFF, 0XE3, 0XF2, 0XBF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFD, 0X8C, 0X7E, 0X99, 0XBB, 0X00, 0X00, 0X7F, 0XFF, 0XC7, 0XF2, 0X5F, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF, 0X99, 0XFC, 0X9D, 0XBB, 0X00, 0X00, 0X7E, 0XDF, 0XC7, 0XFF, 0XCD, 0XFF, 0XFF, 0XBF, 0XF4, 0XFF, 0X9B, 0XFD, 0XCC, 0XDF, 0X00, 0X00, 0X7F, 0XCF, 0X4F, 0XFF, 0XC9, 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0X19, 0XBD, 0XEE, 0XDF, 0X00, 0X00, 0X7F, 0XDE, 0XCF, 0XFF, 0XC8, 0XFF, 0XFF, 0XFF, 0XFE, 0XDE, 0X1D, 0XBD, 0X6E, 0X5F, 0X00, 0X00, 0X7F, 0XAD, 0XCF, 0XFF, 0XC8, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0X3F, 0XFF, 0XEE, 0X3F, 0X00, 0X00, 0X7F, 0XFD, 0XDF, 0XFF, 0XCC, 0X7F, 0XFF, 0XFF, 0XF6, 0X3E, 0X1F, 0XFC, 0XF7, 0X3F, 0X00, 0X00, 0X3F, 0XF7, 0X8F, 0XFF, 0XDE, 0X7F, 0XFF, 0XFF, 0XF6, 0X7E, 0X8F, 0XFC, 0XFF, 0X3B, 0X00, 0X00, 0X3F, 0XEF, 0X8F, 0XFF, 0XFF, 0X37, 0XFF, 0XFF, 0XFE, 0X7E, 0XC3, 0X7A, 0X7B, 0X3F, 0X00, 0X00, 0X3F, 0X3F, 0X07, 0XFF, 0XFF, 0XBB, 0XFF, 0XFF, 0XFF, 0X7F, 0XC3, 0X73, 0X3B, 0X3B, 0X00, 0X00, 0X3F, 0X3F, 0X07, 0XFF, 0XFF, 0XBD, 0XFF, 0XFF, 0XFF, 0X3F, 0XCF, 0XB7, 0X3F, 0X3F, 0X00, 0X00, 0X3E, 0XFF, 0X03, 0XFE, 0X03, 0X3E, 0XFF, 0XFF, 0X9F, 0X3C, 0XCF, 0XAB, 0XCE, 0X3F, 0X00, 0X00, 0X3B, 0XFF, 0X01, 0XF8, 0XFC, 0X7E, 0X7F, 0XFF, 0XDF, 0X3B, 0X8F, 0X9B, 0XE6, 0X3F, 0X00, 0X00, 0X39, 0XFF, 0XE0, 0X01, 0XFC, 0XFF, 0X3F, 0XEF, 0XFF, 0X7B, 0XDF, 0XB3, 0XFE, 0X7B, 0X00, 0X00, 0X39, 0XFE, 0XF8, 0X0F, 0X9F, 0XFF, 0XBF, 0XFF, 0XFF, 0X37, 0X9F, 0XB7, 0X3F, 0X7F, 0X00, 0X00, 0X31, 0XFA, 0X7F, 0XFC, 0XB7, 0XFF, 0XDF, 0XFF, 0XFE, 0X3F, 0X9F, 0XA4, 0X7F, 0X7F, 0X00, 0X00, 0X3B, 0XFE, 0XFF, 0XF0, 0XF6, 0XBF, 0XCF, 0XFF, 0XFE, 0X7F, 0X9B, 0X84, 0X3B, 0XFE, 0X00, 0X00, 0X31, 0XFD, 0XFF, 0XF3, 0XF7, 0XE0, 0XCF, 0XFF, 0XFF, 0X7B, 0X9B, 0XCF, 0X01, 0XEE, 0X00, 0X00, 0X33, 0XF1, 0XFF, 0XF7, 0XFF, 0XF6, 0X77, 0XF9, 0XFE, 0X7B, 0XBF, 0XDF, 0X87, 0XCF, 0X00, 0X00, 0X31, 0XB7, 0XFF, 0XF7, 0XFF, 0XFE, 0X7B, 0XFB, 0XFE, 0X7F, 0XBF, 0XF0, 0XFF, 0X8F, 0X00, 0X00, 0X31, 0XF7, 0XBF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0X3F, 0XF0, 0XFF, 0X84, 0X00, 0X00, 0X39, 0XDF, 0X7C, 0X7F, 0XB7, 0XCF, 0XA9, 0XFF, 0XFE, 0X7F, 0X3F, 0X84, 0XF7, 0X85, 0X00, 0X00, 0X39, 0X9B, 0X71, 0XFD, 0XF7, 0XFF, 0X8D, 0X7F, 0XFC, 0X7F, 0X4F, 0X00, 0X1F, 0X05, 0X00, 0X00, 0X3D, 0XBF, 0XFF, 0XFF, 0XEF, 0X7F, 0XFF, 0XFD, 0XFF, 0X3F, 0XC4, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1D, 0X97, 0XFB, 0XFF, 0XFD, 0XFF, 0XFF, 0XFF, 0XF7, 0X7F, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X19, 0XCD, 0XFB, 0XFF, 0XE5, 0XBF, 0XDF, 0XFF, 0XFE, 0X7F, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1D, 0XC1, 0XFF, 0XBF, 0XE3, 0X7F, 0XBE, 0X7F, 0XFE, 0X3F, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0D, 0XE0, 0X64, 0X00, 0X8F, 0X39, 0X7F, 0XFF, 0XFE, 0X7F, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0C, 0XF0, 0X00, 0X00, 0X08, 0X0F, 0XEE, 0XFF, 0XFE, 0X7F, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1C, 0XF8, 0X05, 0X70, 0X09, 0X10, 0X1E, 0XFF, 0XFE, 0XFB, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0C, 0XFE, 0X0F, 0XF9, 0XBE, 0XF0, 0X5E, 0XFF, 0XFC, 0XFA, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0E, 0X7F, 0X2E, 0X6F, 0XFF, 0XE1, 0XCC, 0XF7, 0XFC, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0E, 0X7F, 0XCF, 0XFB, 0XFF, 0XE3, 0X31, 0XF7, 0XFD, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0X3F, 0XCF, 0XF3, 0XEF, 0XC3, 0XF9, 0XE7, 0XF9, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XBD, 0XCF, 0XF7, 0XEF, 0X4F, 0XF9, 0XEF, 0XF9, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X9F, 0XCF, 0X79, 0XCF, 0X0F, 0XF9, 0XEF, 0XFB, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XDF, 0X8F, 0XFF, 0X8E, 0X3C, 0XF9, 0XEF, 0XF3, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XCF, 0XCF, 0XED, 0XCF, 0X79, 0XF9, 0XEF, 0XF7, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XEF, 0XCF, 0X7C, 0XDE, 0X73, 0XFD, 0XCF, 0XF7, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XE7, 0XCE, 0X32, 0XDC, 0X67, 0XFD, 0XCF, 0XEE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X77, 0XCF, 0XD3, 0XDE, 0X4F, 0X7D, 0XCF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X77, 0XC7, 0XF7, 0X1C, 0XCF, 0X7F, 0XDF, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X33, 0XC7, 0X77, 0X18, 0X9E, 0X7F, 0XDF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3B, 0XE7, 0XF7, 0XD9, 0X3F, 0XFF, 0XDF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1B, 0XE7, 0XE7, 0X39, 0X7A, 0XFF, 0X9F, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X19, 0XE7, 0XF7, 0X39, 0XFF, 0XFF, 0XBF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0D, 0XE3, 0XE7, 0X39, 0XEF, 0XFF, 0XBE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0X00, 0X00, 0X00, 0X0D, 0XE3, 0XE6, 0X73, 0XFF, 0XFF, 0X7C, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X00, 0X00, 0X00, 0X06, 0XF1, 0XF4, 0XF3, 0XFF, 0XFE, 0X78, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X00, 0X00, 0X00, 0X06, 0XF1, 0XFF, 0XE7, 0XFF, 0XFE, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11, 0X00, 0X00, 0X00, 0X02, 0X78, 0XF7, 0XC7, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X27, 0X00, 0X00, 0X00, 0X01, 0X78, 0XF7, 0XCF, 0XFF, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F, 0X00, 0X00, 0X00, 0X00, 0X3C, 0X7F, 0X9F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X00, 0X00, 0X00, 0X00, 0X1C, 0X7F, 0X9F, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0X00, 0X00, 0X00, 0X00, 0X0E, 0X3F, 0X3F, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XE7, 0X00, 0X00, 0X00, 0X00, 0X0F, 0X0C, 0X7F, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XAF, 0X00, 0X00, 0X00, 0X00, 0X07, 0X80, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X02, 0X00, 0X00, 0X00, 0X00, 0X03, 0XC1, 0XFF, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0X0A, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0XDB, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X16, 0X9D, 0X00, 0X00, 0X00, 0X00, 0X00, 0X7D, 0XEF, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11, 0XF5, 0X00, 0X00, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X63, 0X33, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X7D, 0XB3, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X1B, 0XBB, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X8C, 0X71, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X06, 0XDF, 0X07, 0X00, 0X00, 0X00, 0X00, 0X63, 0X01, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0XF9, 0XEB, 0X00, 0X00, 0X00, 0X00, 0X23, 0XF0, 0X70, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0D, 0X53, 0XE1, 0X00, 0X00, 0X00, 0X00, 0X67, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X17, 0X88, 0X0D, 0X00, 0X00, 0X00, 0X02, 0X47, 0XC1, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0X9E, 0XC9, 0X00, 0X00, 0X00, 0X03, 0X0E, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X9A, 0X9B, 0X00, 0X00, 0X00, 0X01, 0X8C, 0X0A, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X79, 0X48, 0X8B, 0X00, 0X00, 0X00, 0X01, 0X18, 0X38, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X3D, 0X83, 0X00, 0X00, 0X00, 0X02, 0X30, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3D, 0X15, 0X73, 0X00, 0X00, 0X00, 0X0E, 0X31, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X05, 0XEA, 0X31, 0XB7, 0X00, 0X00, 0X00, 0X0F, 0X27, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XEF, 0X3F, 0X4B, 0X00, 0X00, 0X00, 0X0C, 0X67, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1B, 0X17, 0XE2, 0X4D, 0X00, 0X00, 0X00, 0X16, 0X4E, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X11, 0X75, 0XAC, 0XC7, 0X00, 0X00, 0X00, 0X7E, 0X5C, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X7F, 0XFD, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X7F, 0X38, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF }; #include <Adafruit_GFX.h> #include <Adafruit_ST7735.h> #include <SPI.h> #define TFT_CS 10 #define TFT_RST -1 #define TFT_DC 8 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); long Y(0); void setup(void) { tft.initR(INITR_BLACKTAB); tft.setRotation(2); Serial.begin(9600); Y = millis(); tft.fillScreen(ST7735_BLACK); Serial.println(millis()-Y); //число миллисекунд на стирание } void loop() { Y = millis(); drawBitmapFast(0, 0, ris_1, 128, 160, random(65536), random(65536)); Serial.println(millis()-Y); //число миллисекунд на кадр Y = millis(); drawBitmapFast(0, 0, ris_2, 128, 160, random(65536), random(65536)); Serial.println(millis()-Y); //число миллисекунд на кадр Y = millis(); drawBitmapFast(0, 0, ris_3, 128, 160, random(65536), random(65536)); Serial.println(millis()-Y); //число миллисекунд на кадр Y = millis(); drawBitmapFast(0, 0, ris_4, 128, 160, random(65536), random(65536)); Serial.println(millis()-Y); //число миллисекунд на кадр } void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color, uint16_t bg) { uint8_t b(0); uint8_t bc(0); uint16_t tc(0); int16_t c = w * h; tft.startWrite(); tft.setAddrWindow(x, y, w, h); asm volatile( "mloop_%=: \n" " LPM %[b],%a[bm]+ \n" " LDI %[bc],1 \n" "loop_%=: \n" " SBRC %[b],7 \n" " MOVW %[tc],%[color] \n" " SBRS %[b],7 \n" " MOVW %[tc],%[bg] \n" " IN __tmp_reg__,%[spdr]-1 \n" " OUT %[spdr],%B[tc] \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " RJMP .+0 \n" " IN __tmp_reg__,%[spdr]-1 \n" " OUT %[spdr],%A[tc] \n" " SBIW %[c],1 \n" " BREQ exit_%= \n" " NOP \n" " LSL %[b] \n" " LSL %[bc] \n" " BRCS mloop_%= \n" " RJMP .+0 \n" " NOP \n" " RJMP loop_%= \n" "exit_%=: \n" : : [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [tc] "r" (tc), [color] "w" (color), [bg] "w" (bg), [spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c) : ); tft.endWrite(); }Выдаёт ошибка платы ардуино генуино... с новой библиотекой. Так что не судьба. вернулся к старой версии.