Refactor ALL the things + enable LTO

This commit is contained in:
Kostas Missos
2018-08-13 11:58:24 +03:00
parent 2666b440ef
commit e5abdd938e
110 changed files with 275 additions and 1961 deletions

227
bootloader/gfx/di.c Normal file
View File

@@ -0,0 +1,227 @@
/*
* Copyright (c) 2018 naehrwert
* Copyright (C) 2018 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include "di.h"
#include "../soc/t210.h"
#include "../utils/util.h"
#include "../soc/i2c.h"
#include "../soc/pmc.h"
#include "../power/max77620.h"
#include "../soc/gpio.h"
#include "../soc/pinmux.h"
#include "../soc/clock.h"
#include "di.inl"
static u32 _display_ver = 0;
static void _display_dsi_wait(u32 timeout, u32 off, u32 mask)
{
u32 end = get_tmr_us() + timeout;
while (get_tmr_us() < end && DSI(off) & mask)
;
usleep(5);
}
void display_init()
{
// Power on.
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_LDO0_CFG, 0xD0); // Configure to 1.2V.
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_GPIO7, 0x09);
// Enable MIPI CAL, DSI, DISP1, HOST1X, UART_FST_MIPI_CAL, DSIA LP clocks.
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_CLR) = 0x1010000;
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = 0x1010000;
CLOCK(CLK_RST_CONTROLLER_RST_DEV_L_CLR) = 0x18000000;
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = 0x18000000;
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) = 0x20000;
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_UART_FST_MIP_CAL) = 0xA;
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_SET) = 0x80000;
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_DSIA_LP) = 0xA;
// DPD idle.
PMC(APBDEV_PMC_IO_DPD_REQ) = 0x40000000;
PMC(APBDEV_PMC_IO_DPD2_REQ) = 0x40000000;
// Config pins.
PINMUX_AUX(PINMUX_AUX_NFC_EN) &= ~PINMUX_TRISTATE;
PINMUX_AUX(PINMUX_AUX_NFC_INT) &= ~PINMUX_TRISTATE;
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) &= ~PINMUX_TRISTATE;
PINMUX_AUX(PINMUX_AUX_LCD_BL_EN) &= ~PINMUX_TRISTATE;
PINMUX_AUX(PINMUX_AUX_LCD_RST) &= ~PINMUX_TRISTATE;
gpio_config(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_MODE_GPIO); // Backlight +-5V.
gpio_output_enable(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_OUTPUT_ENABLE); // Backlight +-5V.
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_HIGH); // Backlight +5V enable.
usleep(10000);
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_HIGH); // Backlight -5V enable.
usleep(10000);
gpio_config(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_MODE_GPIO); // Backlight PWM, Enable, Reset.
gpio_output_enable(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_OUTPUT_ENABLE);
gpio_write(GPIO_PORT_V, GPIO_PIN_1, GPIO_HIGH); // Backlight Enable enable.
// Config display interface and display.
MIPI_CAL(0x60) = 0;
exec_cfg((u32 *)CLOCK_BASE, _display_config_1, 4);
exec_cfg((u32 *)DISPLAY_A_BASE, _display_config_2, 94);
exec_cfg((u32 *)DSI_BASE, _display_config_3, 60);
usleep(10000);
gpio_write(GPIO_PORT_V, GPIO_PIN_2, GPIO_HIGH); // Backlight Reset enable.
usleep(60000);
DSI(_DSIREG(DSI_BTA_TIMING)) = 0x50204;
DSI(_DSIREG(DSI_WR_DATA)) = 0x337;
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
_display_dsi_wait(250000, _DSIREG(DSI_TRIGGER), DSI_TRIGGER_HOST | DSI_TRIGGER_VIDEO);
DSI(_DSIREG(DSI_WR_DATA)) = 0x406;
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
_display_dsi_wait(250000, _DSIREG(DSI_TRIGGER), DSI_TRIGGER_HOST | DSI_TRIGGER_VIDEO);
DSI(_DSIREG(DSI_HOST_CONTROL)) = DSI_HOST_CONTROL_TX_TRIG_HOST | DSI_HOST_CONTROL_IMM_BTA | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC;
_display_dsi_wait(150000, _DSIREG(DSI_HOST_CONTROL), DSI_HOST_CONTROL_IMM_BTA);
usleep(5000);
_display_ver = DSI(_DSIREG(DSI_RD_DATA));
if (_display_ver == 0x10)
exec_cfg((u32 *)DSI_BASE, _display_config_4, 43);
DSI(_DSIREG(DSI_WR_DATA)) = 0x1105;
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
usleep(180000);
DSI(_DSIREG(DSI_WR_DATA)) = 0x2905;
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
usleep(20000);
exec_cfg((u32 *)DSI_BASE, _display_config_5, 21);
exec_cfg((u32 *)CLOCK_BASE, _display_config_6, 3);
DISPLAY_A(_DIREG(DC_DISP_DISP_CLOCK_CONTROL)) = 4;
exec_cfg((u32 *)DSI_BASE, _display_config_7, 10);
usleep(10000);
exec_cfg((u32 *)MIPI_CAL_BASE, _display_config_8, 6);
exec_cfg((u32 *)DSI_BASE, _display_config_9, 4);
exec_cfg((u32 *)MIPI_CAL_BASE, _display_config_10, 16);
usleep(10000);
exec_cfg((u32 *)DISPLAY_A_BASE, _display_config_11, 113);
}
void display_backlight(u8 enable)
{
gpio_write(GPIO_PORT_V, GPIO_PIN_0, enable ? GPIO_HIGH : GPIO_LOW); // Backlight PWM.
}
void display_end()
{
display_backlight(0);
//TODO: figure out why this freezes.
/*DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = 1;
DSI(_DSIREG(DSI_WR_DATA)) = 0x2805;
u32 end = HOST1X(0x30A4) + 5;
while (HOST1X(0x30A4) < end)
;
DISPLAY_A(_DIREG(DC_CMD_STATE_ACCESS)) = READ_MUX | WRITE_MUX;
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = 0;
exec_cfg((u32 *)DISPLAY_A_BASE, _display_config_12, 17);
exec_cfg((u32 *)DSI_BASE, _display_config_13, 16);
usleep(10000);
if (_display_ver == 0x10)
exec_cfg((u32 *)DSI_BASE, _display_config_14, 22);
DSI(_DSIREG(DSI_WR_DATA)) = 0x1005;
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
usleep(50000);
//gpio_write(GPIO_PORT_V, GPIO_PIN_2, GPIO_LOW); //Backlight Reset disable.
//usleep(10000);
//gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_LOW); //Backlight -5V disable.
//usleep(10000);
//gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_LOW); //Backlight +5V disable.
//usleep(10000);
//Disable clocks.
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_SET) = 0x1010000;
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_CLR) = 0x1010000;
CLOCK(CLK_RST_CONTROLLER_RST_DEV_L_SET) = 0x18000000;
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_CLR) = 0x18000000;
DSI(_DSIREG(DSI_PAD_CONTROL_0)) = DSI_PAD_CONTROL_VS1_PULLDN_CLK | DSI_PAD_CONTROL_VS1_PULLDN(0xF) | DSI_PAD_CONTROL_VS1_PDIO_CLK | DSI_PAD_CONTROL_VS1_PDIO(0xF);
DSI(_DSIREG(DSI_POWER_CONTROL)) = 0;*/
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_SPIO); // Backlight PWM.
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & ~PINMUX_TRISTATE) | PINMUX_TRISTATE;
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) >> 2) << 2 | 1;
}
void display_color_screen(u32 color)
{
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_one_color, 8);
// Configure display to show single color.
DISPLAY_A(_DIREG(DC_WIN_AD_WIN_OPTIONS)) = 0;
DISPLAY_A(_DIREG(DC_WIN_BD_WIN_OPTIONS)) = 0;
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color;
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = (DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE) | GENERAL_ACT_REQ;
usleep(35000);
display_backlight(1);
}
u32 *display_init_framebuffer()
{
// Sanitize framebuffer area.
memset((u32 *)0xC0000000, 0, 0x3C0000);
// This configures the framebuffer @ 0xC0000000 with a resolution of 1280x720 (line stride 768).
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer, 32);
usleep(35000);
return (u32 *)0xC0000000;
}

353
bootloader/gfx/di.h Normal file
View File

@@ -0,0 +1,353 @@
/*
* Copyright (c) 2018 naehrwert
* Copyright (C) 2018 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _DI_H_
#define _DI_H_
#include "../utils/types.h"
/*! Display registers. */
#define _DIREG(reg) ((reg) * 4)
#define DC_CMD_GENERAL_INCR_SYNCPT 0x00
#define DC_CMD_GENERAL_INCR_SYNCPT_CNTRL 0x01
#define SYNCPT_CNTRL_NO_STALL (1 << 8)
#define SYNCPT_CNTRL_SOFT_RESET (1 << 0)
#define DC_CMD_CONT_SYNCPT_VSYNC 0x28
#define SYNCPT_VSYNC_ENABLE (1 << 8)
#define DC_CMD_DISPLAY_COMMAND_OPTION0 0x031
#define DC_CMD_DISPLAY_COMMAND 0x32
#define DISP_CTRL_MODE_STOP (0 << 5)
#define DISP_CTRL_MODE_C_DISPLAY (1 << 5)
#define DISP_CTRL_MODE_NC_DISPLAY (2 << 5)
#define DISP_CTRL_MODE_MASK (3 << 5)
#define DC_CMD_DISPLAY_POWER_CONTROL 0x36
#define PW0_ENABLE (1 << 0)
#define PW1_ENABLE (1 << 2)
#define PW2_ENABLE (1 << 4)
#define PW3_ENABLE (1 << 6)
#define PW4_ENABLE (1 << 8)
#define PM0_ENABLE (1 << 16)
#define PM1_ENABLE (1 << 18)
#define DC_CMD_INT_MASK 0x38
#define DC_CMD_INT_ENABLE 0x39
#define DC_CMD_STATE_ACCESS 0x40
#define READ_MUX (1 << 0)
#define WRITE_MUX (1 << 2)
#define DC_CMD_STATE_CONTROL 0x41
#define GENERAL_ACT_REQ (1 << 0)
#define WIN_A_ACT_REQ (1 << 1)
#define WIN_B_ACT_REQ (1 << 2)
#define WIN_C_ACT_REQ (1 << 3)
#define CURSOR_ACT_REQ (1 << 7)
#define GENERAL_UPDATE (1 << 8)
#define WIN_A_UPDATE (1 << 9)
#define WIN_B_UPDATE (1 << 10)
#define WIN_C_UPDATE (1 << 11)
#define CURSOR_UPDATE (1 << 15)
#define NC_HOST_TRIG (1 << 24)
#define DC_CMD_DISPLAY_WINDOW_HEADER 0x42
#define WINDOW_A_SELECT (1 << 4)
#define WINDOW_B_SELECT (1 << 5)
#define WINDOW_C_SELECT (1 << 6)
#define DC_CMD_REG_ACT_CONTROL 0x043
#define DC_COM_CRC_CONTROL 0x300
#define DC_COM_PIN_OUTPUT_ENABLE(x) (0x302 + (x))
#define DC_COM_PIN_OUTPUT_POLARITY(x) (0x306 + (x))
#define DC_COM_DSC_TOP_CTL 0x33E
#define DC_DISP_DISP_WIN_OPTIONS 0x402
#define HDMI_ENABLE (1 << 30)
#define DSI_ENABLE (1 << 29)
#define SOR1_TIMING_CYA (1 << 27)
#define SOR1_ENABLE (1 << 26)
#define SOR_ENABLE (1 << 25)
#define CURSOR_ENABLE (1 << 16)
#define DC_DISP_DISP_MEM_HIGH_PRIORITY 0x403
#define DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER 0x404
#define DC_DISP_DISP_TIMING_OPTIONS 0x405
#define DC_DISP_REF_TO_SYNC 0x406
#define DC_DISP_SYNC_WIDTH 0x407
#define DC_DISP_BACK_PORCH 0x408
#define DC_DISP_ACTIVE 0x409
#define DC_DISP_FRONT_PORCH 0x40A
#define DC_DISP_DISP_CLOCK_CONTROL 0x42E
#define PIXEL_CLK_DIVIDER_PCD1 (0 << 8)
#define PIXEL_CLK_DIVIDER_PCD1H (1 << 8)
#define PIXEL_CLK_DIVIDER_PCD2 (2 << 8)
#define PIXEL_CLK_DIVIDER_PCD3 (3 << 8)
#define PIXEL_CLK_DIVIDER_PCD4 (4 << 8)
#define PIXEL_CLK_DIVIDER_PCD6 (5 << 8)
#define PIXEL_CLK_DIVIDER_PCD8 (6 << 8)
#define PIXEL_CLK_DIVIDER_PCD9 (7 << 8)
#define PIXEL_CLK_DIVIDER_PCD12 (8 << 8)
#define PIXEL_CLK_DIVIDER_PCD16 (9 << 8)
#define PIXEL_CLK_DIVIDER_PCD18 (10 << 8)
#define PIXEL_CLK_DIVIDER_PCD24 (11 << 8)
#define PIXEL_CLK_DIVIDER_PCD13 (12 << 8)
#define SHIFT_CLK_DIVIDER(x) ((x) & 0xff)
#define DC_DISP_DISP_INTERFACE_CONTROL 0x42F
#define DISP_DATA_FORMAT_DF1P1C (0 << 0)
#define DISP_DATA_FORMAT_DF1P2C24B (1 << 0)
#define DISP_DATA_FORMAT_DF1P2C18B (2 << 0)
#define DISP_DATA_FORMAT_DF1P2C16B (3 << 0)
#define DISP_DATA_FORMAT_DF2S (4 << 0)
#define DISP_DATA_FORMAT_DF3S (5 << 0)
#define DISP_DATA_FORMAT_DFSPI (6 << 0)
#define DISP_DATA_FORMAT_DF1P3C24B (7 << 0)
#define DISP_DATA_FORMAT_DF1P3C18B (8 << 0)
#define DISP_ALIGNMENT_MSB (0 << 8)
#define DISP_ALIGNMENT_LSB (1 << 8)
#define DISP_ORDER_RED_BLUE (0 << 9)
#define DISP_ORDER_BLUE_RED (1 << 9)
#define DC_DISP_DISP_COLOR_CONTROL 0x430
#define DITHER_CONTROL_MASK (3 << 8)
#define DITHER_CONTROL_DISABLE (0 << 8)
#define DITHER_CONTROL_ORDERED (2 << 8)
#define DITHER_CONTROL_ERRDIFF (3 << 8)
#define BASE_COLOR_SIZE_MASK (0xf << 0)
#define BASE_COLOR_SIZE_666 (0 << 0)
#define BASE_COLOR_SIZE_111 (1 << 0)
#define BASE_COLOR_SIZE_222 (2 << 0)
#define BASE_COLOR_SIZE_333 (3 << 0)
#define BASE_COLOR_SIZE_444 (4 << 0)
#define BASE_COLOR_SIZE_555 (5 << 0)
#define BASE_COLOR_SIZE_565 (6 << 0)
#define BASE_COLOR_SIZE_332 (7 << 0)
#define BASE_COLOR_SIZE_888 (8 << 0)
#define DC_DISP_SHIFT_CLOCK_OPTIONS 0x431
#define SC1_H_QUALIFIER_NONE (1 << 16)
#define SC0_H_QUALIFIER_NONE (1 << 0)
#define DC_DISP_DATA_ENABLE_OPTIONS 0x432
#define DE_SELECT_ACTIVE_BLANK (0 << 0)
#define DE_SELECT_ACTIVE (1 << 0)
#define DE_SELECT_ACTIVE_IS (2 << 0)
#define DE_CONTROL_ONECLK (0 << 2)
#define DE_CONTROL_NORMAL (1 << 2)
#define DE_CONTROL_EARLY_EXT (2 << 2)
#define DE_CONTROL_EARLY (3 << 2)
#define DE_CONTROL_ACTIVE_BLANK (4 << 2)
#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480
#define DC_DISP_BLEND_BACKGROUND_COLOR 0x4E4
#define DC_WIN_CSC_YOF 0x611
#define DC_WIN_CSC_KYRGB 0x612
#define DC_WIN_CSC_KUR 0x613
#define DC_WIN_CSC_KVR 0x614
#define DC_WIN_CSC_KUG 0x615
#define DC_WIN_CSC_KVG 0x616
#define DC_WIN_CSC_KUB 0x617
#define DC_WIN_CSC_KVB 0x618
#define DC_WIN_AD_WIN_OPTIONS 0xB80
#define DC_WIN_BD_WIN_OPTIONS 0xD80
#define DC_WIN_CD_WIN_OPTIONS 0xF80
// The following registers are A/B/C shadows of the 0xB80/0xD80/0xF80 registers (see DISPLAY_WINDOW_HEADER).
#define DC_WIN_WIN_OPTIONS 0x700
#define H_DIRECTION (1 << 0)
#define V_DIRECTION (1 << 2)
#define COLOR_EXPAND (1 << 6)
#define CSC_ENABLE (1 << 18)
#define WIN_ENABLE (1 << 30)
#define DC_WIN_COLOR_DEPTH 0x703
#define WIN_COLOR_DEPTH_P1 0x0
#define WIN_COLOR_DEPTH_P2 0x1
#define WIN_COLOR_DEPTH_P4 0x2
#define WIN_COLOR_DEPTH_P8 0x3
#define WIN_COLOR_DEPTH_B4G4R4A4 0x4
#define WIN_COLOR_DEPTH_B5G5R5A 0x5
#define WIN_COLOR_DEPTH_B5G6R5 0x6
#define WIN_COLOR_DEPTH_AB5G5R5 0x7
#define WIN_COLOR_DEPTH_B8G8R8A8 0xC
#define WIN_COLOR_DEPTH_R8G8B8A8 0xD
#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 0xE
#define WIN_COLOR_DEPTH_R6x2G6x2B6x2A8 0xF
#define WIN_COLOR_DEPTH_YCbCr422 0x10
#define WIN_COLOR_DEPTH_YUV422 0x11
#define WIN_COLOR_DEPTH_YCbCr420P 0x12
#define WIN_COLOR_DEPTH_YUV420P 0x13
#define WIN_COLOR_DEPTH_YCbCr422P 0x14
#define WIN_COLOR_DEPTH_YUV422P 0x15
#define WIN_COLOR_DEPTH_YCbCr422R 0x16
#define WIN_COLOR_DEPTH_YUV422R 0x17
#define WIN_COLOR_DEPTH_YCbCr422RA 0x18
#define WIN_COLOR_DEPTH_YUV422RA 0x19
#define DC_WIN_BUFFER_CONTROL 0x702
#define DC_WIN_POSITION 0x704
#define DC_WIN_SIZE 0x705
#define H_SIZE(x) (((x) & 0x1fff) << 0)
#define V_SIZE(x) (((x) & 0x1fff) << 16)
#define DC_WIN_PRESCALED_SIZE 0x706
#define H_PRESCALED_SIZE(x) (((x) & 0x7fff) << 0)
#define V_PRESCALED_SIZE(x) (((x) & 0x1fff) << 16)
#define DC_WIN_H_INITIAL_DDA 0x707
#define DC_WIN_V_INITIAL_DDA 0x708
#define DC_WIN_DDA_INC 0x709
#define H_DDA_INC(x) (((x) & 0xffff) << 0)
#define V_DDA_INC(x) (((x) & 0xffff) << 16)
#define DC_WIN_LINE_STRIDE 0x70A
#define DC_WIN_DV_CONTROL 0x70E
// The following registers are A/B/C shadows of the 0xBC0/0xDC0/0xFC0 registers (see DISPLAY_WINDOW_HEADER).
#define DC_WINBUF_START_ADDR 0x800
#define DC_WINBUF_ADDR_H_OFFSET 0x806
#define DC_WINBUF_ADDR_V_OFFSET 0x808
#define DC_WINBUF_SURFACE_KIND 0x80B
/*! Display serial interface registers. */
#define _DSIREG(reg) ((reg) * 4)
#define DSI_RD_DATA 0x9
#define DSI_WR_DATA 0xA
#define DSI_POWER_CONTROL 0xB
#define DSI_POWER_CONTROL_ENABLE 1
#define DSI_INT_ENABLE 0xC
#define DSI_INT_STATUS 0xD
#define DSI_INT_MASK 0xE
#define DSI_HOST_CONTROL 0xF
#define DSI_HOST_CONTROL_FIFO_RESET (1 << 21)
#define DSI_HOST_CONTROL_CRC_RESET (1 << 20)
#define DSI_HOST_CONTROL_TX_TRIG_SOL (0 << 12)
#define DSI_HOST_CONTROL_TX_TRIG_FIFO (1 << 12)
#define DSI_HOST_CONTROL_TX_TRIG_HOST (2 << 12)
#define DSI_HOST_CONTROL_RAW (1 << 6)
#define DSI_HOST_CONTROL_HS (1 << 5)
#define DSI_HOST_CONTROL_FIFO_SEL (1 << 4)
#define DSI_HOST_CONTROL_IMM_BTA (1 << 3)
#define DSI_HOST_CONTROL_PKT_BTA (1 << 2)
#define DSI_HOST_CONTROL_CS (1 << 1)
#define DSI_HOST_CONTROL_ECC (1 << 0)
#define DSI_CONTROL 0x10
#define DSI_CONTROL_HS_CLK_CTRL (1 << 20)
#define DSI_CONTROL_CHANNEL(c) (((c) & 0x3) << 16)
#define DSI_CONTROL_FORMAT(f) (((f) & 0x3) << 12)
#define DSI_CONTROL_TX_TRIG(x) (((x) & 0x3) << 8)
#define DSI_CONTROL_LANES(n) (((n) & 0x3) << 4)
#define DSI_CONTROL_DCS_ENABLE (1 << 3)
#define DSI_CONTROL_SOURCE(s) (((s) & 0x1) << 2)
#define DSI_CONTROL_VIDEO_ENABLE (1 << 1)
#define DSI_CONTROL_HOST_ENABLE (1 << 0)
#define DSI_SOL_DELAY 0x11
#define DSI_MAX_THRESHOLD 0x12
#define DSI_TRIGGER 0x13
#define DSI_TRIGGER_HOST (1 << 1)
#define DSI_TRIGGER_VIDEO (1 << 0)
#define DSI_TX_CRC 0x14
#define DSI_STATUS 0x15
#define DSI_INIT_SEQ_CONTROL 0x1A
#define DSI_INIT_SEQ_DATA_0 0x1B
#define DSI_INIT_SEQ_DATA_1 0x1C
#define DSI_INIT_SEQ_DATA_2 0x1D
#define DSI_INIT_SEQ_DATA_3 0x1E
#define DSI_PKT_SEQ_0_LO 0x23
#define DSI_PKT_SEQ_0_HI 0x24
#define DSI_PKT_SEQ_1_LO 0x25
#define DSI_PKT_SEQ_1_HI 0x26
#define DSI_PKT_SEQ_2_LO 0x27
#define DSI_PKT_SEQ_2_HI 0x28
#define DSI_PKT_SEQ_3_LO 0x29
#define DSI_PKT_SEQ_3_HI 0x2A
#define DSI_PKT_SEQ_4_LO 0x2B
#define DSI_PKT_SEQ_4_HI 0x2C
#define DSI_PKT_SEQ_5_LO 0x2D
#define DSI_PKT_SEQ_5_HI 0x2E
#define DSI_DCS_CMDS 0x33
#define DSI_PKT_LEN_0_1 0x34
#define DSI_PKT_LEN_2_3 0x35
#define DSI_PKT_LEN_4_5 0x36
#define DSI_PKT_LEN_6_7 0x37
#define DSI_PHY_TIMING_0 0x3C
#define DSI_PHY_TIMING_1 0x3D
#define DSI_PHY_TIMING_2 0x3E
#define DSI_BTA_TIMING 0x3F
#define DSI_TIMEOUT_0 0x44
#define DSI_TIMEOUT_LRX(x) (((x) & 0xffff) << 16)
#define DSI_TIMEOUT_HTX(x) (((x) & 0xffff) << 0)
#define DSI_TIMEOUT_1 0x45
#define DSI_TIMEOUT_PR(x) (((x) & 0xffff) << 16)
#define DSI_TIMEOUT_TA(x) (((x) & 0xffff) << 0)
#define DSI_TO_TALLY 0x46
#define DSI_PAD_CONTROL_0 0x4B
#define DSI_PAD_CONTROL_VS1_PULLDN_CLK (1 << 24)
#define DSI_PAD_CONTROL_VS1_PULLDN(x) (((x) & 0xf) << 16)
#define DSI_PAD_CONTROL_VS1_PDIO_CLK (1 << 8)
#define DSI_PAD_CONTROL_VS1_PDIO(x) (((x) & 0xf) << 0)
#define DSI_PAD_CONTROL_CD 0x4c
#define DSI_VIDEO_MODE_CONTROL 0x4E
#define DSI_PAD_CONTROL_1 0x4F
#define DSI_PAD_CONTROL_2 0x50
#define DSI_PAD_CONTROL_3 0x51
#define DSI_PAD_PREEMP_PD_CLK(x) (((x) & 0x3) << 12)
#define DSI_PAD_PREEMP_PU_CLK(x) (((x) & 0x3) << 8)
#define DSI_PAD_PREEMP_PD(x) (((x) & 0x3) << 4)
#define DSI_PAD_PREEMP_PU(x) (((x) & 0x3) << 0)
#define DSI_PAD_CONTROL_4 0x52
void display_init();
void display_end();
/*! Show one single color on the display. */
void display_color_screen(u32 color);
/*! Switches screen backlight ON/OFF. */
void display_backlight(u8 enable);
/*! Init display in full 1280x720 resolution (B8G8R8A8, line stride 768, framebuffer size = 1280*768*4 bytes). */
u32 *display_init_framebuffer();
#endif

563
bootloader/gfx/di.inl Normal file
View File

@@ -0,0 +1,563 @@
/*
* Copyright (c) 2018 naehrwert
* Copyright (C) 2018 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//Clock config.
static const cfg_op_t _display_config_1[4] = {
{0x4E, 0x40000000}, //CLK_RST_CONTROLLER_CLK_SOURCE_DISP1
{0x34, 0x4830A001}, //CLK_RST_CONTROLLER_PLLD_BASE
{0x36, 0x20}, //CLK_RST_CONTROLLER_PLLD_MISC1
{0x37, 0x2D0AAA} //CLK_RST_CONTROLLER_PLLD_MISC
};
//Display A config.
static const cfg_op_t _display_config_2[94] = {
{DC_CMD_STATE_ACCESS, 0},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
{DC_CMD_REG_ACT_CONTROL, 0x54},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_DISP_DC_MCCIF_FIFOCTRL, 0},
{DC_DISP_DISP_MEM_HIGH_PRIORITY, 0},
{DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER, 0},
{DC_CMD_DISPLAY_POWER_CONTROL, PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE | PW4_ENABLE | PM0_ENABLE | PM1_ENABLE},
{DC_CMD_GENERAL_INCR_SYNCPT_CNTRL, SYNCPT_CNTRL_NO_STALL},
{DC_CMD_CONT_SYNCPT_VSYNC, SYNCPT_VSYNC_ENABLE | 0x9}, // 9: SYNCPT
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ},
{DC_CMD_STATE_ACCESS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_DV_CONTROL, 0},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
/* Setup default YUV colorspace conversion coefficients */
{DC_WIN_CSC_YOF, 0xF0},
{DC_WIN_CSC_KYRGB, 0x12A},
{DC_WIN_CSC_KUR, 0},
{DC_WIN_CSC_KVR, 0x198},
{DC_WIN_CSC_KUG, 0x39B},
{DC_WIN_CSC_KVG, 0x32F},
{DC_WIN_CSC_KUB, 0x204},
{DC_WIN_CSC_KVB, 0},
/* End of color coefficients */
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_DV_CONTROL, 0},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
/* Setup default YUV colorspace conversion coefficients */
{DC_WIN_CSC_YOF, 0xF0},
{DC_WIN_CSC_KYRGB, 0x12A},
{DC_WIN_CSC_KUR, 0},
{DC_WIN_CSC_KVR, 0x198},
{DC_WIN_CSC_KUG, 0x39B},
{DC_WIN_CSC_KVG, 0x32F},
{DC_WIN_CSC_KUB, 0x204},
{DC_WIN_CSC_KVB, 0},
/* End of color coefficients */
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_DV_CONTROL, 0},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
/* Setup default YUV colorspace conversion coefficients */
{DC_WIN_CSC_YOF, 0xF0},
{DC_WIN_CSC_KYRGB, 0x12A},
{DC_WIN_CSC_KUR, 0},
{DC_WIN_CSC_KVR, 0x198},
{DC_WIN_CSC_KUG, 0x39B},
{DC_WIN_CSC_KVG, 0x32F},
{DC_WIN_CSC_KUB, 0x204},
{DC_WIN_CSC_KVB, 0},
/* End of color coefficients */
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_COLOR_CONTROL, BASE_COLOR_SIZE_888},
{DC_DISP_DISP_INTERFACE_CONTROL, DISP_DATA_FORMAT_DF1P1C},
{DC_COM_PIN_OUTPUT_POLARITY(1), 0x1000000},
{DC_COM_PIN_OUTPUT_POLARITY(3), 0},
{0x4E4, 0},
{DC_COM_CRC_CONTROL, 0},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{0x716, 0x10000FF},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{0x716, 0x10000FF},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{0x716, 0x10000FF},
{DC_CMD_DISPLAY_COMMAND_OPTION0, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_COMMAND, 0},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ}
};
//DSI Init config.
static const cfg_op_t _display_config_3[60] = {
{DSI_WR_DATA, 0},
{DSI_INT_ENABLE, 0},
{DSI_INT_STATUS, 0},
{DSI_INT_MASK, 0},
{DSI_INIT_SEQ_DATA_0, 0},
{DSI_INIT_SEQ_DATA_1, 0},
{DSI_INIT_SEQ_DATA_2, 0},
{DSI_INIT_SEQ_DATA_3, 0},
{DSI_DCS_CMDS, 0},
{DSI_PKT_SEQ_0_LO, 0},
{DSI_PKT_SEQ_1_LO, 0},
{DSI_PKT_SEQ_2_LO, 0},
{DSI_PKT_SEQ_3_LO, 0},
{DSI_PKT_SEQ_4_LO, 0},
{DSI_PKT_SEQ_5_LO, 0},
{DSI_PKT_SEQ_0_HI, 0},
{DSI_PKT_SEQ_1_HI, 0},
{DSI_PKT_SEQ_2_HI, 0},
{DSI_PKT_SEQ_3_HI, 0},
{DSI_PKT_SEQ_4_HI, 0},
{DSI_PKT_SEQ_5_HI, 0},
{DSI_CONTROL, 0},
{DSI_PAD_CONTROL_CD, 0},
{DSI_SOL_DELAY, 0x18},
{DSI_MAX_THRESHOLD, 0x1E0},
{DSI_TRIGGER, 0},
{DSI_INIT_SEQ_CONTROL, 0},
{DSI_PKT_LEN_0_1, 0},
{DSI_PKT_LEN_2_3, 0},
{DSI_PKT_LEN_4_5, 0},
{DSI_PKT_LEN_6_7, 0},
{DSI_PAD_CONTROL_1, 0},
{DSI_PHY_TIMING_0, 0x6070601},
{DSI_PHY_TIMING_1, 0x40A0E05},
{DSI_PHY_TIMING_2, 0x30109},
{DSI_BTA_TIMING, 0x190A14},
{DSI_TIMEOUT_0, DSI_TIMEOUT_LRX(0x2000) | DSI_TIMEOUT_HTX(0xFFFF)},
{DSI_TIMEOUT_1, DSI_TIMEOUT_PR(0x765) | DSI_TIMEOUT_TA(0x2000)},
{DSI_TO_TALLY, 0},
{DSI_PAD_CONTROL_0, DSI_PAD_CONTROL_VS1_PULLDN(0) | DSI_PAD_CONTROL_VS1_PDIO(0)}, // Enable
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
{DSI_POWER_CONTROL, 0},
{DSI_POWER_CONTROL, 0},
{DSI_PAD_CONTROL_1, 0},
{DSI_PHY_TIMING_0, 0x6070601},
{DSI_PHY_TIMING_1, 0x40A0E05},
{DSI_PHY_TIMING_2, 0x30118},
{DSI_BTA_TIMING, 0x190A14},
{DSI_TIMEOUT_0, DSI_TIMEOUT_LRX(0x2000) | DSI_TIMEOUT_HTX(0xFFFF)},
{DSI_TIMEOUT_1, DSI_TIMEOUT_PR(0x1343) | DSI_TIMEOUT_TA(0x2000)},
{DSI_TO_TALLY, 0},
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_CRC_RESET | DSI_HOST_CONTROL_TX_TRIG_HOST | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC},
{DSI_CONTROL, DSI_CONTROL_LANES(3) | DSI_CONTROL_HOST_ENABLE},
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
{DSI_MAX_THRESHOLD, 0x40},
{DSI_TRIGGER, 0},
{DSI_TX_CRC, 0},
{DSI_INIT_SEQ_CONTROL, 0}
};
//DSI config (if ver == 0x10).
static const cfg_op_t _display_config_4[43] = {
{DSI_WR_DATA, 0x439},
{DSI_WR_DATA, 0x9483FFB9},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0xBD15},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0x1939},
{DSI_WR_DATA, 0xAAAAAAD8},
{DSI_WR_DATA, 0xAAAAAAEB},
{DSI_WR_DATA, 0xAAEBAAAA},
{DSI_WR_DATA, 0xAAAAAAAA},
{DSI_WR_DATA, 0xAAAAAAEB},
{DSI_WR_DATA, 0xAAEBAAAA},
{DSI_WR_DATA, 0xAA},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0x1BD15},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0x2739},
{DSI_WR_DATA, 0xFFFFFFD8},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFF},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0x2BD15},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0xF39},
{DSI_WR_DATA, 0xFFFFFFD8},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFFFF},
{DSI_WR_DATA, 0xFFFFFF},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0xBD15},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0x6D915},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0x439},
{DSI_WR_DATA, 0xB9},
{DSI_TRIGGER, DSI_TRIGGER_HOST}
};
//DSI config.
static const cfg_op_t _display_config_5[21] = {
{DSI_PAD_CONTROL_1, 0},
{DSI_PHY_TIMING_0, 0x6070601},
{DSI_PHY_TIMING_1, 0x40A0E05},
{DSI_PHY_TIMING_2, 0x30172},
{DSI_BTA_TIMING, 0x190A14},
{DSI_TIMEOUT_0, DSI_TIMEOUT_LRX(0x2000) | DSI_TIMEOUT_HTX(0xA40)},
{DSI_TIMEOUT_1, DSI_TIMEOUT_PR(0x5A2F) | DSI_TIMEOUT_TA(0x2000)},
{DSI_TO_TALLY, 0},
{DSI_PKT_SEQ_0_LO, 0x40000208},
{DSI_PKT_SEQ_2_LO, 0x40000308},
{DSI_PKT_SEQ_4_LO, 0x40000308},
{DSI_PKT_SEQ_1_LO, 0x40000308},
{DSI_PKT_SEQ_3_LO, 0x3F3B2B08},
{DSI_PKT_SEQ_3_HI, 0x2CC},
{DSI_PKT_SEQ_5_LO, 0x3F3B2B08},
{DSI_PKT_SEQ_5_HI, 0x2CC},
{DSI_PKT_LEN_0_1, 0xCE0000},
{DSI_PKT_LEN_2_3, 0x87001A2},
{DSI_PKT_LEN_4_5, 0x190},
{DSI_PKT_LEN_6_7, 0x190},
{DSI_HOST_CONTROL, 0},
};
//Clock config.
static const cfg_op_t _display_config_6[3] = {
{0x34, 0x4810C001}, //CLK_RST_CONTROLLER_PLLD_BASE
{0x36, 0x20}, //CLK_RST_CONTROLLER_PLLD_MISC1
{0x37, 0x2DFC00} //CLK_RST_CONTROLLER_PLLD_MISC
};
//DSI config.
static const cfg_op_t _display_config_7[10] = {
{DSI_TRIGGER, 0},
{DSI_CONTROL, 0},
{DSI_SOL_DELAY, 6},
{DSI_MAX_THRESHOLD, 0x1E0},
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
{DSI_CONTROL, DSI_CONTROL_HS_CLK_CTRL | DSI_CONTROL_FORMAT(3) | DSI_CONTROL_LANES(3) | DSI_CONTROL_VIDEO_ENABLE},
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_HS | DSI_HOST_CONTROL_FIFO_SEL| DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC},
{DSI_CONTROL, DSI_CONTROL_HS_CLK_CTRL | DSI_CONTROL_FORMAT(3) | DSI_CONTROL_LANES(3) | DSI_CONTROL_VIDEO_ENABLE},
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC},
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_HS | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC}
};
//MIPI CAL config.
static const cfg_op_t _display_config_8[6] = {
{0x18, 0},
{2, 0xF3F10000},
{0x16, 1},
{0x18, 0},
{0x18, 0x10010},
{0x17, 0x300}
};
//DSI config.
static const cfg_op_t _display_config_9[4] = {
{DSI_PAD_CONTROL_1, 0},
{DSI_PAD_CONTROL_2, 0},
{DSI_PAD_CONTROL_3, DSI_PAD_PREEMP_PD_CLK(0x3) | DSI_PAD_PREEMP_PU_CLK(0x3) | DSI_PAD_PREEMP_PD(0x03) | DSI_PAD_PREEMP_PU(0x3)},
{DSI_PAD_CONTROL_4, 0}
};
//MIPI CAL config.
static const cfg_op_t _display_config_10[16] = {
{0xE, 0x200200},
{0xF, 0x200200},
{0x19, 0x200002},
{0x1A, 0x200002},
{5, 0},
{6, 0},
{7, 0},
{8, 0},
{9, 0},
{0xA, 0},
{0x10, 0},
{0x11, 0},
{0x1A, 0},
{0x1C, 0},
{0x1D, 0},
{0, 0x2A000001}
};
//Display A config.
static const cfg_op_t _display_config_11[113] = {
{DC_CMD_STATE_ACCESS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_DV_CONTROL, 0},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
/* Setup default YUV colorspace conversion coefficients */
{DC_WIN_CSC_YOF, 0xF0},
{DC_WIN_CSC_KYRGB, 0x12A},
{DC_WIN_CSC_KUR, 0},
{DC_WIN_CSC_KVR, 0x198},
{DC_WIN_CSC_KUG, 0x39B},
{DC_WIN_CSC_KVG, 0x32F},
{DC_WIN_CSC_KUB, 0x204},
{DC_WIN_CSC_KVB, 0},
/* End of color coefficients */
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_DV_CONTROL, 0},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
/* Setup default YUV colorspace conversion coefficients */
{DC_WIN_CSC_YOF, 0xF0},
{DC_WIN_CSC_KYRGB, 0x12A},
{DC_WIN_CSC_KUR, 0},
{DC_WIN_CSC_KVR, 0x198},
{DC_WIN_CSC_KUG, 0x39B},
{DC_WIN_CSC_KVG, 0x32F},
{DC_WIN_CSC_KUB, 0x204},
{DC_WIN_CSC_KVB, 0},
/* End of color coefficients */
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_DV_CONTROL, 0},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
/* Setup default YUV colorspace conversion coefficients */
{DC_WIN_CSC_YOF, 0xF0},
{DC_WIN_CSC_KYRGB, 0x12A},
{DC_WIN_CSC_KUR, 0},
{DC_WIN_CSC_KVR, 0x198},
{DC_WIN_CSC_KUG, 0x39B},
{DC_WIN_CSC_KVG, 0x32F},
{DC_WIN_CSC_KUB, 0x204},
{DC_WIN_CSC_KVB, 0},
/* End of color coefficients */
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_COLOR_CONTROL, BASE_COLOR_SIZE_888},
{DC_DISP_DISP_INTERFACE_CONTROL, DISP_DATA_FORMAT_DF1P1C},
{DC_COM_PIN_OUTPUT_POLARITY(1), 0x1000000},
{DC_COM_PIN_OUTPUT_POLARITY(3), 0},
{0x4E4, 0},
{DC_COM_CRC_CONTROL, 0},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{0x716, 0x10000FF},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{0x716, 0x10000FF},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{0x716, 0x10000FF},
{DC_CMD_DISPLAY_COMMAND_OPTION0, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_COMMAND, 0},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ},
{DC_CMD_STATE_ACCESS, 0},
/* Set Display timings */
{DC_DISP_DISP_TIMING_OPTIONS, 0},
{DC_DISP_REF_TO_SYNC, (1 << 16)}, // h_ref_to_sync = 0, v_ref_to_sync = 1.
{DC_DISP_SYNC_WIDTH, 0x10048},
{DC_DISP_BACK_PORCH, 0x90048},
{DC_DISP_ACTIVE, 0x50002D0},
{DC_DISP_FRONT_PORCH, 0xA0088}, // Sources say that this should be above the DC_DISP_ACTIVE cmd.
/* End of Display timings */
{DC_DISP_SHIFT_CLOCK_OPTIONS, SC1_H_QUALIFIER_NONE | SC0_H_QUALIFIER_NONE},
{DC_COM_PIN_OUTPUT_ENABLE(1), 0},
{DC_DISP_DATA_ENABLE_OPTIONS, DE_SELECT_ACTIVE | DE_CONTROL_NORMAL},
{DC_DISP_DISP_INTERFACE_CONTROL, DISP_DATA_FORMAT_DF1P1C},
{DC_DISP_DISP_CLOCK_CONTROL, 0},
{DC_CMD_DISPLAY_COMMAND_OPTION0, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_COMMAND, DISP_CTRL_MODE_C_DISPLAY},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
{DC_CMD_STATE_ACCESS, READ_MUX | WRITE_MUX},
{DC_DISP_FRONT_PORCH, 0xA0088},
{DC_CMD_STATE_ACCESS, 0},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
{DC_CMD_GENERAL_INCR_SYNCPT, 0x301},
{DC_CMD_GENERAL_INCR_SYNCPT, 0x301},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
{DC_CMD_STATE_ACCESS, 0},
{DC_DISP_DISP_CLOCK_CONTROL, PIXEL_CLK_DIVIDER_PCD1 | SHIFT_CLK_DIVIDER(4)},
{DC_DISP_DISP_COLOR_CONTROL, BASE_COLOR_SIZE_888},
{DC_CMD_DISPLAY_COMMAND_OPTION0, 0}
};
////Display A config.
static const cfg_op_t _display_config_12[17] = {
{DC_DISP_FRONT_PORCH, 0xA0088},
{DC_CMD_INT_MASK, 0},
{DC_CMD_STATE_ACCESS, 0},
{DC_CMD_INT_ENABLE, 0},
{DC_CMD_CONT_SYNCPT_VSYNC, 0},
{DC_CMD_DISPLAY_COMMAND, 0},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
{DC_CMD_GENERAL_INCR_SYNCPT, 0x301},
{DC_CMD_GENERAL_INCR_SYNCPT, 0x301},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
{DC_CMD_DISPLAY_POWER_CONTROL, 0},
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
};
//DSI config.
static const cfg_op_t _display_config_13[16] = {
{DSI_POWER_CONTROL, 0},
{DSI_PAD_CONTROL_1, 0},
{DSI_PHY_TIMING_0, 0x6070601},
{DSI_PHY_TIMING_1, 0x40A0E05},
{DSI_PHY_TIMING_2, 0x30109},
{DSI_BTA_TIMING, 0x190A14},
{DSI_TIMEOUT_0, DSI_TIMEOUT_LRX(0x2000) | DSI_TIMEOUT_HTX(0xFFFF) },
{DSI_TIMEOUT_1, DSI_TIMEOUT_PR(0x765) | DSI_TIMEOUT_TA(0x2000)},
{DSI_TO_TALLY, 0},
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_CRC_RESET | DSI_HOST_CONTROL_TX_TRIG_HOST | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC},
{DSI_CONTROL, DSI_CONTROL_LANES(3) | DSI_CONTROL_HOST_ENABLE},
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
{DSI_MAX_THRESHOLD, 0x40},
{DSI_TRIGGER, 0},
{DSI_TX_CRC, 0},
{DSI_INIT_SEQ_CONTROL, 0}
};
//DSI config (if ver == 0x10).
static const cfg_op_t _display_config_14[22] = {
{DSI_WR_DATA, 0x439},
{DSI_WR_DATA, 0x9483FFB9},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0x2139},
{DSI_WR_DATA, 0x191919D5},
{DSI_WR_DATA, 0x19191919},
{DSI_WR_DATA, 0x19191919},
{DSI_WR_DATA, 0x19191919},
{DSI_WR_DATA, 0x19191919},
{DSI_WR_DATA, 0x19191919},
{DSI_WR_DATA, 0x19191919},
{DSI_WR_DATA, 0x19191919},
{DSI_WR_DATA, 0x19},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0xB39},
{DSI_WR_DATA, 0x4F0F41B1},
{DSI_WR_DATA, 0xF179A433},
{DSI_WR_DATA, 0x2D81},
{DSI_TRIGGER, DSI_TRIGGER_HOST},
{DSI_WR_DATA, 0x439},
{DSI_WR_DATA, 0xB9},
{DSI_TRIGGER, DSI_TRIGGER_HOST}
};
//Display A config.
static const cfg_op_t cfg_display_one_color[8] = {
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT}, //Enable window A.
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT}, //Enable window B.
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT}, //Enable window C.
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
{DC_CMD_DISPLAY_COMMAND, DISP_CTRL_MODE_C_DISPLAY} //DISPLAY_CTRL_MODE: continuous display.
};
//Display A config.
static const cfg_op_t cfg_display_framebuffer[32] = {
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT}, //Enable window C.
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT}, //Enable window B.
{DC_WIN_WIN_OPTIONS, 0},
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT}, //Enable window A.
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
{DC_WIN_COLOR_DEPTH, WIN_COLOR_DEPTH_B8G8R8A8}, //T_A8R8G8B8 //NX Default: T_A8B8G8R8, WIN_COLOR_DEPTH_R8G8B8A8
{DC_WIN_WIN_OPTIONS, 0},
{DC_WIN_WIN_OPTIONS, 0},
{DC_WIN_POSITION, 0}, //(0,0)
{DC_WIN_H_INITIAL_DDA, 0},
{DC_WIN_V_INITIAL_DDA, 0},
{DC_WIN_PRESCALED_SIZE, V_PRESCALED_SIZE(1280) | H_PRESCALED_SIZE(2880)}, //Pre-scaled size: 1280x2880 bytes.
{DC_WIN_DDA_INC, V_DDA_INC(0x1000) | H_DDA_INC(0x1000)},
{DC_WIN_SIZE, V_SIZE(1280) | H_SIZE(720)}, //Window size: 1280 vertical lines x 720 horizontal pixels.
{DC_WIN_LINE_STRIDE, 0x6000C00}, //768*2x768*4 (= 0x600 x 0xC00) bytes, see TRM for alignment requirements.
{DC_WIN_BUFFER_CONTROL, 0},
{DC_WINBUF_SURFACE_KIND, 0}, //Regular surface.
{DC_WINBUF_START_ADDR, 0xC0000000}, //Framebuffer address.
{DC_WINBUF_ADDR_H_OFFSET, 0},
{DC_WINBUF_ADDR_V_OFFSET, 0},
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
{DC_WIN_WIN_OPTIONS, 0},
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
{DC_WIN_WIN_OPTIONS, WIN_ENABLE}, //Enable window AD.
{DC_CMD_DISPLAY_COMMAND, DISP_CTRL_MODE_C_DISPLAY}, //DISPLAY_CTRL_MODE: continuous display.
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE}, //General update; window A update.
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ} //General activation request; window A activation request.
};

529
bootloader/gfx/gfx.c Normal file
View File

@@ -0,0 +1,529 @@
/*
* Copyright (c) 2018 naehrwert
* Copyright (C) 2018 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdarg.h>
#include <string.h>
#include "gfx.h"
static const u8 _gfx_font[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Char 032 ( )
0x00, 0x30, 0x30, 0x18, 0x18, 0x00, 0x0C, 0x00, // Char 033 (!)
0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, // Char 034 (")
0x00, 0x66, 0x66, 0xFF, 0x66, 0xFF, 0x66, 0x66, // Char 035 (#)
0x00, 0x18, 0x7C, 0x06, 0x3C, 0x60, 0x3E, 0x18, // Char 036 ($)
0x00, 0x46, 0x66, 0x30, 0x18, 0x0C, 0x66, 0x62, // Char 037 (%)
0x00, 0x3C, 0x66, 0x3C, 0x1C, 0xE6, 0x66, 0xFC, // Char 038 (&)
0x00, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, // Char 039 (')
0x00, 0x30, 0x18, 0x0C, 0x0C, 0x18, 0x30, 0x00, // Char 040 (()
0x00, 0x0C, 0x18, 0x30, 0x30, 0x18, 0x0C, 0x00, // Char 041 ())
0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, // Char 042 (*)
0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, // Char 043 (+)
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x0C, 0x00, // Char 044 (,)
0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, // Char 045 (-)
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, // Char 046 (.)
0x00, 0x40, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, // Char 047 (/)
0x00, 0x3C, 0x66, 0x76, 0x6E, 0x66, 0x3C, 0x00, // Char 048 (0)
0x00, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x7E, 0x00, // Char 049 (1)
0x00, 0x3C, 0x62, 0x30, 0x0C, 0x06, 0x7E, 0x00, // Char 050 (2)
0x00, 0x3C, 0x62, 0x38, 0x60, 0x66, 0x3C, 0x00, // Char 051 (3)
0x00, 0x6C, 0x6C, 0x66, 0xFE, 0x60, 0x60, 0x00, // Char 052 (4)
0x00, 0x7E, 0x06, 0x7E, 0x60, 0x66, 0x3C, 0x00, // Char 053 (5)
0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3C, 0x00, // Char 054 (6)
0x00, 0x7E, 0x30, 0x30, 0x18, 0x18, 0x18, 0x00, // Char 055 (7)
0x00, 0x3C, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, // Char 056 (8)
0x00, 0x3C, 0x66, 0x7C, 0x60, 0x66, 0x3C, 0x00, // Char 057 (9)
0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, // Char 058 (:)
0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x0C, 0x00, // Char 059 (;)
0x00, 0x70, 0x1C, 0x06, 0x06, 0x1C, 0x70, 0x00, // Char 060 (<)
0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, // Char 061 (=)
0x00, 0x0E, 0x38, 0x60, 0x60, 0x38, 0x0E, 0x00, // Char 062 (>)
0x00, 0x3C, 0x66, 0x30, 0x18, 0x00, 0x18, 0x00, // Char 063 (?)
0x00, 0x3C, 0x66, 0x76, 0x76, 0x06, 0x46, 0x3C, // Char 064 (@)
0x00, 0x3C, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // Char 065 (A)
0x00, 0x3E, 0x66, 0x3E, 0x66, 0x66, 0x3E, 0x00, // Char 066 (B)
0x00, 0x3C, 0x66, 0x06, 0x06, 0x66, 0x3C, 0x00, // Char 067 (C)
0x00, 0x1E, 0x36, 0x66, 0x66, 0x36, 0x1E, 0x00, // Char 068 (D)
0x00, 0x7E, 0x06, 0x1E, 0x06, 0x06, 0x7E, 0x00, // Char 069 (E)
0x00, 0x3E, 0x06, 0x1E, 0x06, 0x06, 0x06, 0x00, // Char 070 (F)
0x00, 0x3C, 0x66, 0x06, 0x76, 0x66, 0x3C, 0x00, // Char 071 (G)
0x00, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // Char 072 (H)
0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // Char 073 (I)
0x00, 0x78, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, // Char 074 (J)
0x00, 0x66, 0x36, 0x1E, 0x1E, 0x36, 0x66, 0x00, // Char 075 (K)
0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7E, 0x00, // Char 076 (L)
0x00, 0x46, 0x6E, 0x7E, 0x56, 0x46, 0x46, 0x00, // Char 077 (M)
0x00, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x66, 0x00, // Char 078 (N)
0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 079 (O)
0x00, 0x3E, 0x66, 0x3E, 0x06, 0x06, 0x06, 0x00, // Char 080 (P)
0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x70, 0x00, // Char 081 (Q)
0x00, 0x3E, 0x66, 0x3E, 0x1E, 0x36, 0x66, 0x00, // Char 082 (R)
0x00, 0x3C, 0x66, 0x0C, 0x30, 0x66, 0x3C, 0x00, // Char 083 (S)
0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // Char 084 (T)
0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 085 (U)
0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // Char 086 (V)
0x00, 0x46, 0x46, 0x56, 0x7E, 0x6E, 0x46, 0x00, // Char 087 (W)
0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, // Char 088 (X)
0x00, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, // Char 089 (Y)
0x00, 0x7E, 0x30, 0x18, 0x0C, 0x06, 0x7E, 0x00, // Char 090 (Z)
0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, // Char 091 ([)
0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00, // Char 092 (\)
0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, // Char 093 (])
0x00, 0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, // Char 094 (^)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, // Char 095 (_)
0x00, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, // Char 096 (`)
0x00, 0x00, 0x3C, 0x60, 0x7C, 0x66, 0x7C, 0x00, // Char 097 (a)
0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3E, 0x00, // Char 098 (b)
0x00, 0x00, 0x3C, 0x06, 0x06, 0x06, 0x3C, 0x00, // Char 099 (c)
0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00, // Char 100 (d)
0x00, 0x00, 0x3C, 0x66, 0x7E, 0x06, 0x3C, 0x00, // Char 101 (e)
0x00, 0x38, 0x0C, 0x3E, 0x0C, 0x0C, 0x0C, 0x00, // Char 102 (f)
0x00, 0x00, 0x7C, 0x66, 0x7C, 0x40, 0x3C, 0x00, // Char 103 (g)
0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x00, // Char 104 (h)
0x00, 0x18, 0x00, 0x1C, 0x18, 0x18, 0x3C, 0x00, // Char 105 (i)
0x00, 0x30, 0x00, 0x30, 0x30, 0x30, 0x1E, 0x00, // Char 106 (j)
0x00, 0x06, 0x06, 0x36, 0x1E, 0x36, 0x66, 0x00, // Char 107 (k)
0x00, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // Char 108 (l)
0x00, 0x00, 0x66, 0xFE, 0xFE, 0xD6, 0xC6, 0x00, // Char 109 (m)
0x00, 0x00, 0x3E, 0x66, 0x66, 0x66, 0x66, 0x00, // Char 110 (n)
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 111 (o)
0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x00, // Char 112 (p)
0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x00, // Char 113 (q)
0x00, 0x00, 0x3E, 0x66, 0x06, 0x06, 0x06, 0x00, // Char 114 (r)
0x00, 0x00, 0x7C, 0x06, 0x3C, 0x60, 0x3E, 0x00, // Char 115 (s)
0x00, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x70, 0x00, // Char 116 (t)
0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, // Char 117 (u)
0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // Char 118 (v)
0x00, 0x00, 0xC6, 0xD6, 0xFE, 0x7C, 0x6C, 0x00, // Char 119 (w)
0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, // Char 120 (x)
0x00, 0x00, 0x66, 0x66, 0x7C, 0x60, 0x3C, 0x00, // Char 121 (y)
0x00, 0x00, 0x7E, 0x30, 0x18, 0x0C, 0x7E, 0x00, // Char 122 (z)
0x00, 0x18, 0x08, 0x08, 0x04, 0x08, 0x08, 0x18, // Char 123 ({)
0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, // Char 124 (|)
0x00, 0x0C, 0x08, 0x08, 0x10, 0x08, 0x08, 0x0C, // Char 125 (})
0x00, 0x00, 0x00, 0x4C, 0x32, 0x00, 0x00, 0x00 // Char 126 (~)
};
void gfx_init_ctxt(gfx_ctxt_t *ctxt, u32 *fb, u32 width, u32 height, u32 stride)
{
ctxt->fb = fb;
ctxt->width = width;
ctxt->height = height;
ctxt->stride = stride;
}
void gfx_clear_grey(gfx_ctxt_t *ctxt, u8 color)
{
memset(ctxt->fb, color, 0x3C0000);
}
void gfx_clear_color(gfx_ctxt_t *ctxt, u32 color)
{
for (u32 i = 0; i < ctxt->height * ctxt->stride; i++)
ctxt->fb[i] = color;
}
void gfx_clear_partial_grey(gfx_ctxt_t *ctxt, u8 color, u32 pos_x, u32 height)
{
memset(ctxt->fb + pos_x * ctxt->stride, color, height * 4 * ctxt->stride);
}
void gfx_con_init(gfx_con_t *con, gfx_ctxt_t *ctxt)
{
con->gfx_ctxt = ctxt;
con->fntsz = 16;
con->x = 0;
con->y = 0;
con->savedx = 0;
con->savedy = 0;
con->fgcol = 0xFFCCCCCC;
con->fillbg = 0;
con->bgcol = 0xFF1B1B1B;
con->mute = 0;
}
void gfx_con_setcol(gfx_con_t *con, u32 fgcol, int fillbg, u32 bgcol)
{
con->fgcol = fgcol;
con->fillbg = fillbg;
con->bgcol = bgcol;
}
void gfx_con_getpos(gfx_con_t *con, u32 *x, u32 *y)
{
*x = con->x;
*y = con->y;
}
void gfx_con_setpos(gfx_con_t *con, u32 x, u32 y)
{
con->x = x;
con->y = y;
}
void gfx_putc(gfx_con_t *con, char c)
{
// Duplicate code for performance reasons.
switch (con->fntsz)
{
case 16:
if (c >= 32 && c <= 126)
{
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
u32 *fb = con->gfx_ctxt->fb + con->x + con->y * con->gfx_ctxt->stride;
for (u32 i = 0; i < 16; i+=2)
{
u8 v = *cbuf++;
for (u32 k = 0; k < 2; k++)
{
for (u32 j = 0; j < 8; j++)
{
if (v & 1)
{
*fb = con->fgcol;
fb++;
*fb = con->fgcol;
}
else if (con->fillbg)
{
*fb = con->bgcol;
fb++;
*fb = con->bgcol;
}
else
fb++;
v >>= 1;
fb++;
}
fb += con->gfx_ctxt->stride - 16;
v = *cbuf;
}
}
con->x += 16;
}
else if (c == '\n')
{
con->x = 0;
con->y +=16;
if (con->y > con->gfx_ctxt->height - 16)
con->y = 0;
}
break;
case 8:
default:
if (c >= 32 && c <= 126)
{
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
u32 *fb = con->gfx_ctxt->fb + con->x + con->y * con->gfx_ctxt->stride;
for (u32 i = 0; i < 8; i++)
{
u8 v = *cbuf++;
for (u32 j = 0; j < 8; j++)
{
if (v & 1)
*fb = con->fgcol;
else if (con->fillbg)
*fb = con->bgcol;
v >>= 1;
fb++;
}
fb += con->gfx_ctxt->stride - 8;
}
con->x += 8;
}
else if (c == '\n')
{
con->x = 0;
con->y += 8;
if (con->y > con->gfx_ctxt->height - 8)
con->y = 0;
}
break;
}
}
void gfx_puts(gfx_con_t *con, const char *s)
{
if (!s || con->mute)
return;
for (; *s; s++)
gfx_putc(con, *s);
}
static void _gfx_putn(gfx_con_t *con, u32 v, int base, char fill, int fcnt)
{
char buf[65];
static const char digits[] = "0123456789ABCDEFghijklmnopqrstuvwxyz";
char *p;
int c = fcnt;
if (base > 36)
return;
p = buf + 64;
*p = 0;
do
{
c--;
*--p = digits[v % base];
v /= base;
} while (v);
if (fill != 0)
{
while (c > 0)
{
*--p = fill;
c--;
}
}
gfx_puts(con, p);
}
void gfx_put_small_sep(gfx_con_t *con)
{
u8 prevFontSize = con->fntsz;
con->fntsz = 8;
gfx_putc(con, '\n');
con->fntsz = prevFontSize;
}
void gfx_put_big_sep(gfx_con_t *con)
{
u8 prevFontSize = con->fntsz;
con->fntsz = 16;
gfx_putc(con, '\n');
con->fntsz = prevFontSize;
}
void gfx_printf(gfx_con_t *con, const char *fmt, ...)
{
if (con->mute)
return;
va_list ap;
int fill, fcnt;
va_start(ap, fmt);
while(*fmt)
{
if(*fmt == '%')
{
fmt++;
fill = 0;
fcnt = 0;
if ((*fmt >= '0' && *fmt <= '9') || *fmt == ' ')
{
fcnt = *fmt;
fmt++;
if (*fmt >= '0' && *fmt <= '9')
{
fill = fcnt;
fcnt = *fmt - '0';
fmt++;
}
else
{
fill = ' ';
fcnt -= '0';
}
}
switch(*fmt)
{
case 'c':
gfx_putc(con, va_arg(ap, u32));
break;
case 's':
gfx_puts(con, va_arg(ap, char *));
break;
case 'd':
_gfx_putn(con, va_arg(ap, u32), 10, fill, fcnt);
break;
case 'p':
case 'P':
case 'x':
case 'X':
_gfx_putn(con, va_arg(ap, u32), 16, fill, fcnt);
break;
case 'k':
con->fgcol = va_arg(ap, u32);
break;
case 'K':
con->bgcol = va_arg(ap, u32);
con->fillbg = 1;
break;
case '%':
gfx_putc(con, '%');
break;
case '\0':
goto out;
default:
gfx_putc(con, '%');
gfx_putc(con, *fmt);
break;
}
}
else
gfx_putc(con, *fmt);
fmt++;
}
out:
va_end(ap);
}
void gfx_hexdump(gfx_con_t *con, u32 base, const u8 *buf, u32 len)
{
if (con->mute)
return;
u8 prevFontSize = con->fntsz;
con->fntsz = 8;
for(u32 i = 0; i < len; i++)
{
if(i % 0x10 == 0)
{
if(i != 0)
{
gfx_puts(con, "| ");
for(u32 j = 0; j < 0x10; j++)
{
u8 c = buf[i - 0x10 + j];
if(c >= 32 && c <= 126)
gfx_putc(con, c);
else
gfx_putc(con, '.');
}
gfx_putc(con, '\n');
}
gfx_printf(con, "%08x: ", base + i);
}
gfx_printf(con, "%02x ", buf[i]);
if (i == len - 1)
{
int ln = len % 0x10 != 0;
u32 k = 0x10 - 1;
if (ln)
{
k = (len & 0xF) - 1;
for (u32 j = 0; j < 0x10 - k; j++)
gfx_puts(con, " ");
}
gfx_puts(con, "| ");
for(u32 j = 0; j < (ln ? k : k + 1); j++)
{
u8 c = buf[i - k + j];
if(c >= 32 && c <= 126)
gfx_putc(con, c);
else
gfx_putc(con, '.');
}
gfx_putc(con, '\n');
}
}
gfx_putc(con, '\n');
con->fntsz = prevFontSize;
}
static int abs(int x)
{
if (x < 0)
return -x;
return x;
}
void gfx_set_pixel(gfx_ctxt_t *ctxt, u32 x, u32 y, u32 color)
{
ctxt->fb[x + y * ctxt->stride] = color;
}
void gfx_line(gfx_ctxt_t *ctxt, int x0, int y0, int x1, int y1, u32 color)
{
int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
int err = (dx > dy ? dx : -dy) / 2, e2;
while (1)
{
gfx_set_pixel(ctxt, x0, y0, color);
if (x0 == x1 && y0 == y1)
break;
e2 = err;
if (e2 >-dx)
{
err -= dy;
x0 += sx;
}
if (e2 < dy)
{
err += dx;
y0 += sy;
}
}
}
void gfx_set_rect_grey(gfx_ctxt_t *ctxt, const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y)
{
u32 pos = 0;
for (u32 y = pos_y; y < (pos_y + size_y); y++)
{
for (u32 x = pos_x; x < (pos_x + size_x); x++)
{
memset(&ctxt->fb[x + y*ctxt->stride], buf[pos], 4);
pos++;
}
}
}
void gfx_set_rect_rgb(gfx_ctxt_t *ctxt, const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y)
{
u32 pos = 0;
for (u32 y = pos_y; y < (pos_y + size_y); y++)
{
for (u32 x = pos_x; x < (pos_x + size_x); x++)
{
ctxt->fb[x + y*ctxt->stride] = buf[pos + 2] | (buf[pos + 1] << 8) | (buf[pos] << 16);
pos+=3;
}
}
}
void gfx_set_rect_argb(gfx_ctxt_t *ctxt, const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y)
{
u32 pos = 0;
for (u32 y = pos_y; y < (pos_y + size_y); y++)
{
for (u32 x = pos_x; x < (pos_x + size_x); x++)
{
ctxt->fb[x + y*ctxt->stride] = buf[pos];
pos+=1;
}
}
}
void gfx_render_bmp_argb(gfx_ctxt_t *ctxt, const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y)
{
for (u32 y = pos_y; y < (pos_y + size_y); y++)
{
for (u32 x = pos_x; x < (pos_x + size_x); x++)
ctxt->fb[x + y*ctxt->stride] = buf[(size_y + pos_y - 1 - y ) * size_x + x - pos_x];
}
}

46
bootloader/gfx/gfx.h Normal file
View File

@@ -0,0 +1,46 @@
/*
* Copyright (c) 2018 naehrwert
* Copyright (C) 2018 CTCaer
* Copyright (C) 2018 M4xw
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _GFX_H_
#define _GFX_H_
#include "../../common/common_gfx.h"
void gfx_init_ctxt(gfx_ctxt_t *ctxt, u32 *fb, u32 width, u32 height, u32 stride);
void gfx_clear_grey(gfx_ctxt_t *ctxt, u8 color);
void gfx_clear_partial_grey(gfx_ctxt_t *ctxt, u8 color, u32 pos_x, u32 height);
void gfx_clear_color(gfx_ctxt_t *ctxt, u32 color);
void gfx_con_init(gfx_con_t *con, gfx_ctxt_t *ctxt);
void gfx_con_setcol(gfx_con_t *con, u32 fgcol, int fillbg, u32 bgcol);
void gfx_con_getpos(gfx_con_t *con, u32 *x, u32 *y);
void gfx_con_setpos(gfx_con_t *con, u32 x, u32 y);
void gfx_putc(gfx_con_t *con, char c);
void gfx_puts(gfx_con_t *con, const char *s);
void gfx_printf(gfx_con_t *con, const char *fmt, ...);
void gfx_hexdump(gfx_con_t *con, u32 base, const u8 *buf, u32 len);
void gfx_set_pixel(gfx_ctxt_t *ctxt, u32 x, u32 y, u32 color);
void gfx_line(gfx_ctxt_t *ctxt, int x0, int y0, int x1, int y1, u32 color);
void gfx_put_small_sep(gfx_con_t *con);
void gfx_put_big_sep(gfx_con_t *con);
void gfx_set_rect_grey(gfx_ctxt_t *ctxt, const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y);
void gfx_set_rect_rgb(gfx_ctxt_t *ctxt, const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y);
void gfx_set_rect_argb(gfx_ctxt_t *ctxt, const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y);
void gfx_render_bmp_argb(gfx_ctxt_t *ctxt, const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y);
#endif

931
bootloader/gfx/logos.h Normal file
View File

@@ -0,0 +1,931 @@
/*
* Copyright (C) 2018 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _HEKATE_LOGOS_H_
#define _HEKATE_LOGOS_H_
#ifdef MENU_LOGO_ENABLE
// 119 x 57 @24bpp RGB RAW positioned at 577 x 1199
#define SZ_MENU_LOGO 20349
#define SZ_MENU_LOGO_BLZ 7592
static unsigned char Kc_MENU_LOGO_blz[SZ_MENU_LOGO_BLZ] = {
0x01, 0x10, 0x80, 0x2D, 0xF0, 0x99, 0x30, 0x84, 0xB0, 0x1C, 0x6C, 0x60, 0x51, 0xF0, 0x59, 0x31,
0x03, 0x30, 0xF7, 0x0F, 0xF0, 0x0F, 0xF0, 0x42, 0xF0, 0xFE, 0xF4, 0x15, 0x6C, 0xCF, 0x30, 0xCC,
0x20, 0x1D, 0x7F, 0x1F, 0x52, 0x6D, 0xD8, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0xC9, 0xF0, 0xBE, 0xF2, 0x2A, 0x00, 0x75, 0x1F,
0x5D, 0x10, 0x36, 0x7F, 0x84, 0x10, 0x7E, 0x00, 0x85, 0x0B, 0x72, 0x00, 0x6C, 0x00, 0x54, 0x40,
0x1A, 0x42, 0x8F, 0xBF, 0x21, 0xCF, 0x1F, 0x33, 0x00, 0x03, 0x20, 0x0F, 0xF0, 0x09, 0x90, 0x03,
0x30, 0x00, 0x00, 0xFE, 0x33, 0x20, 0x9E, 0x01, 0x2D, 0x19, 0xF0, 0x10, 0x20, 0x49, 0x02, 0x30,
0x60, 0xD3, 0x08, 0x81, 0x23, 0x19, 0x1B, 0x2B, 0x19, 0x1B, 0x33, 0x01, 0x18, 0x1B, 0x38, 0x18,
0x2B, 0x05, 0x1B, 0x36, 0x18, 0x10, 0xF6, 0x00, 0xDC, 0x1E, 0x20, 0xE1, 0x30, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFB, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xD8, 0xF0,
0x3A, 0xFE, 0xAE, 0x00, 0x43, 0x2B, 0xFF, 0x2F, 0x19, 0x1B, 0x4A, 0x15, 0x1C, 0x6A, 0x11, 0x00,
0x1D, 0x8A, 0x0E, 0x1E, 0xAD, 0x09, 0x1E, 0xB7, 0x00, 0x81, 0x00, 0x07, 0x1E, 0xA6, 0x0A, 0x1E,
0x87, 0x0F, 0x01, 0x1E, 0x60, 0x13, 0x1D, 0x3E, 0x17, 0xEC, 0x51, 0x51, 0x40, 0xC0, 0xB3, 0x01,
0x1C, 0x6D, 0x12, 0x1D, 0x96, 0x09, 0x80, 0x0F, 0xF0, 0xC1, 0x09, 0x90, 0x03, 0x30, 0x00, 0x00,
0x97, 0x0C, 0x94, 0x15, 0x80, 0x10, 0x27, 0x1E, 0x37, 0x17, 0x54, 0xA9, 0x1E, 0x8F, 0x1D, 0x1C,
0x37, 0x28, 0x17, 0x1C, 0x57, 0x13, 0x1C, 0x73, 0x11, 0x1D, 0x00, 0xA8, 0x09, 0xB3, 0x08, 0x1E,
0xB5, 0x08, 0x1E, 0xB1, 0x01, 0x09, 0x1E, 0x9F, 0x0C, 0x1E, 0x74, 0x10, 0x1D, 0x00, 0x53, 0x13,
0x1C, 0x31, 0x18, 0xD0, 0x02, 0x35, 0xF4, 0x0F, 0xF0, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xDA, 0xF0, 0x35, 0xFD, 0xFF, 0x62, 0x04, 0xA6, 0x18, 0x7D,
0x10, 0x1D, 0xC6, 0x06, 0x1E, 0x03, 0xF4, 0x01, 0x2A, 0xF0, 0x20, 0xF1, 0x01, 0x20, 0xC1, 0x04,
0x07, 0x1E, 0xEC, 0x01, 0x2A, 0x1A, 0x08, 0x0D, 0xD8, 0x49, 0x40, 0x64, 0xC7, 0x52, 0x0F, 0xF0,
0x0F, 0xF0, 0x30, 0xF0, 0x1B, 0x00, 0x59, 0x13, 0xEC, 0x27, 0x9F, 0x17, 0x57, 0x30, 0x18, 0x1B,
0x51, 0x15, 0x1C, 0x98, 0x01, 0x0B, 0x1D, 0xBA, 0x03, 0xFB, 0xD8, 0xF0, 0x00, 0x20, 0xE5, 0x14,
0x03, 0x1F, 0xA4, 0x0B, 0x1E, 0x4B, 0x16, 0x1C, 0x00, 0xAE, 0x03, 0x1D, 0x65, 0x81, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFD, 0x0F, 0xF0, 0x0F, 0xF0, 0xDF, 0xF0, 0xE7,
0xF9, 0x2D, 0x18, 0x1B, 0x4E, 0x0F, 0x15, 0x1C, 0xA8, 0x09, 0x1E, 0xF7, 0x23, 0x14, 0x30, 0xF0,
0xC0, 0x0E, 0xA4, 0x99, 0x0C, 0x1E, 0x35, 0x93, 0x18, 0x62, 0x11, 0x47, 0x61, 0xE3, 0x0A, 0x4E,
0x50, 0x0F, 0xF0, 0x36, 0xF0, 0x62, 0xF1, 0x5F, 0x13, 0x1C, 0x1F, 0x36, 0x07, 0x19, 0xB5, 0x15,
0x1A, 0x07, 0x1B, 0x69, 0x11, 0x1C, 0x0D, 0xD0, 0xC1, 0x42, 0xD5, 0xF0, 0x9A, 0xA5, 0x6D, 0x11,
0x1D, 0x26, 0x0E, 0xDE, 0x00, 0x9C, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xE7, 0xF0, 0xA4, 0xF7, 0xE6, 0x11, 0x09, 0x19, 0xBE, 0x08,
0x36, 0xA0, 0x9F, 0x2A, 0xF0, 0xE7, 0xAC, 0x0B, 0x1F, 0x2D, 0x19, 0x48, 0x10, 0x3A, 0x43, 0x17,
0x1C, 0xC3, 0x36, 0xB3, 0x0F, 0xF0, 0x2D, 0xF0, 0xD3, 0x95, 0xE2, 0x02, 0xF8, 0x11, 0x1D, 0x5B,
0x12, 0x31, 0x18, 0x1C, 0x72, 0x11, 0x04, 0x2C, 0xA1, 0x0C, 0xC0, 0xC0, 0xC0, 0xF4, 0x01, 0x20,
0x6C, 0x11, 0x07, 0xFA, 0x18, 0x1C, 0x62, 0xC1, 0x36, 0xF0, 0x0F, 0xF0, 0x23, 0xF0, 0x45, 0xF0,
0x35, 0xF1, 0xFD, 0x0F, 0xF0, 0x13, 0xF1, 0x11, 0xF1, 0x99, 0x03, 0xE5, 0x25, 0x3C, 0x00, 0x1E,
0xC0, 0xCF, 0x7F, 0x06, 0x1E, 0x99, 0x0B, 0x1E, 0x81, 0x0F, 0x1E, 0x00, 0x38, 0x04, 0xA1, 0x0B,
0x1E, 0xDA, 0x56, 0x27, 0x60, 0x90, 0x7C, 0x61, 0x10, 0x1D, 0x23, 0xCE, 0x21, 0xC3, 0x06, 0xA8,
0x27, 0x50, 0x1B, 0x30, 0xD8, 0xA7, 0x0A, 0x1E, 0xAA, 0x09, 0x1E, 0xE5, 0x03, 0x00, 0x20, 0xBE,
0x95, 0xB1, 0x09, 0x1F, 0x03, 0x00, 0xA4, 0x03, 0x30, 0xA2, 0x0A, 0x1E, 0x00, 0x00, 0x47, 0x04,
0x95, 0x0D, 0x1E, 0x36, 0x0C, 0x18, 0x1B, 0x16, 0xCF, 0x23, 0x5F, 0x13, 0x1D, 0xD7, 0x08, 0x33,
0x19, 0xC1, 0xA2, 0x2B, 0x02, 0x8D, 0x0E, 0x1E, 0x7E, 0x10, 0x07, 0x1E, 0x8C, 0x0E, 0x1E, 0xB8,
0x08, 0x1E, 0xED, 0x00, 0x81, 0x23, 0x3E, 0x9D, 0x45, 0x16, 0xCC, 0xF6, 0x1B, 0x3C, 0x90, 0x36,
0x60, 0xD3, 0x65, 0xF1, 0x2A, 0xF0, 0x33, 0xC0, 0xB1, 0xC9, 0x29, 0xF1, 0x96, 0x99, 0x15, 0x9C,
0x34, 0x75, 0xFF, 0xB9, 0x21, 0x2C, 0x19, 0x1B, 0x77, 0xD5, 0x0F, 0x77, 0x87, 0x64, 0x0E, 0xE1,
0x89, 0x0D, 0x1E, 0x14, 0x07, 0x1E, 0x81, 0x20, 0x1E, 0x66, 0x1F, 0xA8, 0x5C, 0x14, 0xAA, 0x0A,
0x1E, 0xFE, 0x5D, 0x80, 0xDA, 0x9D, 0x22, 0xA1, 0x21, 0x1A, 0xC3, 0x3F, 0x27, 0xA0, 0x25, 0x19,
0x1B, 0x41, 0x0C, 0x17, 0x1C, 0xCD, 0x54, 0x80, 0x86, 0x01, 0xF9, 0x00, 0x3E, 0x07, 0x1E, 0x78,
0x03, 0x20, 0x20, 0x9C, 0x3F, 0xDB, 0x19, 0x36, 0x49, 0x40, 0x17, 0x1C, 0x1D, 0xAD, 0x0A, 0xDB,
0xA0, 0xDB, 0x04, 0x69, 0x16, 0x06, 0x00, 0x1D, 0x64, 0xEE, 0x0E, 0xE5, 0x1E, 0xFB, 0x0A, 0x1B,
0x61, 0x13, 0x1D, 0xD2, 0x07, 0xDE, 0xB0, 0x7B, 0x03, 0x24, 0x1A, 0x1C, 0x19, 0x93, 0xE9, 0x77,
0x01, 0xC3, 0x36, 0x00, 0xC8, 0x31, 0x30, 0x00, 0x36, 0xC0, 0x33, 0xF0, 0x1B, 0x40, 0x82, 0x22,
0xA6, 0x02, 0xFF, 0x00, 0x00, 0x33, 0x90, 0xD3, 0x32, 0x2C, 0xF1, 0xB9, 0x6A, 0xB5, 0x32, 0x03,
0x00, 0x4D, 0x01, 0xFF, 0xA0, 0x02, 0x32, 0x01, 0xF9, 0x00, 0x04, 0x12, 0xC1, 0x25, 0x48, 0x16,
0x1C, 0x1F, 0xBC, 0x08, 0x8C, 0xA1, 0x97, 0x0D, 0x1E, 0x16, 0x54, 0xC0, 0x84, 0x27, 0x3F, 0x17,
0x1C, 0xC5, 0x06, 0x1F, 0x62, 0x91, 0x7B, 0x41, 0x0F, 0x1D, 0x1C, 0x0C, 0x20, 0x18, 0x27, 0x80,
0x17, 0xBC, 0x21, 0xA8, 0x3D, 0x62, 0xE1, 0x42, 0x16, 0xBE, 0x15, 0x17, 0x06, 0x50, 0x19, 0x52,
0x83, 0x81, 0x2A, 0xDB, 0x10, 0x6D, 0x12, 0x07, 0x75, 0x01, 0x1F, 0x54, 0x1D, 0x14, 0x1C, 0x11,
0x1C, 0x5F, 0x41, 0x29, 0x41, 0xD6, 0x2B, 0x66, 0x70, 0x13, 0x1D, 0xED, 0x43, 0x72, 0x20, 0xE0,
0x03, 0x1F, 0x08, 0x43, 0xFF, 0x03, 0x13, 0x52, 0xB2, 0x38, 0x7D, 0x01, 0x30, 0x30, 0x30, 0x1E,
0xE7, 0x09, 0x72, 0x00, 0x59, 0x59, 0x59, 0xA4, 0x01, 0x45, 0x45, 0x23, 0x45, 0x28, 0x0B, 0x39,
0x00, 0x69, 0x00, 0x36, 0x90, 0x7B, 0xF9, 0xA9, 0x02, 0x5C, 0x01, 0xFE, 0xF4, 0x02, 0x00, 0x00,
0x1E, 0x0F, 0xF5, 0x0A, 0x73, 0x05, 0x44, 0x01, 0xA3, 0x02, 0x1A, 0xC7, 0xFF, 0xC5, 0x3A, 0x00,
0x00, 0xBC, 0x0A, 0x44, 0x01, 0xE7, 0x00, 0x3A, 0x05, 0xE7, 0x00, 0xD0, 0x0E, 0xFF, 0x46, 0x46,
0x46, 0x9A, 0x02, 0xD2, 0x00, 0x1B, 0x00, 0x28, 0x19, 0x38, 0x1B, 0x67, 0x12, 0x1D, 0xEF, 0x02,
0xF3, 0xA6, 0x3B, 0x40, 0x18, 0x1C, 0x12, 0x51, 0x3F, 0x65, 0x61, 0xB2, 0x38, 0x19, 0x1B, 0x38,
0x85, 0x0F, 0x57, 0xA0, 0xAC, 0x09, 0x1E, 0x19, 0x1C, 0x04, 0x19, 0x2B, 0x2A, 0x90, 0x9D, 0x22,
0x3E, 0x62, 0xE1, 0x43, 0x16, 0x8F, 0x11, 0x97, 0x56, 0x14, 0xB4, 0x66, 0x86, 0x5D, 0x3E, 0x04,
0x9D, 0x0B, 0xF3, 0xA6, 0xA5, 0x4F, 0x0A, 0x1E, 0x3D, 0x6B, 0x1A, 0x9D, 0x65, 0xA8, 0x23, 0x35,
0x18, 0x34, 0x1C, 0xBD, 0x08, 0x1F, 0x13, 0x92, 0x61, 0x13, 0xFA, 0x12, 0x90, 0x19, 0x5B, 0x2E,
0x26, 0x04, 0x47, 0x04, 0x52, 0x52, 0x52, 0xA3, 0x0E, 0xA3, 0xA3, 0x85, 0x08, 0xA7, 0x01, 0x36,
0x00, 0x39, 0x00, 0x65, 0x01, 0x1B, 0x03, 0xFC, 0x55, 0x55, 0x55, 0x48, 0x00, 0x65, 0x01, 0x4C,
0xF3, 0x89, 0x01, 0x28, 0x78, 0x28, 0x28, 0xA3, 0x02, 0x18, 0x0F, 0x49, 0x05, 0xD2, 0x06, 0x20,
0x01, 0xD7, 0x0D, 0xFC, 0x45, 0x0C, 0x7D, 0x01, 0x30, 0x00, 0xB2, 0x02, 0xCA, 0x12, 0x84, 0x86,
0x62, 0x01, 0x69, 0x7F, 0x69, 0x69, 0x87, 0x09, 0xB9, 0x0A, 0x35, 0x35, 0x35, 0x6D, 0x0C, 0x6D,
0x6D, 0xBC, 0xBC, 0xBC, 0xCF, 0x03, 0x06, 0x0F, 0x4D, 0x01, 0xE0, 0x54, 0x54, 0x54, 0xC1, 0x02,
0xEF, 0x1D, 0x19, 0x1B, 0x8D, 0x18, 0x0E, 0xB1, 0x90, 0x21, 0x9A, 0x0C, 0x1E, 0x14, 0x2D, 0x00,
0x82, 0xEF, 0xFD, 0x11, 0x2D, 0x50, 0x15, 0x1C, 0xEF, 0x02, 0x27, 0x7F, 0x83, 0xC3, 0x08, 0x20,
0x6F, 0x00, 0x17, 0xE8, 0x35, 0x62, 0xF1, 0x62, 0xF1, 0xE8, 0xEF, 0xFD, 0x8A, 0x2C, 0x3E, 0x17,
0x1C, 0xC4, 0x35, 0x81, 0xF1, 0x0E, 0xC3, 0x57, 0x14, 0x9E, 0x3A, 0xAB, 0xF3, 0x46, 0x12, 0x92,
0x0D, 0x1D, 0x1C, 0x61, 0x95, 0x92, 0x0E, 0xD6, 0x0B, 0x1A, 0x1A, 0xC4, 0x02, 0x28, 0x49, 0x28,
0xB2, 0x08, 0xBC, 0x01, 0x55, 0x0B, 0x5F, 0x07, 0x9A, 0x9A, 0x9A, 0x1E, 0x03, 0x00, 0x75, 0x75,
0x75, 0xCC, 0x09, 0x5D, 0x00, 0xD4, 0xD4, 0x31, 0xD4, 0xEF, 0xEF, 0xEF, 0x84, 0x84, 0x84, 0x3B,
0x04, 0x80, 0x88, 0x05, 0x24, 0x63, 0x8A, 0x39, 0xE5, 0x02, 0xD4, 0x0D, 0xA1, 0xA1, 0xA1, 0x1F,
0xF2, 0xF2, 0xF2, 0xCA, 0xCA, 0xCA, 0xA6, 0x05, 0x00, 0x00, 0xC0, 0x78, 0x78, 0x78, 0x98, 0x98,
0x98, 0xE0, 0x0A, 0x70, 0x02, 0xC0, 0x37, 0x05, 0x3B, 0x01, 0x23, 0x04, 0x62, 0x31, 0x57, 0x09,
0xC3, 0x03, 0x68, 0x01, 0x87, 0x09, 0xFF, 0x4C, 0x4C, 0x4C, 0x97, 0x97, 0x97, 0x88, 0x02, 0x4F,
0x08, 0xC0, 0x87, 0x87, 0x87, 0x20, 0x01, 0xCC, 0x03, 0x2C, 0x01, 0xEA, 0x00, 0xA4, 0x01, 0xF8,
0x3B, 0x17, 0x1C, 0xB4, 0x81, 0x8F, 0xE6, 0x0D, 0x74, 0x11, 0x30, 0x1D, 0x16, 0x11, 0x3D, 0x84,
0xF0, 0x3A, 0x05, 0x19, 0x1C, 0x88, 0x1C, 0x0F, 0x1D, 0xAD, 0x0A, 0x1E, 0xA9, 0x0B, 0x7E, 0x10,
0x80, 0x82, 0x10, 0x1D, 0xE0, 0x01, 0x16, 0x03, 0x30, 0x62, 0xF1, 0x62, 0xF1, 0xE8, 0x25, 0xFB,
0xA5, 0x23, 0x5A, 0x13, 0x1C, 0xDF, 0xA5, 0x83, 0xD7, 0x43, 0x04, 0x1F, 0x38, 0x17, 0x25, 0x2B,
0x43, 0xF2, 0x62, 0x21, 0x4F, 0x70, 0x15, 0x1C, 0xA1, 0x0C, 0x1E, 0xAE, 0x0A, 0x1E, 0x00, 0xA8,
0x0B, 0x1E, 0xA5, 0x0B, 0x1E, 0x61, 0x14, 0x00, 0x08, 0x11, 0x22, 0x23, 0x23, 0x33, 0x33, 0x33,
0xCA, 0x05, 0x81, 0xBC, 0x01, 0x7C, 0x08, 0x29, 0x07, 0x72, 0x30, 0x95, 0x01, 0xDE, 0x36, 0x50,
0x07, 0x99, 0x7F, 0x99, 0x99, 0xFA, 0xFA, 0xFA, 0x34, 0x0B, 0x09, 0x00, 0xE8, 0x32, 0xE0, 0x2C,
0x37, 0x29, 0x04, 0x79, 0x05, 0xB6, 0xB6, 0xB6, 0x12, 0x0F, 0x76, 0x47, 0x76, 0x76, 0xA0, 0x02,
0x3D, 0x38, 0xA6, 0x32, 0x6F, 0x09, 0xDF, 0x02, 0x8A, 0x39, 0xFC, 0x35, 0x01, 0x46, 0x00, 0x21,
0x30, 0x2C, 0x2C, 0x2C, 0x62, 0x01, 0x43, 0x08, 0xC7, 0xA9, 0xA9, 0xA9, 0x73, 0x02, 0x70, 0x70,
0x70, 0x0C, 0x00, 0x88, 0x23, 0x01, 0xD3, 0x0E, 0xE1, 0x00, 0xE7, 0x00, 0x31, 0x02, 0x5B, 0x38,
0xC9, 0x57, 0x80, 0xBF, 0xF2, 0x02, 0x5A, 0x0F, 0x1C, 0x1C, 0x4E, 0xC8, 0xF4, 0xE5, 0x38, 0x44,
0x17, 0xF4, 0x81, 0x10, 0x24, 0xD3, 0x28, 0x1E, 0x2D, 0x70, 0x62, 0xF1, 0x62, 0xF1, 0xC7, 0xF2,
0xF5, 0x72, 0x1F, 0x71, 0x11, 0x1D, 0xF2, 0xC0, 0x89, 0xC2, 0x06, 0x21, 0x1F, 0x32, 0x5B, 0x28,
0x62, 0xF1, 0x47, 0x1A, 0xD7, 0x27, 0x23, 0x1C, 0x2B, 0xBC, 0x27, 0xCE, 0x07, 0x35, 0x0A, 0xFF,
0x06, 0x1C, 0x1C, 0x91, 0x08, 0x63, 0x4E, 0x63, 0x63, 0xF4, 0xF4, 0xF4, 0x9B, 0x01, 0x2B, 0x0B,
0x83, 0x01, 0xE0, 0x29, 0x94, 0x4B, 0x30, 0x0B, 0x04, 0xB0, 0xB0, 0xB0, 0x04, 0x0B, 0xAC, 0x05,
0xC7, 0x65, 0x01, 0x1E, 0x30, 0x29, 0x04, 0x33, 0x00, 0x96, 0x96, 0x96, 0xF6, 0x0F, 0xF6, 0xF6,
0x61, 0x61, 0x61, 0xC4, 0x02, 0x36, 0x60, 0x33, 0x60, 0xE0, 0x6E, 0x01, 0xA4, 0xA4, 0xA4, 0xF7,
0xF7, 0xF7, 0x38, 0x01, 0x81, 0x1B, 0x00, 0xBA, 0x39, 0x97, 0x02, 0x2B, 0x08, 0x00, 0x00, 0xB2,
0x02, 0x9C, 0x06, 0x4F, 0x02, 0xFF, 0xDE, 0x06, 0x5C, 0x61, 0xF6, 0x66, 0x49, 0x15, 0x47, 0xAA,
0xE2, 0x03, 0x27, 0x14, 0x0D, 0xB8, 0x55, 0x87, 0xF0, 0x1E, 0x30, 0x81, 0x80, 0x19, 0x1C, 0x5C,
0xB0, 0x9F, 0x62, 0xF1, 0x62, 0xF1, 0x43, 0xE5, 0x27, 0x1A, 0x7B, 0x0F, 0x1E, 0xF9, 0x27, 0x62,
0x81, 0xAC, 0x0A, 0x1E, 0x2A, 0x91, 0xA5, 0xE1, 0xF0, 0x03, 0x30, 0xE1, 0x00, 0x00, 0x3B, 0x11,
0x18, 0x62, 0x51, 0xB2, 0xB2, 0xB2, 0xCC, 0x0B, 0xCC, 0xCC, 0xC6, 0x09, 0x6F, 0x00, 0x0C, 0x30,
0xEF, 0xCD, 0x9E, 0x01, 0xB6, 0x01, 0xFC, 0xE7, 0xE7, 0xE7, 0xCD, 0x05, 0x2C, 0x04, 0xB0, 0x31,
0x0B, 0x04, 0x53, 0x78, 0x53, 0x53, 0x29, 0x04, 0x8A, 0x8A, 0x8A, 0x5A, 0x9F, 0x23, 0x61, 0xC4,
0x60, 0x3F, 0xE2, 0x02, 0xD8, 0xD8, 0xD8, 0xB9, 0xB9, 0xB9, 0x03, 0x35, 0x04, 0x29, 0x01, 0x55,
0x02, 0x62, 0x01, 0x03, 0x00, 0x62, 0x01, 0xDE, 0x06, 0x3E, 0x01, 0xFF, 0xEB, 0x6E, 0x62, 0xC1,
0x4B, 0x62, 0xB1, 0xDB, 0x05, 0x1F, 0x2E, 0x0B, 0x19, 0x1E, 0x10, 0x62, 0xF1, 0x81, 0xF0, 0x60,
0xF0, 0x62, 0xF1, 0x62, 0xF1, 0x62, 0xF1, 0xFE, 0xC7, 0xF2, 0xA2, 0x0C, 0x62, 0xE1, 0xA2, 0xF3,
0x23, 0x31, 0x32, 0x8A, 0x2F, 0x79, 0x2F, 0x2F, 0xAF, 0xAF, 0xAF, 0x72, 0x0F, 0x0E, 0x0E, 0x20,
0x0E, 0x75, 0x60, 0xE9, 0xCD, 0x86, 0x01, 0x4B, 0x4B, 0x4B, 0xD9, 0x0E, 0xD9, 0xD9, 0x91, 0x05,
0x62, 0x01, 0x50, 0x31, 0xFF, 0x03, 0x9B, 0x9B, 0x3C, 0x9B, 0xD6, 0xD6, 0xD6, 0x72, 0x0F, 0xBD,
0x39, 0x29, 0xC1, 0x73, 0x32, 0xF0, 0x02, 0x01, 0x54, 0x0C, 0xE5, 0xE5, 0xE5, 0x44, 0x44, 0x44,
0x03, 0x62, 0x31, 0x31, 0x31, 0x31, 0xAB, 0xAB, 0xAB, 0x43, 0x05, 0x81, 0x15, 0x0C, 0x03, 0x00,
0x15, 0x3C, 0x62, 0xF1, 0xD6, 0x0B, 0xE1, 0x62, 0x81, 0x8B, 0x0E, 0xDF, 0x2F, 0x62, 0x01, 0x62,
0xF1, 0x0F, 0xF0, 0x63, 0xF0, 0x62, 0xF1, 0x62, 0xF1, 0x62, 0xF1, 0xFE, 0x90, 0x1C, 0x1C, 0x8A,
0x62, 0xB1, 0xA4, 0x62, 0x51, 0x62, 0xF1, 0x9C, 0xF0, 0xE9, 0x49, 0x6E, 0x98, 0x01, 0x5A, 0x00,
0x71, 0x01, 0x65, 0x01, 0xBB, 0x32, 0x2C, 0xC7, 0xD2, 0x39, 0xFF, 0x40, 0x40, 0x40, 0xD3, 0xD3,
0xD3, 0xF6, 0x06, 0x12, 0x40, 0x12, 0x12, 0x62, 0x01, 0x12, 0x00, 0x97, 0x05, 0xD5, 0xD5, 0xD5,
0x1C, 0x94, 0x94, 0x94, 0x7E, 0x3C, 0x0F, 0x00, 0x8E, 0xC5, 0x00, 0x00, 0x34, 0x08, 0xF8, 0x0F,
0x00, 0x64, 0x64, 0x64, 0xED, 0x03, 0x6B, 0x6B, 0x6B, 0x11, 0x77, 0x31, 0x2D, 0x2D, 0x2D, 0xAA,
0xAA, 0xAA, 0x50, 0x01, 0x81, 0x3B, 0x3B, 0x3B, 0xEF, 0x27, 0x2B, 0xE0, 0x88, 0x28, 0x4A, 0x15,
0x38, 0x1C, 0xE0, 0x62, 0xB1, 0xD5, 0x0F, 0x86, 0xF4, 0x1B, 0x0F, 0xF0, 0x63, 0xF0, 0xDC, 0x62,
0xF1, 0x62, 0xF1, 0x62, 0xF1, 0xC1, 0x15, 0x1C, 0x89, 0x0E, 0x0D, 0xA5, 0x8F, 0xA3, 0x0B, 0x1E,
0x26, 0x1A, 0x9F, 0xD6, 0x0F, 0xF0, 0x90, 0xF0, 0xE0, 0x00, 0x00, 0x8F, 0x01, 0x17, 0x3A, 0x62,
0x04, 0xB8, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7A, 0x01, 0x4A, 0x01, 0xA9, 0x02,
0x49, 0x49, 0x49, 0xF6, 0x06, 0xC5, 0x0D, 0xC7, 0x2C, 0x34, 0xC3, 0x09, 0x44, 0x01, 0xA3, 0x02,
0x66, 0x0F, 0x32, 0x32, 0x32, 0x1F, 0x38, 0x38, 0x38, 0x06, 0x60, 0x03, 0x30, 0x00, 0x00, 0xEF,
0x0A, 0xAD, 0x0D, 0xF8, 0xD0, 0x02, 0x56, 0x56, 0x56, 0xDB, 0xDB, 0xDB, 0x84, 0x0C, 0x81, 0x12,
0x00, 0x62, 0x61, 0x2C, 0x01, 0x62, 0x41, 0x62, 0xF1, 0xE5, 0x28, 0x47, 0x15, 0x3F, 0x1C, 0xD8,
0xF9, 0x76, 0xBB, 0x1B, 0x33, 0x20, 0x00, 0x24, 0x60, 0x5E, 0xF5, 0xEC, 0x84, 0x80, 0x3B, 0xE1,
0x62, 0xF1, 0x62, 0xF1, 0x62, 0xF1, 0xF9, 0x16, 0x80, 0x0F, 0x3F, 0x1D, 0xFD, 0x62, 0x81, 0xA6,
0xB1, 0x1C, 0x62, 0xE1, 0x01, 0xE5, 0x1F, 0x12, 0xF4, 0x51, 0x36, 0x59, 0x87, 0x03, 0x03, 0xFC,
0x09, 0xCC, 0x0C, 0x87, 0x0C, 0x13, 0x0B, 0x5D, 0x7F, 0x5D, 0x5D, 0x66, 0x66, 0x66, 0x00, 0x00,
0x00, 0x00, 0x68, 0x60, 0x68, 0x68, 0x6C, 0x6C, 0x6C, 0x64, 0x0B, 0x39, 0x0F, 0xAC, 0x02, 0xE0,
0x62, 0x31, 0xC7, 0x02, 0x72, 0x72, 0x72, 0xEE, 0xEE, 0xEE, 0x03, 0xE1, 0x06, 0xC2, 0xC2, 0xC2,
0x00, 0x00, 0x09, 0x90, 0x03, 0x30, 0x00, 0x00, 0xF1, 0xC4, 0xC4, 0xC4, 0xC6, 0xC6, 0xC6, 0x51,
0x0C, 0xF3, 0x40, 0xF3, 0xF3, 0xFC, 0x03, 0xE1, 0x33, 0x62, 0xD1, 0x62, 0xF1, 0xBA, 0x20, 0x69,
0x00, 0xFC, 0xCC, 0x57, 0x80, 0xEB, 0x03, 0x20, 0x4F, 0x08, 0x2F, 0x84, 0x81, 0xF0, 0xE2, 0x09,
0x10, 0x21, 0x84, 0x50, 0x1F, 0x1A, 0x1B, 0x1D, 0x5A, 0x90, 0x85, 0x62, 0xF1, 0x62, 0xF1, 0x94,
0xC5, 0x70, 0x22, 0x74, 0x10, 0x1D, 0xF5, 0x0F, 0x43, 0x82, 0xB8, 0x08, 0x1E, 0x2F, 0x18, 0x1C,
0x89, 0x8D, 0x81, 0x63, 0xFC, 0x71, 0x21, 0x54, 0x46, 0xFA, 0x6E, 0x5F, 0x11, 0x14, 0x07, 0x3C,
0x3C, 0x3F, 0x3C, 0x6B, 0x01, 0xA5, 0x0C, 0xDA, 0xDA, 0xDA, 0x77, 0x01, 0x00, 0x00, 0xC6, 0x03,
0x30, 0x22, 0x3E, 0xC0, 0x0C, 0x5B, 0x08, 0xEF, 0x0D, 0xC7, 0x32, 0x46, 0x08, 0x5E, 0x05, 0xFF,
0xE4, 0x06, 0xB1, 0xB1, 0xB1, 0xA5, 0xA5, 0xA5, 0xA6, 0x01, 0xA6, 0xA6, 0x00, 0x00, 0x09, 0x90,
0x03, 0x30, 0x00, 0x00, 0x12, 0x00, 0xE3, 0x0A, 0xFC, 0x95, 0x95, 0x95, 0xCC, 0x03, 0xC0, 0x69,
0x62, 0xF1, 0x2D, 0xF0, 0x3C, 0x78, 0x18, 0x1C, 0xC3, 0x07, 0x57, 0x70, 0x9B, 0x07, 0x6A, 0x12,
0x30, 0x1D, 0x9F, 0x3F, 0x1B, 0x20, 0xFA, 0x64, 0x25, 0x3D, 0x18, 0x87, 0x00, 0x9A, 0x81, 0x10,
0x41, 0x16, 0x1C, 0x2D, 0x18, 0x1B, 0x23, 0x01, 0x59, 0x60, 0x62, 0xF1, 0x62, 0xF1, 0x2C, 0xF4,
0xA8, 0x23, 0x67, 0x11, 0x1D, 0x1F, 0xEE, 0x20, 0x87, 0xCD, 0x05, 0x1F, 0x3A, 0x18, 0x1C, 0x02,
0xDE, 0x10, 0xAD, 0xF0, 0xAD, 0x07, 0x1A, 0xAB, 0x00, 0x61, 0x15, 0x4E, 0x15, 0x37, 0x1C, 0xD2,
0x00, 0x38, 0x18, 0x1C, 0x27, 0x19, 0xE9, 0x14, 0x82, 0x50, 0x04, 0x2D, 0x2E, 0x2E, 0x12, 0x00,
0x6C, 0x00, 0xF9, 0xF9, 0x31, 0xF9, 0xD5, 0x0C, 0x18, 0x00, 0x64, 0x0B, 0x09, 0x00, 0x03, 0x00,
0x58, 0x58, 0x3E, 0x58, 0xBD, 0x09, 0x5B, 0x5B, 0x5B, 0x6E, 0x6E, 0x6E, 0x02, 0xDD, 0xDD, 0xDD,
0xBA, 0x09, 0xC7, 0x32, 0x2E, 0x08, 0x7F, 0x7F, 0x38, 0x7F, 0xDC, 0xDC, 0xDC, 0x07, 0x0E, 0x1E,
0x1E, 0x1E, 0x10, 0x1B, 0x00, 0x00, 0x00, 0x09, 0x90, 0x03, 0x30, 0x00, 0x00, 0xDE, 0x06, 0xFF,
0x03, 0x15, 0x00, 0xFF, 0x8E, 0x35, 0x62, 0x11, 0x62, 0xF1, 0x50, 0xFA, 0x83, 0x17, 0x1B, 0xDD,
0xC4, 0xAF, 0x0B, 0xDF, 0x18, 0x84, 0x20, 0x1A, 0xD7, 0xED, 0x24, 0x1A, 0x1B, 0x4B, 0x0A, 0x15,
0x1C, 0xC4, 0x07, 0x1E, 0xEA, 0x87, 0x20, 0xF0, 0x40, 0x02, 0x1F, 0xB3, 0x09, 0x1E, 0x2C, 0x1A,
0x1B, 0x00, 0x15, 0x62, 0x81, 0x62, 0xF1, 0x62, 0xF1, 0x62, 0xF1, 0x4A, 0x16, 0x1C, 0x1E, 0xD5,
0xF4, 0x82, 0xE8, 0x02, 0x20, 0x48, 0xFD, 0x07, 0x7D, 0x0D, 0xC2, 0x7B, 0xF3, 0xB0, 0x27, 0x79,
0x0F, 0x1D, 0xE0, 0x04, 0x1F, 0x03, 0xE8, 0x02, 0x1F, 0x54, 0x06, 0xB4, 0x09, 0x85, 0x0E, 0x1C,
0x18, 0x1E, 0x1E, 0x1D, 0x29, 0x2A, 0x2A, 0x5B, 0x5C, 0x00, 0x5C, 0x98, 0x01, 0x31, 0x0B, 0x8B,
0x05, 0x24, 0x00, 0xD5, 0x0C, 0xAF, 0x38, 0x00, 0x00, 0xFE, 0x65, 0x01, 0x50, 0x01, 0x6B, 0x04,
0x7B, 0x0C, 0xC3, 0x09, 0x62, 0x31, 0x0F, 0x00, 0x3A, 0x08, 0xFF, 0x71, 0x71, 0x71, 0xE4, 0x09,
0x59, 0x59, 0x59, 0x62, 0x01, 0x88, 0x1A, 0x04, 0x00, 0x00, 0x09, 0x90, 0x20, 0x91, 0xC7, 0xF2,
0x62, 0xF1, 0xC7, 0xF2, 0xB6, 0x07, 0xFF, 0x7A, 0x10, 0x1D, 0xFE, 0x79, 0x88, 0xB4, 0x08, 0x1E,
0x10, 0x27, 0x19, 0x26, 0xBD, 0x75, 0x5C, 0x2F, 0x19, 0x1B, 0x72, 0x0C, 0x11, 0x1D, 0xF7, 0xAD,
0x74, 0x21, 0xBE, 0x08, 0x1F, 0x08, 0x1E, 0x1B, 0x4F, 0x58, 0x62, 0xF1, 0x62, 0xF1, 0x35, 0xF1,
0xE0, 0x27, 0x30, 0x7C, 0x19, 0x1C, 0xB7, 0x08, 0x2A, 0xA0, 0x69, 0x06, 0x20, 0x1A, 0x30, 0x09,
0x20, 0xEE, 0xBB, 0x1E, 0x8C, 0x1A, 0x1C, 0xB2, 0x09, 0x7E, 0xA3, 0x8B, 0x7F, 0x0E, 0x1B, 0x20,
0x23, 0x22, 0x3F, 0x41, 0x00, 0x41, 0xC1, 0xC1, 0xC1, 0xE4, 0xE4, 0xE4, 0x92, 0x01, 0x80, 0x0F,
0x0F, 0x0F, 0x50, 0x07, 0x33, 0x00, 0x03, 0x30, 0x53, 0x31, 0xDC, 0x35, 0xF8, 0x3F, 0x3F, 0x3F,
0xD2, 0xD2, 0xD2, 0x92, 0x92, 0x00, 0x92, 0x62, 0x31, 0x67, 0x05, 0x62, 0x62, 0x62, 0x8E, 0x02,
0x8A, 0x09, 0xC6, 0x60, 0x3C, 0x0C, 0xC0, 0xA7, 0xFD, 0x62, 0x71, 0x62, 0xF1, 0xE9, 0xF1, 0x07,
0x22, 0x50, 0x7F, 0x15, 0x1D, 0x4A, 0x04, 0xBC, 0x94, 0x64, 0x12, 0x1D, 0x1D, 0x0C, 0x8D, 0xBC,
0x19, 0xD8, 0x26, 0x40, 0x16, 0x1C, 0xAD, 0x08, 0x05, 0x38, 0xA1, 0x95, 0x0C, 0x1E, 0x16, 0x2A,
0x90, 0x62, 0xF1, 0x62, 0xF1, 0xE1, 0x4B, 0xF9, 0x1C, 0x1B, 0x26, 0xCA, 0x02, 0x0F, 0x1D, 0xFC,
0x11, 0xDE, 0x80, 0xC8, 0x06, 0x1F, 0x3A, 0x17, 0x1B, 0x1E, 0x01, 0x1A, 0x1B, 0x19, 0x00, 0xBC,
0x2B, 0x19, 0x1B, 0x5C, 0x08, 0x13, 0x1C, 0xD6, 0x19, 0x82, 0xF2, 0x01, 0x1F, 0x46, 0x08, 0x14,
0x62, 0x11, 0x5B, 0x5D, 0x5D, 0x03, 0x03, 0x7A, 0x7A, 0x22, 0x7A, 0x89, 0x01, 0x00, 0x00, 0x0F,
0x00, 0x4C, 0xFB, 0x53, 0x04, 0xB5, 0x05, 0xD1, 0x7E, 0xD1, 0xD1, 0x91, 0x05, 0x05, 0x0A, 0x3B,
0x01, 0xCA, 0x02, 0x43, 0x43, 0x3C, 0x43, 0xD4, 0xD4, 0xD4, 0x9C, 0x9C, 0x9C, 0x38, 0x34, 0x80,
0x36, 0xC0, 0x37, 0xFB, 0x62, 0xC1, 0x62, 0xF1, 0x86, 0xF7, 0x2D, 0x19, 0x1B, 0x1F, 0x9A, 0x0C,
0x84, 0xA0, 0xD2, 0x05, 0x1F, 0x58, 0x14, 0x04, 0x1D, 0x28, 0x03, 0x10, 0x84, 0x00, 0x79, 0x05,
0xC5, 0x11, 0x3D, 0x17, 0x3C, 0x1B, 0x7B, 0x0F, 0x1D, 0xEA, 0x5F, 0x81, 0xF2, 0x02, 0x20, 0x20,
0x55, 0x15, 0x1C, 0x18, 0x2A, 0x90, 0x62, 0xF1, 0x62, 0xF1, 0xE0, 0x97, 0xF2, 0x2E, 0x28, 0x42,
0x16, 0x1C, 0xD4, 0x05, 0x24, 0xA0, 0x83, 0xA5, 0x0B, 0x1E, 0x39, 0x18, 0xAE, 0x16, 0x20, 0xF1,
0x08, 0xA0, 0x1A, 0x1B, 0x25, 0x1A, 0x1B, 0x2E, 0x19, 0x1C, 0x00, 0x4C, 0x15, 0x1C, 0xA6, 0xA3,
0xB2, 0xBD, 0x07, 0x1E, 0x10, 0x2D, 0x16, 0x1A, 0x23, 0x28, 0x27, 0x79, 0x7A, 0x00, 0x7A, 0x62,
0x01, 0x1E, 0x00, 0x15, 0x00, 0x1D, 0x37, 0xA8, 0xF9, 0xC1, 0x02, 0x5E, 0x7E, 0x5E, 0x5E, 0xED,
0xED, 0xED, 0x8F, 0x8F, 0x8F, 0x00, 0x62, 0x01, 0xDB, 0x09, 0x36, 0x00, 0x44, 0x04, 0x38, 0x04,
0x8B, 0x02, 0x46, 0x46, 0x3F, 0x46, 0x7E, 0x69, 0xA8, 0xF9, 0xBB, 0x32, 0xF6, 0x36, 0x62, 0x71,
0x62, 0xF1, 0x81, 0xF0, 0xFE, 0x51, 0x20, 0x4D, 0x15, 0x1C, 0xD9, 0x05, 0xCD, 0xA2, 0xF2, 0x01,
0xC1, 0x84, 0x0E, 0x1E, 0x8A, 0x00, 0x53, 0x15, 0x1C, 0x58, 0x08, 0x14, 0x1C, 0x78, 0x00, 0x9A,
0x0B, 0x1E, 0xE6, 0x02, 0x04, 0x84, 0xA0, 0xBB, 0x05, 0x23, 0x1A, 0x6E, 0xF7, 0x1B, 0xC7, 0xF2,
0x62, 0xF1, 0xD3, 0xDE, 0xF0, 0x29, 0x1A, 0x1B, 0x7E, 0x10, 0x1D, 0x24, 0x90, 0x81, 0xFE, 0x00,
0x20, 0xB5, 0x08, 0x1E, 0x6F, 0x10, 0x00, 0x1D, 0x57, 0x14, 0x1C, 0x52, 0x15, 0x1C, 0x90, 0x03,
0x80, 0x7D, 0x0F, 0x1D, 0xB6, 0x09, 0x5C, 0xD1, 0x69, 0x10, 0x20, 0x1C, 0x11, 0x1A, 0x19, 0x24,
0x26, 0x26, 0x6D, 0x00, 0x6E, 0x6E, 0xE6, 0xE6, 0xE6, 0x89, 0x04, 0x63, 0x00, 0x24, 0x00, 0xE0,
0x3C, 0x60, 0x88, 0x68, 0x89, 0x01, 0x39, 0x39, 0x39, 0x53, 0x04, 0xA3, 0x02, 0xC7, 0x87, 0x87,
0x87, 0x62, 0x91, 0x50, 0x50, 0x50, 0xEB, 0x08, 0xEB, 0xEB, 0x26, 0x01, 0x18, 0x60, 0x7B, 0x99,
0x5B, 0x35, 0x3E, 0x01, 0x7B, 0x3F, 0xFC, 0x93, 0x36, 0x62, 0x91, 0x62, 0xF1, 0x35, 0xF4, 0x23,
0x1B, 0x1B, 0x6C, 0x0F, 0x12, 0x1D, 0xF6, 0x18, 0xB0, 0xFC, 0x00, 0x20, 0xE4, 0x08, 0x03, 0x1F,
0xD7, 0x04, 0x1F, 0xDA, 0x04, 0x1F, 0x00, 0xED, 0x84, 0xE0, 0xD8, 0x05, 0x1F, 0x80, 0x01, 0xEE,
0x44, 0xC7, 0xF2, 0xE2, 0xD9, 0x05, 0x62, 0xE1, 0x44, 0x62, 0xB1, 0xDE, 0xF0, 0x32, 0x18, 0x1C,
0x1B, 0xA5, 0x0A, 0x65, 0xD1, 0xF4, 0xAE, 0x23, 0xD6, 0x04, 0x1F, 0x14, 0xDC, 0x04, 0x1F, 0xF8,
0x01, 0xC6, 0xD0, 0xA1, 0x0B, 0x20, 0x1E, 0x21, 0x4A, 0x07, 0x1A, 0x19, 0x1B, 0x00, 0xE2, 0x05,
0xEA, 0x64, 0xEA, 0xEA, 0x9E, 0x01, 0x26, 0x26, 0x26, 0x23, 0x04, 0x00, 0x00, 0xC4, 0xEE, 0x62,
0x3C, 0x00, 0x44, 0x01, 0x2C, 0x04, 0x83, 0x83, 0x83, 0x9E, 0x01, 0x8F, 0xF4, 0xF4, 0xF4, 0x61,
0x0E, 0xCA, 0x02, 0x12, 0x33, 0x2D, 0x00, 0x38, 0x01, 0xF8, 0x89, 0x89, 0x89, 0xFE, 0xFE, 0xFE,
0x97, 0x02, 0x29, 0x01, 0xC0, 0xA0, 0x05, 0x1E, 0x00, 0xD5, 0x63, 0x44, 0x01, 0x12, 0x00, 0x41,
0x01, 0x81, 0x81, 0x3F, 0x81, 0x7C, 0x7C, 0x7C, 0x5E, 0x02, 0x62, 0xA1, 0x62, 0xF1, 0x65, 0xF1,
0xF0, 0x84, 0x20, 0x4D, 0x04, 0x77, 0x10, 0x1D, 0xEE, 0x02, 0x1F, 0x03, 0x0F, 0xF0, 0x6F, 0xF0,
0xDB, 0x04, 0x1F, 0x49, 0x17, 0x1C, 0x03, 0x16, 0x5F, 0x31, 0x62, 0xF1, 0x7F, 0x22, 0x3F, 0x17,
0x1C, 0xCF, 0x0E, 0x06, 0x1F, 0x33, 0x60, 0xEE, 0x02, 0x20, 0x43, 0x16, 0x04, 0x62, 0x81, 0xD4,
0xF0, 0x2C, 0x21, 0x36, 0x18, 0x1C, 0xA9, 0x09, 0x07, 0x1E, 0x00, 0x00, 0x0F, 0xF0, 0xD2, 0xF0,
0xA8, 0x0B, 0x1E, 0x28, 0x0E, 0x19, 0x1B, 0x18, 0x39, 0x23, 0x8A, 0x0E, 0x89, 0x01, 0x91, 0x91,
0x38, 0x91, 0xFF, 0xFF, 0xFF, 0x68, 0x01, 0x36, 0x36, 0x36, 0x10, 0x06, 0x00, 0x3F, 0x00, 0x24,
0x24, 0x24, 0x3C, 0x00, 0x37, 0x37, 0x23, 0x37, 0x57, 0x57, 0x57, 0x47, 0x01, 0xE5, 0xE5, 0xE5,
0x10, 0x90, 0x90, 0x90, 0xCE, 0xCE, 0xCE, 0x7A, 0x01, 0x4B, 0x00, 0xC0, 0x85, 0x65, 0x8B, 0x0B,
0x65, 0x01, 0x9F, 0x9F, 0x9F, 0xFB, 0xFB, 0x07, 0xFB, 0x99, 0x99, 0x99, 0x45, 0x45, 0x45, 0xA9,
0x02, 0x80, 0x6D, 0x0B, 0xEE, 0x02, 0x76, 0x02, 0x0B, 0x01, 0x51, 0x51, 0x51, 0xA1, 0x0F, 0xA1,
0xA1, 0xE7, 0xE7, 0xE7, 0x6D, 0x6D, 0x6D, 0x00, 0x19, 0x0E, 0x74, 0x01, 0x32, 0x01, 0x2A, 0x2A,
0x2A, 0x47, 0x01, 0xC5, 0x47, 0xC5, 0xC5, 0xFF, 0x03, 0xF9, 0x03, 0x62, 0xA1, 0x65, 0xF1, 0xEC,
0x21, 0x22, 0x7C, 0x1A, 0x1B, 0x5D, 0x13, 0x1C, 0xC7, 0x07, 0x1F, 0x00, 0xFD, 0x84, 0x50, 0x81,
0xF0, 0xF8, 0x01, 0x20, 0xAB, 0x0A, 0x06, 0x1E, 0x3C, 0x17, 0x92, 0x04, 0x5F, 0x51, 0xAA, 0xF4,
0x36, 0x20, 0x33, 0x78, 0x18, 0x1C, 0xC9, 0x06, 0x3C, 0x00, 0x22, 0x39, 0x20, 0x21, 0x50, 0xEC,
0x02, 0x21, 0x3B, 0x17, 0x1C, 0x1A, 0x71, 0x64, 0x80, 0xD4, 0xF0, 0xE1, 0x10, 0xA3, 0x12, 0x30,
0x18, 0x1B, 0x87, 0x0F, 0x07, 0x1E, 0xE1, 0x04, 0x1F, 0x0F, 0x60, 0x03, 0x30, 0x00, 0x00, 0x03,
0x00, 0xF0, 0xFF, 0x00, 0x21, 0xFF, 0x00, 0x20, 0xE3, 0x03, 0x00, 0x1F, 0x05, 0x01, 0x27, 0x1A,
0x1C, 0x17, 0x37, 0x22, 0x1A, 0x42, 0xA4, 0x51, 0x31, 0x31, 0x31, 0x23, 0x0D, 0xFC, 0xFC, 0xFC,
0x11, 0xCC, 0xCC, 0xCC, 0x8A, 0x8A, 0x8A, 0x76, 0x76, 0x00, 0x76, 0x78, 0x78, 0x78, 0x85, 0x85,
0x85, 0xB5, 0x00, 0xB5, 0xB5, 0x56, 0x01, 0xD6, 0xD6, 0xD6, 0x9D, 0x0B, 0x2B, 0x44, 0x2B, 0x2B,
0x53, 0x01, 0xD0, 0xD0, 0xD0, 0x2C, 0x2C, 0x04, 0x2C, 0x15, 0x15, 0x15, 0x48, 0x60, 0x2D, 0x00,
0x36, 0x00, 0x93, 0x70, 0x93, 0x93, 0xEC, 0xEC, 0xEC, 0x6B, 0x01, 0x9D, 0x9D, 0x20, 0x9D, 0x2F,
0x01, 0x74, 0x74, 0x74, 0x7E, 0x7E, 0x7E, 0x02, 0xA7, 0xA7, 0xA7, 0xE0, 0xE0, 0xE0, 0xE3, 0xE3,
0x00, 0xE3, 0x65, 0x65, 0x65, 0x12, 0x12, 0x12, 0x00, 0x00, 0x80, 0x62, 0x31, 0x32, 0x01, 0xAF,
0xAF, 0xAF, 0xD7, 0xD7, 0xD7, 0x03, 0x2E, 0x2E, 0x2E, 0xC9, 0x13, 0x5F, 0xF1, 0x48, 0xF0, 0x84,
0x20, 0x2E, 0x78, 0x1A, 0x1B, 0x6D, 0x11, 0x1D, 0xA9, 0x0A, 0x1E, 0x00, 0xCF, 0x07, 0x1F, 0xEA,
0x02, 0x84, 0x10, 0xEF, 0x01, 0x20, 0x20, 0xDD, 0x04, 0x1F, 0xC3, 0x08, 0x1F, 0x9A, 0x00, 0x0C,
0x1E, 0x59, 0x14, 0x1D, 0x9B, 0x01, 0x18, 0x36, 0xE0, 0xA0, 0xA1, 0xF1, 0x24, 0x1B, 0x1B, 0x7F,
0x0F, 0x1D, 0xB7, 0x01, 0x08, 0x1E, 0xAC, 0x0A, 0x1E, 0xAE, 0x0A, 0x1E, 0x00, 0x94, 0x0D, 0x1E,
0x2B, 0x1A, 0x1C, 0xE7, 0xD3, 0x02, 0xF4, 0xC0, 0x68, 0x21, 0xBA, 0x0E, 0x3E, 0x17, 0x1B, 0x89,
0x0D, 0x1E, 0x03, 0xB7, 0x09, 0x1E, 0xDB, 0x05, 0x1F, 0xF0, 0x01, 0x00, 0x20, 0xEF, 0x02, 0x20,
0xE9, 0x03, 0x20, 0xD7, 0x00, 0x05, 0x1F, 0xB4, 0x09, 0x1E, 0x85, 0x0F, 0x1E, 0x00, 0x3C, 0x18,
0x1B, 0x16, 0x99, 0xE3, 0x86, 0x31, 0x27, 0x27, 0x30, 0x27, 0x6F, 0x6F, 0x6F, 0xC0, 0xC0, 0xC0,
0xE1, 0x00, 0xE1, 0xE1, 0x3C, 0x00, 0x00, 0x00, 0xDE, 0xDE, 0xDE, 0xB8, 0x0C, 0xB8, 0xB8, 0x7B,
0x7B, 0x7B, 0x33, 0x33, 0x33, 0x00, 0x5F, 0x31, 0x5F, 0x5F, 0x5F, 0x85, 0x0B, 0x29, 0x29, 0x29,
0x11, 0x2D, 0x00, 0x26, 0xC1, 0x29, 0x01, 0x6D, 0x0B, 0xA3, 0xA3, 0xA3, 0xD8, 0x0F, 0xD8, 0xD8,
0xE2, 0xE2, 0xE2, 0x00, 0x00, 0xDF, 0xDF, 0x20, 0xDF, 0xC8, 0xC8, 0xC8, 0x8D, 0x8D, 0x8D, 0x3D,
0x00, 0x3D, 0x3D, 0x5F, 0x31, 0x38, 0x61, 0x20, 0x01, 0x63, 0x63, 0x63, 0x1C, 0x77, 0x77, 0x77,
0x25, 0x25, 0x25, 0x4A, 0x11, 0x46, 0xF0, 0xC0, 0x84, 0xF0, 0x81, 0x30, 0x1A, 0x1B, 0x18, 0x78,
0x20, 0x35, 0x18, 0x23, 0x1B, 0x4F, 0x15, 0x1D, 0x81, 0x00, 0x52, 0x14, 0x1D, 0x10, 0x41, 0x17,
0x1C, 0x28, 0x1A, 0x1B, 0x11, 0x5C, 0x21, 0x80, 0x0F, 0xF0, 0x25, 0xF0, 0x30, 0x1C, 0x1A, 0x1B,
0x17, 0xA7, 0x01, 0x11, 0x11, 0xC7, 0x23, 0x11, 0x0F, 0x1D, 0x1B, 0x1E, 0x01, 0x10, 0x4A, 0xF0,
0xDE, 0xF0, 0xE1, 0x18, 0x10, 0xAD, 0x00, 0x16, 0xEB, 0x0B, 0x1B, 0x1B, 0x40, 0x17, 0x0B, 0x1C,
0x53, 0x13, 0x1D, 0x53, 0x14, 0x1D, 0x4C, 0x00, 0x15, 0x1D, 0x3A, 0x18, 0x1B, 0x4D, 0x00, 0x0F,
0x5C, 0x01, 0xA0, 0x03, 0x20, 0xD8, 0xF0, 0xE8, 0x38, 0x15, 0x00, 0x18, 0x00, 0x42, 0x42, 0x42,
0x1F, 0x53, 0x53, 0x53, 0x4E, 0x4E, 0x4E, 0x3E, 0x3E, 0x00, 0x3E, 0x18, 0x00, 0x9A, 0x0B, 0x1E,
0x00, 0x0C, 0x00, 0x48, 0x00, 0x47, 0x01, 0x0A, 0x7E, 0x0A, 0x0A, 0x12, 0x30, 0x65, 0xC1, 0x33,
0x00, 0x18, 0x00, 0x1D, 0x01, 0x34, 0x7C, 0x34, 0x34, 0x4D, 0x4D, 0x4D, 0x54, 0x54, 0x54, 0x00,
0x48, 0x48, 0x48, 0x22, 0x22, 0x22, 0x11, 0x11, 0x00, 0x11, 0x1D, 0x01, 0xCA, 0x05, 0x29, 0x91,
0x20, 0x20, 0x20, 0xFF, 0x00, 0x8E, 0x0D, 0x0D, 0x0D, 0x76, 0x08, 0x07, 0x70, 0x42, 0xF0, 0x48,
0xF0, 0x4E, 0x50, 0xF8, 0x16, 0x87, 0x50, 0x12, 0x84, 0x20, 0x16, 0x1C, 0x36, 0xC0, 0x2F, 0xF0,
0xCA, 0x39, 0xF0, 0x00, 0x00, 0x4B, 0x50, 0x23, 0x61, 0x42, 0xF0, 0x78, 0xF0, 0x18, 0x50, 0x18,
0x7F, 0x09, 0x00, 0x1B, 0x1B, 0x12, 0x00, 0x00, 0x1C, 0x1B, 0x13, 0x11, 0x1C, 0x1B, 0x14, 0x1C,
0x1B, 0x18, 0xCF, 0x20, 0x19, 0x40, 0x05, 0x50, 0x39, 0xF0, 0x03, 0x00, 0x39, 0x30, 0x3F, 0x60,
0x3C, 0xC0, 0x50, 0xC1, 0x2D, 0xF0, 0xFF, 0x3B, 0x07, 0x0F, 0x00, 0x17, 0x17, 0x17, 0x03, 0x00,
0x08, 0x0A, 0x0B, 0x0A, 0xE3, 0x18, 0x18, 0x18, 0x15, 0x30, 0x15, 0xF0, 0x05, 0x71, 0x0F, 0xF0,
0x33, 0xF0, 0xF8, 0x81, 0xF0, 0x81, 0xF0, 0x0F, 0xF0, 0x21, 0xF0, 0x36, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x27, 0xF0, 0xFF, 0x09, 0x80, 0x47, 0x06, 0x03, 0x30, 0x00, 0x00, 0x35, 0xC0, 0x27, 0xF0,
0x3F, 0xF0, 0x3C, 0xF0, 0xFF, 0x30, 0xF0, 0xB3, 0xF1, 0xFA, 0xF2, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x7A, 0xF1, 0x5B, 0xF8, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0x1A, 0xF7, 0x5B, 0xF8, 0x5C, 0xFD, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x1D, 0xF7, 0xFF, 0x79, 0xFB, 0x6D,
0x9B, 0x62, 0x01, 0x00, 0x00, 0xC1, 0x02, 0x03, 0x30, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x09, 0x90, 0xFF,
0x03, 0x30, 0x00, 0x00, 0x8B, 0x3B, 0xFB, 0x3D, 0x62, 0x01, 0x81, 0x0C, 0x6A, 0x6A, 0x3F, 0x6A,
0x42, 0x0F, 0x03, 0x30, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFE, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x09, 0x90, 0x03, 0x30, 0x00, 0x00, 0x88, 0x0B,
0xFF, 0x03, 0x0C, 0x4F, 0x4F, 0x4F, 0x6D, 0x0B, 0x8F, 0x0A, 0x05, 0x0A, 0xC6, 0x0F, 0xF1, 0xA8,
0xA8, 0xA8, 0x03, 0x30, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xF8, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x09, 0x90, 0x03, 0x30, 0x00, 0x00, 0xFF, 0x9C,
0x9C, 0x9C, 0xA9, 0xA9, 0xA9, 0xCE, 0x0D, 0x09, 0x00, 0xC0, 0x62, 0x01, 0xB2, 0x08, 0x6B, 0x0A,
0xF4, 0x0B, 0x03, 0x30, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x09, 0x90, 0x03, 0x30, 0xFF, 0x00, 0x00, 0x03,
0x00, 0x0C, 0x0C, 0x0C, 0xBE, 0x08, 0xF1, 0x08, 0x86, 0xC4, 0xE3, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0C,
0xC0, 0xEA, 0xF6, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x0F,
0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF,
0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0,
0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x36, 0xF0,
0xFD, 0xC2, 0xFF, 0x76, 0xC2, 0x24, 0xF0, 0x1B, 0xF0, 0x12, 0xF0, 0xAE, 0xF0, 0x24, 0xF0, 0x66,
0xF0, 0x66, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x21, 0xF0, 0x9B, 0xF1, 0x1B, 0xF0,
0x02, 0xF1, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x39, 0xF0, 0xD4, 0x67, 0x7B, 0x30, 0x15,
0x90, 0x7F, 0x62, 0x39, 0xC0, 0xFF, 0x30, 0xF0, 0xB2, 0x6B, 0x7D, 0x61, 0x90, 0xF0, 0x27, 0xF0,
0x27, 0xF0, 0xB8, 0x6E, 0x1E, 0xF0, 0xFF, 0x65, 0xF4, 0x0F, 0xF0, 0x0F, 0xF0, 0x18, 0xF0, 0x1B,
0xF0, 0x12, 0xF0, 0xA2, 0x90, 0x1E, 0xF0, 0xFF, 0x5D, 0x90, 0x02, 0xF1, 0xDB, 0xF0, 0xF7, 0x32,
0x00, 0x00, 0x21, 0x03, 0xEE, 0x32, 0x78, 0x00, 0xFF, 0x51, 0x30, 0xB7, 0x03, 0x40, 0x05, 0xF3,
0x03, 0xF2, 0x01, 0x76, 0x02, 0x39, 0x00, 0xD6, 0x32, 0xFF, 0x45, 0x90, 0x42, 0xCF, 0x18, 0x00,
0x35, 0x01, 0x9F, 0x00, 0x60, 0x90, 0x2C, 0x01, 0x27, 0x00, 0xFF, 0x90, 0x00, 0xCF, 0x30, 0x97,
0xFB, 0x82, 0x62, 0x00, 0x06, 0xE7, 0x00, 0x0F, 0xF0, 0x1E, 0xF0, 0xFF, 0x84, 0x3C, 0x4F, 0xCB,
0x65, 0xF1, 0x56, 0xF1, 0xDE, 0x36, 0xD6, 0x02, 0xC8, 0x0A, 0xA7, 0x01, 0xFF, 0x03, 0x30, 0x08,
0x61, 0x8A, 0x39, 0x83, 0x01, 0xD9, 0x02, 0x4F, 0x02, 0x14, 0xC1, 0x38, 0xC1, 0xFF, 0xD2, 0xC3,
0x72, 0x60, 0x8D, 0x60, 0x7E, 0x60, 0x2D, 0x00, 0x81, 0x00, 0x1A, 0x04, 0x4D, 0x04, 0xFF, 0x30,
0x00, 0x81, 0x06, 0xDD, 0x04, 0x74, 0x01, 0x0B, 0x04, 0xF6, 0x00, 0x2A, 0x03, 0x6F, 0x03, 0xFF,
0xCC, 0x03, 0xF0, 0x00, 0xA8, 0x03, 0x7D, 0x01, 0xC4, 0x02, 0x45, 0x60, 0x06, 0xCC, 0xD4, 0x01,
0xFF, 0xD8, 0x00, 0xC1, 0x02, 0x15, 0x03, 0x62, 0x91, 0x4D, 0x01, 0x6A, 0x02, 0x3D, 0x35, 0x0C,
0x00, 0xFF, 0x2A, 0xF3, 0x22, 0x6E, 0x76, 0x02, 0x4E, 0x03, 0x6A, 0x05, 0x66, 0x30, 0x03, 0xC3,
0x6F, 0x99, 0xFF, 0xC5, 0x01, 0x01, 0x32, 0xE2, 0xC2, 0x62, 0xF1, 0x62, 0xF1, 0x1B, 0x33, 0xD1,
0x01, 0x33, 0x00, 0xFF, 0xD9, 0x02, 0x03, 0x30, 0x03, 0x30, 0x62, 0x31, 0x7B, 0x0C, 0x2E, 0x02,
0x28, 0x02, 0x62, 0x01, 0xFF, 0x5F, 0x9A, 0x33, 0x30, 0xB1, 0x00, 0x9C, 0x00, 0x12, 0x00, 0x2A,
0x00, 0x45, 0x00, 0xED, 0x30, 0xFF, 0x08, 0x31, 0x12, 0x00, 0xBA, 0x00, 0x48, 0x00, 0x39, 0x00,
0xD8, 0x60, 0x3C, 0x00, 0x33, 0x00, 0xFF, 0x09, 0x00, 0x61, 0x02, 0x59, 0x01, 0x09, 0x00, 0x6C,
0x00, 0x70, 0x05, 0x54, 0x00, 0x7E, 0x00, 0xFF, 0xB9, 0x04, 0x1D, 0x01, 0x81, 0x00, 0x09, 0x00,
0x49, 0x02, 0x3C, 0x00, 0x20, 0x04, 0x7B, 0x30, 0xFF, 0x12, 0x00, 0x08, 0x01, 0x5A, 0x39, 0x7B,
0x30, 0xB1, 0x00, 0x0B, 0x01, 0x23, 0x01, 0xF7, 0x05, 0xFF, 0x6E, 0x04, 0x2C, 0xC4, 0xA1, 0x01,
0x37, 0x02, 0x57, 0x00, 0x7E, 0x06, 0x5D, 0x60, 0x1E, 0x00, 0xFF, 0xF9, 0x00, 0x45, 0x00, 0x4A,
0x3A, 0x6F, 0x36, 0xC7, 0x02, 0x22, 0x3B, 0x30, 0x00, 0x09, 0x33, 0xFF, 0x5D, 0x00, 0x4E, 0x00,
0xB6, 0x01, 0x36, 0x39, 0x4B, 0x00, 0xA6, 0x02, 0xB4, 0x03, 0x3C, 0x00, 0xFF, 0x38, 0x01, 0x0C,
0x00, 0x17, 0x01, 0xB4, 0x06, 0x3C, 0x00, 0xEA, 0x03, 0x1E, 0x30, 0xC0, 0xF9, 0xFF, 0x4C, 0xC8,
0x08, 0x01, 0x19, 0x02, 0x36, 0x06, 0x02, 0x01, 0x84, 0x00, 0xF9, 0x03, 0x50, 0x01, 0xFF, 0xDE,
0x00, 0x35, 0x31, 0x37, 0x05, 0x18, 0x00, 0xF6, 0x66, 0x9C, 0x60, 0x32, 0x07, 0xA6, 0x05, 0xFF,
0x1B, 0x00, 0x09, 0x03, 0x62, 0x07, 0xB7, 0x03, 0x12, 0x00, 0x55, 0x02, 0xCF, 0x00, 0x90, 0x00,
0xFF, 0x12, 0x00, 0x68, 0x01, 0x81, 0x00, 0xCD, 0x02, 0x70, 0x70, 0x70, 0x4E, 0x00, 0x8F, 0x36,
0x00, 0x0F, 0x00, 0x50, 0x50, 0x50, 0x74, 0x01, 0xAE, 0x00, 0x38, 0x01, 0xE3, 0xC8, 0x01, 0x6E,
0x04, 0xED, 0x00, 0x3F, 0x00, 0x27, 0x00, 0x5F, 0x01, 0x38, 0x01, 0xB1, 0x7F, 0xB1, 0xB1, 0xA8,
0x00, 0xEA, 0x03, 0x48, 0x00, 0x8C, 0x01, 0x12, 0x00, 0x8D, 0x30, 0xFC, 0x31, 0x02, 0x40, 0x05,
0x6E, 0x04, 0x21, 0x06, 0xF2, 0x01, 0xB9, 0x04, 0x64, 0x02, 0x43, 0x02, 0xFF, 0x75, 0x00, 0xAA,
0xAA, 0xAA, 0x5C, 0x01, 0x62, 0x61, 0xBF, 0x31, 0x03, 0x00, 0xF1, 0xA2, 0x03, 0x21, 0x00, 0x40,
0x02, 0x9F, 0x00, 0xD4, 0x01, 0xC5, 0x01, 0x5B, 0x02, 0x18, 0x00, 0xFF, 0x72, 0x06, 0xF9, 0x00,
0x22, 0x02, 0x21, 0x00, 0x40, 0x32, 0x0D, 0x02, 0x86, 0x01, 0x58, 0x02, 0xFF, 0xA7, 0x07, 0xDB,
0x00, 0x06, 0x00, 0x60, 0x00, 0xB3, 0x01, 0xF0, 0x03, 0x21, 0x00, 0x1B, 0x00, 0xFF, 0xF4, 0x02,
0xBD, 0xBD, 0xBD, 0x16, 0x02, 0xAA, 0x34, 0xC0, 0x00, 0x39, 0x00, 0xF1, 0xA4, 0x01, 0x23, 0x01,
0x97, 0x02, 0x00, 0x00, 0x0F, 0x60, 0xE1, 0x30, 0x44, 0x3A, 0xE7, 0x96, 0xFF, 0x9C, 0x00, 0xAE,
0x00, 0x3D, 0x05, 0x03, 0x03, 0x95, 0x04, 0x7C, 0x7C, 0x7C, 0x1F, 0x92, 0x01, 0x8D, 0x00, 0xCA,
0x02, 0x12, 0x00, 0x5D, 0x00, 0x62, 0x31, 0x91, 0x95, 0xA3, 0x02, 0xFF, 0xCE, 0x01, 0x3C, 0x00,
0xCF, 0x00, 0x21, 0x03, 0xAF, 0xAF, 0xAF, 0x68, 0x01, 0x8F, 0xA5, 0x00, 0xF8, 0x01, 0x6D, 0x6D,
0x6D, 0x3F, 0x00, 0x37, 0x02, 0x7B, 0x00, 0xE3, 0x51, 0x00, 0x51, 0x03, 0x1E, 0x06, 0xA4, 0x01,
0xB7, 0x00, 0x1D, 0x01, 0xBE, 0x02, 0x66, 0x7F, 0x66, 0x66, 0x66, 0x00, 0xEF, 0x01, 0x5D, 0x00,
0xD2, 0x00, 0xC7, 0x02, 0x09, 0x00, 0xFC, 0x62, 0x01, 0xC3, 0x00, 0xE2, 0x02, 0x5B, 0x05, 0x05,
0x01, 0x1B, 0x00, 0xBB, 0x02, 0x0F, 0x00, 0xFF, 0x5A, 0x00, 0x08, 0x01, 0x90, 0x00, 0xD5, 0x00,
0xE9, 0x01, 0x52, 0x02, 0x30, 0x03, 0x1B, 0x00, 0xFF, 0x7C, 0x02, 0x6B, 0x01, 0x30, 0x03, 0x00,
0x03, 0xBA, 0xBA, 0xBA, 0x5D, 0x00, 0x8F, 0x62, 0x91, 0x9F, 0x03, 0xB2, 0x02, 0x0F, 0x00, 0x5A,
0x00, 0x30, 0x00, 0xA2, 0x00, 0x7B, 0x30, 0xFF, 0x8A, 0x8A, 0x8A, 0xEA, 0x00, 0x51, 0x03, 0xD7,
0x01, 0x68, 0x01, 0x0F, 0x00, 0xF8, 0x73, 0x02, 0x38, 0x01, 0x9F, 0x00, 0x8F, 0x01, 0x6F, 0x03,
0x7E, 0x00, 0x72, 0x00, 0x5D, 0x03, 0xFF, 0x00, 0x00, 0xFC, 0x03, 0x7E, 0x03, 0x17, 0x04, 0xDE,
0x00, 0xC9, 0x00, 0x26, 0x01, 0x55, 0x7F, 0x55, 0x55, 0x15, 0x00, 0x8E, 0x05, 0x06, 0x00, 0xE9,
0x01, 0x3C, 0x00, 0xDB, 0x00, 0xFC, 0xEA, 0x03, 0xB4, 0x00, 0x0C, 0x00, 0x3D, 0x38, 0x90, 0x00,
0x5C, 0x01, 0xC7, 0x38, 0x91, 0x95, 0xFF, 0x3A, 0x02, 0xC3, 0x03, 0x62, 0x01, 0xBE, 0x02, 0xB4,
0xB4, 0xB4, 0x7B, 0x00, 0x8F, 0x0E, 0x01, 0xCA, 0x02, 0xFE, 0x04, 0x12, 0x00, 0xF0, 0x00, 0x62,
0x01, 0x62, 0xF1, 0xBA, 0x00, 0xFF, 0x8F, 0x01, 0x09, 0x09, 0x09, 0x5D, 0x00, 0x27, 0x00, 0x02,
0x04, 0x77, 0x01, 0xF1, 0xA0, 0x35, 0x69, 0x00, 0x60, 0x00, 0x83, 0x01, 0x38, 0x01, 0x0F, 0x00,
0x52, 0x52, 0x3F, 0x52, 0x75, 0x03, 0x69, 0x00, 0xBC, 0x01, 0x28, 0x05, 0x6A, 0x02, 0x12, 0x00,
0xE0, 0x01, 0xFE, 0xC0, 0x00, 0x66, 0x00, 0x30, 0x00, 0x27, 0x00, 0xDE, 0x00, 0xBA, 0x00, 0x8F,
0x01, 0x7D, 0x7F, 0x7D, 0x7D, 0x4D, 0x01, 0xD7, 0x01, 0xC7, 0x32, 0x62, 0x01, 0x41, 0x04, 0x99,
0x00, 0xFC, 0xE4, 0x03, 0x72, 0x00, 0x52, 0x02, 0x9E, 0x01, 0x94, 0x02, 0x9C, 0x00, 0x33, 0x00,
0x03, 0x7F, 0x03, 0x03, 0xFF, 0x03, 0x63, 0x00, 0x2A, 0x00, 0x62, 0xC1, 0xB1, 0x03, 0xC3, 0x30,
0xFC, 0x2C, 0x04, 0x12, 0x00, 0x62, 0x01, 0x63, 0x00, 0xA7, 0xA7, 0xA7, 0xB6, 0x04, 0x8F, 0x77,
0x01, 0xAD, 0x04, 0x9A, 0x9A, 0x9A, 0xFD, 0x05, 0x62, 0x01, 0xAD, 0x63, 0xAD, 0xAD, 0xD1, 0x01,
0xA8, 0x00, 0xA4, 0x04, 0x0D, 0x35, 0x02, 0x01, 0x53, 0x7C, 0x53, 0x53, 0xBD, 0x03, 0x60, 0x00,
0xF3, 0x00, 0xC7, 0x32, 0xDE, 0x00, 0x47, 0x01, 0xFC, 0x62, 0x31, 0xA6, 0xA6, 0xA6, 0xD3, 0x35,
0x04, 0x02, 0xA4, 0xA4, 0x31, 0xA4, 0xE0, 0x01, 0x45, 0x00, 0x3F, 0x36, 0x54, 0x00, 0xC6, 0x00,
0x51, 0x00, 0xA6, 0x02, 0xFE, 0xA8, 0x36, 0xC7, 0x62, 0xCF, 0x00, 0x62, 0x31, 0x72, 0x03, 0x0C,
0x00, 0xB1, 0x00, 0x8C, 0x01, 0xFF, 0xFF, 0x00, 0x19, 0x02, 0x53, 0x01, 0x5D, 0x00, 0x62, 0xF1,
0x2A, 0x03, 0x4D, 0x01, 0xED, 0x00, 0xFF, 0x4B, 0x4B, 0x4B, 0xCC, 0x00, 0x32, 0x04, 0x84, 0x00,
0xC7, 0x02, 0xCB, 0x01, 0xF8, 0x3C, 0x00, 0xC1, 0x02, 0x12, 0x00, 0x15, 0x00, 0x27, 0x00, 0x45,
0x45, 0x45, 0x1F, 0x04, 0x02, 0xE0, 0x04, 0x62, 0x01, 0x1E, 0x00, 0x48, 0x00, 0x1E, 0x00, 0xCF,
0x03, 0xED, 0x00, 0xFF, 0xCB, 0x01, 0x3E, 0x3E, 0x3E, 0x02, 0x01, 0xC6, 0x00, 0x31, 0x02, 0x09,
0x00, 0xF1, 0x62, 0x61, 0x84, 0x00, 0x81, 0x81, 0x81, 0xA1, 0x01, 0x54, 0x54, 0x23, 0x54, 0x3C,
0x00, 0xCB, 0x01, 0x00, 0x00, 0xD9, 0x02, 0x08, 0x01, 0x7A, 0x04, 0x5D, 0x00, 0xFE, 0x25, 0x02,
0xC8, 0x01, 0x20, 0x01, 0x2D, 0x03, 0x78, 0x00, 0x56, 0x01, 0x93, 0x30, 0x87, 0x00, 0xFF, 0x5E,
0x02, 0x62, 0x01, 0x7B, 0x00, 0xAE, 0x00, 0x5D, 0x5D, 0x5D, 0xFE, 0x01, 0x8F, 0xCF, 0x00, 0x1A,
0x01, 0x38, 0x01, 0x00, 0x00, 0x45, 0x30, 0xDB, 0x03, 0xF9, 0x00, 0x03, 0x03, 0xFF, 0xE2, 0x02,
0xD1, 0x01, 0x20, 0x01, 0x39, 0x30, 0x7D, 0x01, 0x84, 0x84, 0x84, 0x1F, 0x40, 0x02, 0x6F, 0x6F,
0x6F, 0x29, 0x01, 0x30, 0x00, 0x0D, 0x02, 0xE3, 0x01, 0xF1, 0x09, 0x00, 0x68, 0x01, 0x72, 0x00,
0x4E, 0x00, 0x62, 0x01, 0xB1, 0x03, 0x72, 0x72, 0x3F, 0x72, 0xE1, 0x03, 0xA6, 0x02, 0x2A, 0x03,
0xA5, 0x00, 0x5C, 0x31, 0x02, 0x01, 0x00, 0x00, 0xFE, 0x5B, 0x5B, 0x5B, 0x2A, 0x00, 0x51, 0x00,
0x62, 0x61, 0x81, 0x00, 0x62, 0x31, 0xF8, 0xD7, 0x01, 0xA2, 0xA2, 0xA2, 0xD7, 0x31, 0x21, 0x00,
0x48, 0x00, 0xE4, 0x00, 0xF1, 0xF7, 0x02, 0x5D, 0x00, 0x41, 0x41, 0x41, 0x72, 0x00, 0x09, 0x66,
0xA2, 0x00, 0xE3, 0x89, 0x89, 0x89, 0x44, 0x44, 0x44, 0x87, 0x00, 0x3F, 0x03, 0xC0, 0x49, 0x02,
0x62, 0x01, 0x12, 0x00, 0xB7, 0x03, 0x46, 0x02, 0x1E, 0x1E, 0x1E, 0x1F, 0x5F, 0x5F, 0x5F, 0x94,
0x94, 0x94, 0x29, 0x29, 0x00, 0x29, 0x48, 0x00, 0x27, 0x00, 0x92, 0x92, 0x92, 0x48, 0x00, 0x72,
0x00, 0xC6, 0x97, 0x97, 0x97, 0xE7, 0x30, 0x66, 0x03, 0x20, 0x01, 0x86, 0x01, 0x24, 0x00, 0xF8,
0x30, 0x00, 0x36, 0x36, 0x36, 0xC3, 0x00, 0x09, 0x00, 0x80, 0x80, 0x31, 0x80, 0xB5, 0x02, 0xE1,
0x00, 0x0A, 0x02, 0x82, 0x82, 0x82, 0xED, 0x00, 0x8E, 0x4E, 0x03, 0x45, 0x00, 0x3F, 0x3F, 0x3F,
0x35, 0x01, 0x00, 0x00, 0x45, 0x00, 0xE3, 0x87, 0x00, 0xCF, 0x00, 0x4D, 0x01, 0x96, 0x00, 0x94,
0x02, 0xA1, 0xA1, 0xA1, 0x1F, 0x57, 0x00, 0x63, 0x00, 0x62, 0x61, 0x61, 0x02, 0x42, 0x00, 0x93,
0x00, 0x9D, 0x02, 0xE7, 0x00, 0xFF, 0x9C, 0x9C, 0x9C, 0xB5, 0x02, 0x49, 0x49, 0x49, 0x39, 0x00,
0x88, 0x75, 0x00, 0x57, 0x00, 0x56, 0x01, 0x73, 0x02, 0x45, 0x00, 0x03, 0x03, 0x62, 0x01, 0x84,
0x00, 0xFF, 0x6E, 0x01, 0xD0, 0x02, 0x98, 0x01, 0x6C, 0x6C, 0x6C, 0x96, 0x96, 0x07, 0x96, 0x21,
0x00, 0x9F, 0x00, 0xCE, 0x01, 0x97, 0x02, 0x0A, 0x0A, 0x0A, 0x1E, 0x43, 0x43, 0x43, 0x9C, 0x00,
0xCA, 0x02, 0x21, 0x00, 0x79, 0x02, 0xAA, 0x01, 0xF8, 0x3C, 0x00, 0x1F, 0x02, 0x15, 0x03, 0x47,
0x01, 0x65, 0x61, 0x69, 0x33, 0xAE, 0x00, 0x4E, 0x03, 0xFF, 0x73, 0x32, 0x62, 0x61, 0xDA, 0x01,
0x3C, 0x00, 0x2A, 0x00, 0x12, 0x00, 0xA5, 0xA5, 0x3F, 0xA5, 0x27, 0x00, 0x1B, 0x00, 0x7E, 0x00,
0x8A, 0x00, 0x2C, 0x2C, 0x2C, 0x1E, 0x62, 0x01, 0x88, 0x88, 0x88, 0x62, 0x01, 0xB1, 0x00, 0x20,
0x31, 0x6E, 0x01, 0xF1, 0x2B, 0x02, 0x3F, 0x00, 0xD2, 0x00, 0x72, 0x00, 0x47, 0x47, 0x47, 0x2A,
0x00, 0x8F, 0x28, 0x02, 0x48, 0x00, 0x63, 0x63, 0x63, 0x7F, 0x7F, 0x7F, 0x03, 0x7B, 0x30, 0x8E,
0x8E, 0x8E, 0x78, 0x00, 0x71, 0x71, 0x71, 0x11, 0xA5, 0x00, 0xBC, 0x01, 0x0B, 0x0B, 0x0B, 0xFF,
0x00, 0x93, 0x93, 0x23, 0x93, 0x8B, 0x8B, 0x8B, 0x69, 0x69, 0x69, 0xC3, 0x03, 0x80, 0x06, 0x00,
0x3B, 0x01, 0xB9, 0x01, 0x8D, 0x8D, 0x8D, 0x51, 0x00, 0xA0, 0x02, 0xC7, 0x36, 0x00, 0x1B, 0x00,
0x05, 0x01, 0xD1, 0x01, 0x58, 0x58, 0x58, 0x87, 0x0F, 0x87, 0x87, 0x0C, 0x03, 0x8D, 0x00, 0x68,
0x01, 0x8D, 0x00, 0x45, 0x30, 0x54, 0x00, 0xFC, 0x12, 0x00, 0x4D, 0x4D, 0x4D, 0x27, 0x00, 0x3F,
0x00, 0x57, 0x00, 0xC1, 0x71, 0xC1, 0xC1, 0xB6, 0x01, 0x30, 0x00, 0x00, 0x00, 0x90, 0x30, 0x53,
0x01, 0x90, 0x7C, 0x90, 0x90, 0x93, 0x00, 0xB6, 0x01, 0x56, 0x56, 0x56, 0xF2, 0x01, 0x8C, 0x60,
0x00, 0xB4, 0x00, 0x4E, 0x00, 0x98, 0x98, 0x98, 0x1D, 0x01, 0x85, 0x47, 0x85, 0x85, 0xCC, 0x00,
0x0C, 0x0C, 0x0C, 0x75, 0x75, 0x04, 0x75, 0x91, 0x91, 0x91, 0x1B, 0x00, 0x57, 0x57, 0x57, 0x10,
0x9F, 0x9F, 0x9F, 0x34, 0x34, 0x34, 0x46, 0x46, 0x00, 0x46, 0x9B, 0x9B, 0x9B, 0xA8, 0x00, 0xBA,
0x00, 0xB8, 0xB8, 0x30, 0xB8, 0x62, 0x62, 0x62, 0x07, 0x07, 0x07, 0x29, 0x01, 0x80, 0x99, 0x99,
0x99, 0x86, 0x86, 0x86, 0x36, 0x00, 0x78, 0x00, 0xC0, 0x79, 0x79, 0x79, 0x9D, 0x9D, 0x9D, 0x68,
0x68, 0x00, 0x68, 0x83, 0x83, 0x83, 0x5C, 0x5C, 0x5C, 0x13, 0x32, 0x80, 0x0C, 0x90, 0x35, 0xF4,
0x30, 0x30, 0x30, 0x8F, 0x8F, 0x8F, 0x03, 0x14, 0x01, 0x36, 0x00, 0xAC, 0xAC, 0xAC, 0x95, 0x95,
0x95, 0x03, 0x6B, 0x6B, 0x6B, 0xA0, 0xA0, 0xA0, 0x5C, 0x01, 0x46, 0x02, 0xC0, 0x15, 0x00, 0x8C,
0x8C, 0x8C, 0xE1, 0x00, 0x71, 0x01, 0x3C, 0x63, 0x22, 0x71, 0x22, 0x22, 0x48, 0x00, 0x26, 0x26,
0x26, 0x60, 0x00, 0xF6, 0x03, 0xC4, 0x54, 0x00, 0x35, 0x01, 0x18, 0x00, 0x60, 0x00, 0x35, 0x35,
0x35, 0x41, 0x31, 0x8F, 0x2D, 0x2D, 0x2D, 0x6A, 0x6A, 0x6A, 0x7E, 0x7E, 0x00, 0x7E, 0x12, 0x00,
0xCC, 0x33, 0x8D, 0x00, 0x32, 0x32, 0x32, 0x02, 0x01, 0x8E, 0x6E, 0x6E, 0x6E, 0x4F, 0x4F, 0x4F,
0x12, 0x00, 0x36, 0x00, 0xC0, 0x02, 0x31, 0x51, 0x60, 0x37, 0x37, 0x37, 0x2F, 0x01, 0x45, 0x30,
0x38, 0x63, 0x38, 0x38, 0x6F, 0x00, 0x24, 0x00, 0x24, 0x24, 0x24, 0x5A, 0x0C, 0x5A, 0x5A, 0x78,
0x78, 0x78, 0x67, 0x67, 0x67, 0x00, 0x2E, 0x2E, 0x2E, 0x08, 0x01, 0x3E, 0x01, 0x06, 0x00, 0x7A,
0x7A, 0x38, 0x7A, 0x5E, 0x5E, 0x5E, 0x4C, 0x4C, 0x4C, 0x78, 0x03, 0x80, 0x1E, 0x00, 0x78, 0x60,
0x96, 0x00, 0xFB, 0x01, 0x57, 0x00, 0x45, 0x00, 0x15, 0x00, 0x40, 0x7F, 0x40, 0x40, 0x5D, 0x00,
0xB4, 0x00, 0x28, 0x28, 0x28, 0x4B, 0x03, 0x8C, 0x36, 0x00, 0x84, 0x00, 0x2B, 0x2B, 0x2B, 0xC3,
0x00, 0x33, 0x33, 0x23, 0x33, 0x3C, 0x3C, 0x3C, 0x1B, 0x00, 0x99, 0x00, 0x42, 0x42, 0x30, 0x42,
0x2F, 0x2F, 0x2F, 0x30, 0x00, 0x4E, 0x4E, 0x4E, 0x10, 0x7B, 0x7B, 0x7B, 0x1B, 0x00, 0x48, 0x48,
0x48, 0x1E, 0x00, 0x88, 0x1E, 0x33, 0x4A, 0x4A, 0x4A, 0x77, 0x77, 0x77, 0x3F, 0x00, 0x81, 0xEA,
0x00, 0x4E, 0x00, 0x59, 0x59, 0x59, 0x76, 0x76, 0x76, 0x03, 0x65, 0x65, 0x65, 0x31, 0x31, 0x31,
0x3C, 0x00, 0x0C, 0xC0, 0xC0, 0x53, 0xF1, 0x21, 0x21, 0x21, 0x1B, 0x00, 0x1F, 0x1F, 0x1F, 0x11,
0x3D, 0x3D, 0x3D, 0xA3, 0xA3, 0xA3, 0x73, 0x73, 0x00, 0x73, 0x74, 0x74, 0x74, 0x61, 0x61, 0x61,
0x20, 0x00, 0x20, 0x20, 0x21, 0x00, 0x23, 0x23, 0x23, 0x39, 0x39, 0x04, 0x39, 0x25, 0x25, 0x25,
0x09, 0x00, 0x89, 0x91, 0x09, 0x00, 0x5A, 0x00, 0xF0, 0x09, 0x00, 0x21, 0x00, 0x09, 0x00, 0x27,
0x30, 0x60, 0x00, 0x27, 0x00, 0x00, 0x00, 0x12, 0x30, 0xFF, 0x99, 0x30, 0x23, 0x91, 0x3C, 0x00,
0xCC, 0x33, 0x0E, 0x0E, 0x0E, 0x12, 0x00, 0x8F, 0x02, 0xC1, 0x15, 0x30, 0x7B, 0x00, 0x45, 0x30,
0x09, 0x00, 0x27, 0x00, 0x8D, 0xC0, 0x39, 0x00, 0xFF, 0x4E, 0x30, 0x33, 0x00, 0x14, 0x31, 0x57,
0x00, 0x30, 0x00, 0x78, 0xC0, 0xAE, 0x60, 0x2A, 0x00, 0xFF, 0x0F, 0x0F, 0x0F, 0x5A, 0x00, 0x39,
0x30, 0x03, 0x00, 0x06, 0x00, 0x13, 0x78, 0x13, 0x13, 0x1E, 0x00, 0x3C, 0x30, 0x06, 0x00, 0x1B,
0x00, 0x7B, 0x00, 0x5D, 0x30, 0xFC, 0xB4, 0x00, 0x09, 0x00, 0x18, 0x30, 0x1E, 0x03, 0x06, 0x00,
0x09, 0x30, 0xB3, 0x01, 0x03, 0x00, 0xFF, 0x09, 0x00, 0x12, 0x00, 0x48, 0x00, 0x12, 0x12, 0x12,
0x1D, 0x1D, 0x07, 0x1D, 0x00, 0x00, 0x39, 0x00, 0x3C, 0x00, 0x0F, 0xF0, 0x36, 0xF0, 0x10, 0x10,
0x3E, 0x10, 0x17, 0x17, 0x17, 0x3A, 0x3A, 0x3A, 0xAE, 0x00, 0xAE, 0xAE, 0x3B, 0x3B, 0x3B, 0x0F,
0x00, 0x14, 0x14, 0x20, 0x14, 0x16, 0x16, 0x16, 0x09, 0x00, 0x39, 0x00, 0x11, 0x11, 0x30, 0x11,
0x36, 0x00, 0xB2, 0xF2, 0x3C, 0xF0, 0x90, 0xF0, 0x90, 0xF0, 0x36, 0x30, 0x7B, 0x90, 0xFE, 0x0F,
0xF0, 0x2A, 0xF0, 0x0F, 0xF0, 0x57, 0xF0, 0x0F, 0xF0, 0x18, 0xF0, 0x27, 0x00, 0x21, 0x00, 0xFF,
0x45, 0xF0, 0x12, 0xF0, 0x60, 0x60, 0x0C, 0xC0, 0x30, 0x60, 0x18, 0x18, 0x18, 0x1F, 0x2A, 0x00,
0x03, 0x30, 0x0F, 0xF0, 0x24, 0xF0, 0x00, 0x00, 0x1A, 0x1A, 0x1A, 0x1F, 0x27, 0x27, 0x27, 0x60,
0x60, 0x60, 0x2A, 0x2A, 0x00, 0x2A, 0x15, 0x15, 0x15, 0x5C, 0x01, 0x00, 0x00, 0x0F, 0xF0, 0x0F,
0xF0, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0,
0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
0xF0, 0x0F, 0xF0, 0xFF, 0x18, 0xF0, 0x0D, 0x0D, 0x0D, 0x19, 0x19, 0x19, 0x1C, 0x01, 0x1C, 0x1C,
0x06, 0x60, 0x03, 0x30, 0x00, 0x00, 0x1B, 0x1B, 0x1B, 0x1C, 0xFF, 0xFF, 0xA8, 0x1D, 0x00, 0x00,
0x0E, 0x00, 0x00, 0x00, 0xD5, 0x31, 0x00, 0x00
};
#endif //MENU_LOGO_ENABLE
// 68 x 192 @8bpp Grayscale RAW.
#define X_BOOTLOGO 68
#define Y_BOOTLOGO 192
#define SZ_BOOTLOGO 13056
#define SZ_BOOTLOGO_BLZ 6704
static u8 BOOTLOGO_BLZ[SZ_BOOTLOGO_BLZ] = {
0x0F, 0xF0, 0x80, 0x1B, 0x1B, 0x77, 0xF0, 0x6A, 0x08, 0x41, 0x80, 0x0F, 0x4D, 0x21, 0x40, 0x29,
0xF0, 0xFC, 0x34, 0xED, 0x34, 0x10, 0x23, 0x26, 0x27, 0x23, 0x76, 0x30, 0x0F, 0xF0, 0xC3, 0xC9,
0xF0, 0x3F, 0x7F, 0xC6, 0x53, 0x80, 0x2E, 0x33, 0xDB, 0x2D, 0xBA, 0x20, 0x8F, 0x1C, 0xE7, 0x76,
0x23, 0xF8, 0x0E, 0x40, 0xF0, 0x54, 0x9C, 0x1E, 0x21, 0x3A, 0x1F, 0xBD, 0x71, 0x20, 0x2F, 0x3D,
0xDB, 0x35, 0xFE, 0x00, 0x82, 0x19, 0xB1, 0x9E, 0x83, 0x5D, 0x22, 0x85, 0x1C, 0x93, 0xB1, 0x44,
0x3F, 0xD2, 0x29, 0x63, 0x26, 0x39, 0x88, 0x33, 0x45, 0xDA, 0x38, 0x08, 0x9E, 0x50, 0x32, 0x56,
0x78, 0x75, 0x27, 0x1D, 0x1D, 0x99, 0xE6, 0xE8, 0xC3, 0x28, 0x33, 0xD0, 0x2B, 0x21, 0xC9, 0xB0,
0x49, 0xB9, 0x1C, 0x60, 0x30, 0x4F, 0xA1, 0x6D, 0x3A, 0x36, 0x37, 0x36, 0x00, 0x34, 0x2B, 0x79,
0x3C, 0x51, 0xF1, 0x2E, 0x3C, 0xD2, 0x32, 0x0C, 0x26, 0x19, 0xC6, 0x9F, 0x70, 0x95, 0x21, 0x8D,
0xBB, 0xBC, 0xBA, 0x0E, 0xBB, 0xBB, 0xBA, 0xBC, 0xBB, 0xF4, 0x10, 0x4E, 0xF1, 0xC9, 0x10, 0xE0,
0xD2, 0x36, 0xC9, 0x90, 0x11, 0x1E, 0x19, 0xA0, 0x1C, 0x27, 0x3F, 0x1C, 0x52, 0x54, 0x51, 0x51,
0x50, 0x51, 0x4D, 0x3A, 0x00, 0x24, 0xE0, 0x87, 0x38, 0x60, 0xC9, 0x10, 0x0D, 0xB1, 0x34, 0x59,
0xDA, 0xB1, 0x13, 0xDE, 0x93, 0x25, 0x28, 0x27, 0x88, 0x2D, 0xEB, 0x9A, 0x6A, 0x46, 0x1F, 0xC9,
0x70, 0xB9, 0x81, 0xF4, 0x71, 0x4C, 0x29, 0x02, 0x30, 0x2A, 0x1F, 0x73, 0x02, 0x7C, 0x22, 0xC7,
0x90, 0xD4, 0xB0, 0x24, 0xD4, 0x37, 0x25, 0x85, 0xB0, 0x27, 0x6B, 0xA4, 0xA3, 0x08, 0x0C, 0x47,
0x91, 0xAC, 0xBB, 0x2C, 0x27, 0x72, 0x01, 0x54, 0x22, 0x6F, 0x60, 0xF7, 0xBC, 0x6C, 0x14, 0x25,
0x7D, 0x88, 0x48, 0x5C, 0xDA, 0x3B, 0x7D, 0xA8, 0x84, 0x08, 0x48, 0xAB, 0x8A, 0x6A, 0x0C, 0xA7,
0x32, 0x2B, 0x56, 0xA8, 0x2B, 0x02, 0x20, 0x2C, 0xF2, 0xC0, 0x6C, 0x14, 0x34, 0x14, 0x05, 0x99,
0x09, 0xB5, 0x30, 0x7C, 0x8C, 0x45, 0x0F, 0x50, 0xA5, 0x30, 0x27, 0x42, 0x91, 0xAD, 0x1B, 0x1E,
0xFE, 0xC0, 0xB0, 0x04, 0x6C, 0x04, 0x2C, 0x79, 0x22, 0x95, 0x21, 0x0A, 0x65, 0x1A, 0xE9, 0x22,
0xB7, 0x8A, 0x69, 0x33, 0x45, 0xA4, 0x2E, 0x24, 0xF5, 0x27, 0x80, 0x1C, 0x1F, 0x23, 0x24, 0x25,
0x26, 0x51, 0x11, 0x26, 0x40, 0x25, 0x4C, 0x01, 0x99, 0x07, 0x25, 0x25, 0x2C, 0x3A, 0x4A, 0x06,
0xD3, 0xC4, 0x33, 0x60, 0x45, 0x48, 0x79, 0x2C, 0xA4, 0x23, 0xED, 0x5F, 0x75, 0x76, 0x89, 0x37,
0x46, 0xA4, 0x32, 0x2B, 0x47, 0xAA, 0x00, 0x42, 0x1E, 0x1D, 0x20, 0x29, 0x2F, 0x0A, 0x10, 0x38,
0x40, 0x01, 0x10, 0x37, 0x01, 0x00, 0x36, 0x37, 0x37, 0x37, 0x3B, 0x05, 0x47, 0x50, 0xD2, 0xFC,
0x1F, 0xB5, 0xB3, 0x1C, 0xFA, 0xB3, 0xA5, 0x58, 0x8C, 0x64, 0xA7, 0x4C, 0x5B, 0x9F, 0x89, 0x2B,
0x00, 0x1D, 0x1D, 0x24, 0x2F, 0xD1, 0x01, 0x10, 0xD2, 0x01, 0x10, 0xA0, 0xD2, 0xD3, 0xD3, 0xD3,
0xD4, 0xD4, 0xD4, 0xD2, 0x00, 0xD2, 0xD4, 0xD4, 0xED, 0x34, 0xE0, 0x72, 0x20, 0xF5, 0x27, 0xA0,
0x6E, 0x5B, 0x71, 0x50, 0x56, 0x90, 0xB6, 0xBA, 0xBA, 0xB0, 0x03, 0x86, 0x36, 0x25, 0x0B, 0x21,
0x2B, 0x38, 0x3F, 0x02, 0x10, 0x84, 0x42, 0x02, 0x10, 0x40, 0x00, 0x00, 0x41, 0x41, 0x41, 0x43,
0x0A, 0x46, 0x45, 0x3B, 0x2D, 0x20, 0xBD, 0xCC, 0x68, 0xD8, 0x30, 0x60, 0x41, 0x4F, 0x54, 0x4F,
0x43, 0x33, 0x24, 0x16, 0x04, 0x80, 0x1E, 0x24, 0x2C, 0x2F, 0x30, 0x31, 0x0A, 0x00, 0x32, 0x40,
0x32, 0x31, 0x31, 0x30, 0x31, 0x32, 0x31, 0x30, 0x00, 0x30, 0x31, 0x31, 0x32, 0x2F, 0x2B, 0xD4,
0x75, 0xBD, 0x5C, 0xC0, 0x61, 0xA9, 0x7F, 0x00, 0x9C, 0x05, 0x29, 0x24, 0x1F, 0x1D, 0xC1, 0x29,
0x87, 0x20, 0x22, 0x21, 0x22, 0x26, 0x15, 0x0B, 0x22, 0x21, 0x20, 0x20, 0x21, 0x20, 0x21, 0x20,
0x4F, 0x1E, 0x1F, 0x1E, 0x20, 0x1E, 0x1D, 0x85, 0x90, 0x39, 0xB8, 0x1D, 0x23, 0x2B, 0x30, 0x0C,
0x2E, 0x2F, 0x2F, 0x2F, 0x2F, 0x30, 0x2D, 0x2F, 0x00, 0x2C, 0x35, 0x26, 0x1C, 0x1D, 0x1E, 0x24,
0x29, 0x2C, 0x02, 0x31, 0x31, 0x2D, 0x28, 0x25, 0x1E, 0x1E, 0x4D, 0x53, 0x80, 0x09, 0xF5, 0x41,
0xA0, 0xA4, 0xA6, 0xA5, 0xA6, 0xA7, 0x39, 0x18, 0x83, 0xA7, 0xA5, 0xA2, 0x25, 0xAF, 0x28, 0x29,
0x32, 0x3A, 0x10, 0x7D, 0xA0, 0xAB, 0xA0, 0x6E, 0x35, 0x2A, 0x21, 0x00, 0x9D, 0xFB, 0x1B, 0xCD,
0x5D, 0x1C, 0x96, 0x6F, 0x72, 0x76, 0x7E, 0x0D, 0xA5, 0x8D, 0x74, 0x72, 0x73, 0x7A, 0x9D, 0x8C,
0x00, 0x2B, 0x1F, 0x10, 0x2B, 0x3A, 0x8B, 0xDD, 0xC1, 0xA3, 0x02, 0x82, 0xAD, 0xC2, 0xE4, 0x6C,
0x2D, 0x22, 0x1D, 0x00, 0xC4, 0x32, 0x35, 0xFC, 0x9D, 0x8A, 0x1D, 0x24, 0x2E, 0x36, 0x42, 0x07,
0x74, 0x8F, 0x41, 0x35, 0x33, 0x35, 0x40, 0x51, 0x00, 0x9E, 0x30, 0x1D, 0x1B, 0x1F, 0x29, 0x3A,
0x98, 0x00, 0xDC, 0x59, 0x43, 0x3F, 0x3F, 0x43, 0x49, 0x77, 0x00, 0xD2, 0x6C, 0x06, 0x29, 0x5D,
0xF6, 0x2D, 0x13, 0x25, 0x88, 0x1D, 0x1E, 0x3C, 0x23, 0x37, 0x8A, 0x68, 0x2B, 0x12, 0x27, 0x3F,
0x8A, 0x10, 0x61, 0x1F, 0x1C, 0x24, 0x34, 0x64, 0xDC, 0x58, 0x00, 0x3B, 0x2F, 0x2C, 0x2A, 0x30,
0x38, 0x45, 0x69, 0x00, 0xDB, 0x33, 0x24, 0xBC, 0x79, 0xBD, 0x9C, 0xE1, 0xDA, 0x21, 0x36, 0x38,
0x84, 0x62, 0x09, 0x19, 0x1C, 0x28, 0x43, 0x98, 0x59, 0x02, 0x20, 0x1E, 0x2A, 0x3B, 0xB7, 0x8C,
0x3A, 0x29, 0x00, 0x21, 0x1E, 0x1F, 0x21, 0x28, 0x37, 0x45, 0xB6, 0x00, 0x88, 0x2C, 0x20, 0xC2,
0xF5, 0x21, 0x7D, 0x28, 0x31, 0x50, 0xA5, 0x42, 0xE8, 0x54, 0xB0, 0x7B, 0x37, 0x33, 0x37, 0x4D,
0x8D, 0x00, 0xA4, 0x30, 0x1E, 0x1E, 0x2F, 0x3F, 0xD2, 0x3F, 0x00, 0x2E, 0x1F, 0x86, 0x36, 0x3B,
0x7F, 0xAA, 0x30, 0x8E, 0x56, 0x84, 0x58, 0x76, 0xD9, 0x41, 0x05, 0xC6, 0x38, 0x61, 0xA1, 0xBB,
0xAB, 0x07, 0xAB, 0xB5, 0x92, 0x47, 0x24, 0x41, 0x20, 0x3A, 0x27, 0x20, 0x1D, 0x2A, 0x30, 0x36,
0x44, 0xD2, 0x33, 0x3A, 0x95, 0x1A, 0x42, 0xA1, 0x76, 0x85, 0xC0, 0xFD, 0x0B, 0x34, 0x44, 0x4A,
0x48, 0x47, 0x07, 0x45, 0x38, 0x15, 0x03, 0x20, 0x30, 0x41, 0x10, 0xCD, 0x43, 0x32, 0x64, 0x42,
0xD2, 0xBD, 0x00, 0x84, 0x60, 0x7D, 0x30, 0x35, 0x1C, 0xAD, 0x3B, 0x7B, 0xC8, 0xFC, 0x25, 0x25,
0x25, 0x25, 0xA2, 0x16, 0xC9, 0x20, 0x37, 0x8D, 0x3B, 0xB0, 0xBD, 0x00, 0x41, 0x20, 0x1C, 0xE5,
0xF6, 0x3D, 0x14, 0x61, 0xD2, 0x3A, 0x08, 0x29, 0x7B, 0x28, 0x60, 0x02, 0x1E, 0xE4, 0x0B, 0x40,
0xD2, 0x7A, 0x5F, 0x1F, 0x4A, 0x32, 0x41, 0xD2, 0x38, 0x25, 0x46, 0x50, 0xD9, 0x81, 0x2D, 0x23,
0xE0, 0x0C, 0xD8, 0x44, 0x80, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x01, 0x93, 0x24, 0x71, 0x08, 0x09,
0x70, 0x20, 0x35, 0x00, 0x36, 0x7E, 0x85, 0xAC, 0x1C, 0x3D, 0xA4, 0x95, 0x51, 0x87, 0x4D, 0x4A,
0xAB, 0x96, 0x95, 0x0E, 0xB2, 0x92, 0x90, 0xAB, 0x7A, 0x28, 0x1B, 0x1F, 0x00, 0x31, 0x41, 0xD3,
0x39, 0x2A, 0xA3, 0x01, 0x06, 0x00, 0x24, 0x60, 0x36, 0x45, 0xD4, 0x3B, 0x29, 0x1F, 0x86, 0x01,
0x1E, 0x40, 0x1F, 0x1D, 0x1C, 0x8D, 0xD9, 0xF6, 0xB7, 0x2F, 0x7C, 0x8D, 0x18, 0x4E, 0x5A, 0xA8,
0x4D, 0x47, 0x5B, 0x97, 0x2B, 0x00, 0x1C, 0x20, 0x31, 0x45, 0xD3, 0x42, 0x35, 0x2B, 0x00, 0x0D,
0x21, 0x30, 0x3F, 0x4E, 0xD4, 0x44, 0x35, 0x2B, 0x01, 0x2B, 0x2C, 0x2C, 0x2B, 0x27, 0x79, 0x01,
0x1C, 0x7B, 0x54, 0xA0, 0x89, 0x3D, 0x7D, 0xC8, 0x8B, 0x69, 0x34, 0x47, 0xA4, 0x37, 0x03, 0x2B,
0x41, 0x8F, 0x56, 0x1F, 0x1F, 0x31, 0x43, 0x00, 0xDD, 0x83, 0x7E, 0x00, 0x00, 0x06, 0x00, 0x7D,
0x81, 0x89, 0x18, 0xDD, 0x84, 0x7D, 0x7A, 0x79, 0x7A, 0x79, 0x7A, 0x00, 0x77, 0x73, 0x24, 0x1E,
0xB7, 0x36, 0x25, 0x6B, 0x17, 0x57, 0x56, 0x35, 0xF0, 0x35, 0x7C, 0x79, 0x32, 0x40, 0x98, 0x5A,
0x27, 0x00, 0x3C, 0x8A, 0x62, 0x21, 0x1F, 0x2B, 0x3D, 0xAE, 0x00, 0xAE, 0x01, 0x10, 0xAB, 0xAB,
0xAB, 0xAB, 0xAD, 0xB0, 0x02, 0xB2, 0xAF, 0x00, 0x00, 0xAC, 0xAB, 0xAB, 0xA9, 0xA6, 0x04, 0x25,
0x1F, 0x7D, 0x98, 0xD1, 0x29, 0x77, 0x9C, 0x2C, 0x52, 0xB0, 0x1C, 0x6F, 0x3C, 0x70, 0x9D, 0x44,
0x56, 0xAB, 0x40, 0x00, 0x1E, 0x1E, 0x24, 0x31, 0x39, 0x3F, 0x09, 0x10, 0x06, 0x10, 0xC0, 0x40,
0x41, 0x43, 0x41, 0x3D, 0x3C, 0x3C, 0x3C, 0x00, 0x3C, 0x3B, 0x36, 0x2E, 0x24, 0x1E, 0x49, 0xA9,
0x29, 0x47, 0xC0, 0x41, 0x8D, 0x65, 0x9C, 0x33, 0x43, 0x95, 0xBB, 0xB7, 0x01, 0x7A, 0x2B, 0x62,
0x0E, 0x22, 0x28, 0x2C, 0x2B, 0x29, 0x04, 0x01, 0x00, 0x07, 0x00, 0x2B, 0x2E, 0x2E, 0x2C, 0x2D,
0xC2, 0x00, 0x83, 0x2B, 0x2B, 0x28, 0x24, 0x1F, 0x1C, 0xE9, 0xC2, 0x49, 0x50, 0xC0, 0xA5, 0x52,
0x32, 0x2F, 0x25, 0x2E, 0x41, 0x4B, 0x44, 0x01, 0x30, 0x40, 0x10, 0xD4, 0x08, 0x08, 0x10, 0x20,
0x05, 0x10, 0x1F, 0x47, 0x09, 0xAE, 0x1F, 0x20, 0x1E, 0x1E, 0x1E, 0x20, 0x1E, 0xFC, 0x55, 0x80,
0x1A, 0x41, 0x10, 0x09, 0x35, 0x3B, 0xC4, 0x83, 0x04, 0x28, 0x28, 0x26, 0x1E, 0xD9, 0x64, 0x1A,
0x28, 0xB3, 0x3D, 0xF4, 0x69, 0x0B, 0xAE, 0xC1, 0x1E, 0x26, 0x3D, 0x32, 0x51, 0x66, 0x63, 0x3F,
0x27, 0x20, 0x24, 0x26, 0x80, 0x25, 0x28, 0x05, 0x10, 0x01, 0x00, 0x2C, 0x2A, 0x29, 0xDA, 0x2E,
0x8C, 0xD5, 0x0E, 0x27, 0x22, 0x1E, 0xA1, 0xC6, 0x28, 0xC3, 0x92, 0x98, 0x14, 0xD1, 0x5F, 0xA5,
0xAC, 0xA5, 0xA5, 0xB0, 0x95, 0x3B, 0x00, 0x7D, 0x08, 0x21, 0x2B, 0x37, 0x3C, 0x40, 0x3F, 0x09,
0x00, 0x81, 0x3F, 0x41, 0x40, 0x40, 0x40, 0x40, 0x42, 0x3F, 0x00, 0x40, 0x40, 0x3F, 0x40, 0x3E,
0x38, 0x31, 0x26, 0x00, 0x1E, 0xC2, 0x4D, 0xD9, 0x41, 0x7D, 0xC8, 0x26, 0x49, 0xAB, 0x73, 0x0E,
0x4A, 0x47, 0x49, 0x51, 0x87, 0x9C, 0x0E, 0x09, 0x25, 0x40, 0x36, 0x00, 0x00, 0x07, 0x60, 0xF4,
0x00, 0x00, 0x00, 0x00, 0xF5, 0xF5, 0x36, 0xF5, 0x34, 0x84, 0x22, 0x35, 0x29, 0xA7, 0xF7, 0x33,
0x7C, 0x8C, 0x32, 0x39, 0x27, 0x26, 0x27, 0x35, 0x4B, 0x9F, 0x4B, 0x00, 0x1E, 0x1D, 0x26, 0x30,
0x40, 0x4A, 0x5F, 0x0E, 0x50, 0x40, 0x02, 0x20, 0x52, 0x0E, 0x4C, 0x2E, 0x4D, 0x45, 0x39, 0x27,
0x41, 0x70, 0x87, 0x22, 0x59, 0x0A, 0x39, 0x7D, 0xA8, 0x1A, 0x20, 0x36, 0x8A, 0x0A, 0x68, 0x27,
0x1C, 0x6F, 0x0C, 0x7D, 0x08, 0x1F, 0x1C, 0x20, 0x18, 0x29, 0x32, 0x35, 0x39, 0x38, 0x6B, 0x0C,
0xAD, 0x1F, 0x39, 0x60, 0x39, 0x39, 0xA4, 0x1F, 0x38, 0x38, 0x33, 0x2A, 0x24, 0x04, 0x1E, 0xE9,
0x82, 0xD5, 0xF5, 0x34, 0x7E, 0x81, 0x2A, 0x35, 0x02, 0x86, 0x27, 0x42, 0x9D, 0x4D, 0x20, 0x6B,
0x02, 0x20, 0x21, 0x20, 0x22, 0x21, 0x69, 0x1C, 0x23, 0xAA, 0x1F, 0x21, 0x23, 0x31, 0x01, 0x94,
0x21, 0x23, 0x21, 0x1E, 0x1E, 0x1B, 0x05, 0xC9, 0x7D, 0xB8, 0xC0, 0x2D, 0x51, 0xAA, 0x68, 0x33,
0x2F, 0x33, 0x40, 0x00, 0x85, 0x9E, 0x2E, 0x09, 0x90, 0x78, 0xF0, 0x1A, 0x69, 0xEB, 0x99, 0x7A,
0xD8, 0x38, 0x6A, 0xA6, 0xAB, 0xA6, 0xA6, 0xAF, 0x98, 0x00, 0x47, 0x24, 0x00, 0x00, 0x60, 0xF1,
0x81, 0xF4, 0x85, 0x10, 0x29, 0xC1, 0x25, 0x7C, 0x37, 0x47, 0x60, 0x73, 0x71, 0x53, 0x39, 0x25,
0x00, 0x09, 0x80, 0x34, 0xDC, 0x51, 0xE1, 0x68, 0x40, 0xEF, 0x78, 0x27, 0x2E, 0x31, 0x1F, 0x2E,
0x29, 0x72, 0xC3, 0x81, 0x70, 0xE9, 0xD2, 0x71, 0x23, 0x3E, 0x98, 0x22, 0x7C, 0x23, 0x23, 0x23,
0x22, 0x25, 0x25, 0x24, 0x24, 0x00, 0x23, 0x23, 0x20, 0x1B, 0x1A, 0x0C, 0x30, 0xB9, 0x01, 0x0E,
0x70, 0xE0, 0x1A, 0x34, 0x66, 0xC9, 0xE0, 0x1C, 0x38, 0x42, 0x63, 0x67, 0x66, 0x16, 0x67, 0x68,
0x67, 0x66, 0x68, 0x68, 0x68, 0x65, 0x00, 0x5E, 0xC5, 0xE4, 0x19, 0x35, 0xA0, 0x0D, 0x61, 0x41,
0x10, 0xD2, 0x42, 0xB0, 0x11, 0xFA, 0x36, 0xAE, 0x1F, 0x97, 0x01, 0xA8, 0x1F, 0xA9, 0x1F, 0xAD,
0xFA, 0xC9, 0xF0, 0xC5, 0x04, 0xFE, 0x41, 0x80, 0x79, 0x0C, 0x40, 0x46, 0x46, 0x46, 0x97, 0x11,
0x46, 0x43, 0x46, 0x41, 0x33, 0x80, 0xA4, 0x1A, 0xCD, 0x04, 0x1C, 0x1D, 0x28, 0x5D, 0x41, 0xE9,
0xF2, 0xC2, 0x92, 0x22, 0x9B, 0x01, 0x25, 0x00, 0x00, 0x26, 0x57, 0x26, 0x4C, 0x3E, 0x1C, 0x29,
0x80, 0x24, 0x21, 0x20, 0x1B, 0x0A, 0x09, 0x5C, 0x89, 0x5C, 0x0D, 0x71, 0xCF, 0xA9, 0x23, 0xBD,
0x33, 0x1F, 0x25, 0x2F, 0x33, 0x1E, 0xBD, 0x95, 0x23, 0x2B, 0x90, 0x63, 0xC6, 0x01, 0x84, 0x61,
0xF2, 0x51, 0x11, 0x36, 0x82, 0x19, 0x28, 0x07, 0x32, 0x85, 0x60, 0x17, 0x25, 0x23, 0x21, 0x21,
0x24, 0x34, 0x85, 0x5E, 0x00, 0x20, 0x59, 0x40, 0x1A, 0x92, 0x1B, 0x29, 0x33, 0xA7, 0x77, 0x0A,
0x27, 0x2F, 0x30, 0x19, 0xD1, 0x99, 0x22, 0x2D, 0x23, 0xE7, 0x13, 0xAA, 0x6F, 0xEA, 0x59, 0x71,
0x9E, 0x88, 0x6A, 0x67, 0x67, 0x68, 0x00, 0x6A, 0x71, 0xAB, 0x56, 0xC7, 0x90, 0x1E, 0x2A, 0x3A,
0x10, 0x41, 0x00, 0x82, 0x91, 0xF6, 0x56, 0x49, 0x29, 0x18, 0x30, 0x74, 0x4F, 0x90, 0xAA, 0x3F,
0xB1, 0xAD, 0xA7, 0x13, 0x0E, 0xA8, 0xA5, 0x74, 0x2D, 0x08, 0x1D, 0xBF, 0x81, 0x20, 0x2B, 0x3C,
0xAB, 0x79, 0x2A, 0x02, 0x1E, 0x37, 0xDA, 0x8D, 0x49, 0xD1, 0x39, 0x0C, 0x11, 0x9F, 0x10, 0x3E,
0x56, 0x3E, 0x92, 0x77, 0x4B, 0x46, 0x46, 0x45, 0x45, 0x3E, 0x00, 0x2E, 0x21, 0xE0, 0x10, 0xA2,
0x7C, 0x3D, 0x41, 0x00, 0xD9, 0x39, 0xEC, 0xC1, 0xEC, 0x19, 0x06, 0x69, 0x5B, 0x86, 0x39, 0x25,
0x34, 0x51, 0x3F, 0x29, 0x07, 0x26, 0x24, 0x24, 0x25, 0x23, 0xDB, 0xB1, 0x1F, 0x2B, 0x20, 0x39,
0xAB, 0x7A, 0x2B, 0x1F, 0x28, 0x61, 0xF9, 0x93, 0xDA, 0x60, 0x95, 0x21, 0xAA, 0x9B, 0x22, 0x23,
0x21, 0x25, 0x27, 0x25, 0x03, 0x07, 0x03, 0x86, 0xB0, 0x28, 0x36, 0xA9, 0x77, 0x28, 0x1E, 0x03,
0x1B, 0x1C, 0x33, 0x82, 0x19, 0xC9, 0x80, 0x1A, 0xA5, 0xB2, 0x2D, 0x54, 0x45, 0x78, 0x89, 0x88,
0x6C, 0x2E, 0x22, 0x86, 0xA0, 0x80, 0x1C, 0x24, 0x2D, 0x56, 0x41, 0x22, 0x07, 0x00, 0x6E, 0x4B,
0xC0, 0x9D, 0x8A, 0x2D, 0x13, 0xE4, 0xA0, 0xFD, 0x0B, 0x7B, 0xB0, 0xA5, 0x32, 0x0F, 0xA0, 0xCF,
0xB9, 0x0C, 0x26, 0x22, 0xEF, 0x26, 0x75, 0xA0, 0x55, 0x1E, 0x51, 0xD1, 0xBA, 0x0C, 0xF9, 0xA5,
0x22, 0x3F, 0x4B, 0x6B, 0xA3, 0x29, 0xFF, 0xC7, 0x1F, 0x41, 0x30, 0x47, 0x21, 0xD1, 0xA9, 0x7F,
0x2E, 0x50, 0xA5, 0x02, 0x32, 0xA5, 0x02, 0x30, 0x5F, 0xA5, 0x02, 0x1D, 0x4C, 0xE0, 0x1A, 0x9A,
0x64, 0x69, 0xCB, 0x41, 0xB0, 0x37, 0x75, 0x89, 0x67, 0x40, 0x12, 0x24, 0x3E, 0x8B, 0x62, 0x21,
0x04, 0x99, 0x67, 0x7C, 0xE0, 0x1E, 0x52, 0x19, 0x6D, 0x37, 0x28, 0xFA, 0xB0, 0x33, 0x57, 0x75,
0x8F, 0x2D, 0x1F, 0xA5, 0x32, 0x33, 0x66, 0x40, 0xF0, 0xD1, 0xA9, 0xF0, 0xDC, 0x81, 0x24, 0x9A,
0x8A, 0x2A, 0x44, 0xA4, 0x89, 0x46, 0x06, 0x37, 0x39, 0x58, 0xA5, 0x02, 0xC7, 0x00, 0x39, 0xF7,
0x41, 0xF0, 0xF9, 0x33, 0xF8, 0xD1, 0xB6, 0xA5, 0x12, 0xBA, 0xAC, 0x7D, 0x34, 0x21, 0x03, 0x30,
0x83, 0x3A, 0xF0, 0xE5, 0xF6, 0x0D, 0x71, 0x7C, 0x44, 0x31, 0x40, 0x4B, 0x50, 0x0F, 0x4D, 0x42,
0x30, 0x32, 0x3C, 0x1B, 0x3B, 0xF0, 0xC1, 0xCB, 0x35, 0x68, 0x47, 0xDA, 0x39, 0x27, 0x21, 0xD6,
0x21, 0x28, 0x32, 0x10, 0x33, 0x31, 0x28, 0x20, 0x57, 0x87, 0xFE, 0x8A, 0x0A, 0x1B, 0x19, 0x38,
0xB5, 0x93, 0xDA, 0x7D, 0x38, 0x11, 0x9A, 0x2C, 0x46, 0x7A, 0x88, 0x0D, 0x88, 0x6D, 0x2E, 0x21,
0x1C, 0xDD, 0x29, 0x26, 0x22, 0x20, 0x44, 0x05, 0x1C, 0x9E, 0x88, 0x27, 0x2D, 0x2D, 0x29, 0x68,
0x09, 0x85, 0xA1, 0x76, 0x48, 0xC9, 0x00, 0x9C, 0xB5, 0x21, 0x30, 0x7C, 0xAF, 0x0D, 0x95, 0x8E,
0x8E, 0x9A, 0xAF, 0x56, 0xD1, 0x09, 0x26, 0x40, 0x32, 0x40, 0x41, 0x38, 0x28, 0x1F, 0x62, 0x28,
0x34, 0x08, 0xC0, 0x4A, 0x0E, 0x1E, 0x28, 0x38, 0x86, 0x85, 0x81, 0x2B, 0x01, 0x80, 0x44, 0x1C,
0xB5, 0x53, 0x0E, 0x61, 0x32, 0x3C, 0x57, 0xAB, 0x56, 0x1D, 0x3E, 0x3E, 0x3E, 0x4B, 0x6C, 0xA3,
0x2A, 0xB5, 0x03, 0x80, 0x4B, 0x81, 0x14, 0x24, 0x84, 0x09, 0x29, 0x30, 0x33, 0x2E, 0x0A, 0x27,
0x46, 0x04, 0x20, 0x31, 0x52, 0x2E, 0x00, 0x3B, 0xD1, 0x49, 0xA2, 0x1C, 0x1A, 0x91, 0x45, 0x9E,
0xBA, 0x32, 0x84, 0x7C, 0x33, 0x0C, 0x22, 0x23, 0x24, 0x2F, 0x48, 0x98, 0x56, 0x1E, 0x00, 0x21,
0x39, 0x81, 0x24, 0xF0, 0x03, 0x29, 0x3A, 0xA0, 0xB6, 0x0C, 0xB4, 0x5D, 0xC5, 0x01, 0x21, 0x3B,
0x65, 0x2E, 0x00, 0x48, 0x44, 0x55, 0x8E, 0x85, 0x20, 0xD1, 0xA4, 0x20, 0x38, 0x8A, 0x67, 0x25,
0x07, 0xBA, 0x00, 0x24, 0x3F, 0x8B, 0x62, 0x20, 0x21, 0x3F, 0x01, 0xF5, 0x27, 0x85, 0x00, 0x2F,
0x4F, 0x8E, 0x09, 0x85, 0x2A, 0x1E, 0x13, 0x19, 0x22, 0x3E, 0x6F, 0x6E, 0x24, 0x1C, 0x61, 0xB2,
0x8B, 0xA4, 0xD0, 0x1F, 0x33, 0x75, 0x8E, 0x2E, 0x1E, 0x1D, 0x1E, 0x00, 0x2B, 0x47, 0xAB, 0x41,
0x1E, 0xD9, 0x31, 0x4F, 0x2A, 0x20, 0x1C, 0x20, 0x35, 0x5F, 0x41, 0x00, 0x8C, 0x30, 0x20, 0x10,
0x1B, 0x22, 0x41, 0x40, 0xB5, 0xC3, 0x0E, 0x71, 0x8E, 0x25, 0x44, 0xA5, 0x3C, 0x89, 0x45, 0x37,
0x39, 0x59, 0x9E, 0x8A, 0x2B, 0x00, 0x1B, 0x23, 0x41, 0x10, 0x10, 0x4E, 0x41, 0x00, 0x37, 0x85,
0x10, 0xA8, 0x8E, 0x32, 0x20, 0xD2, 0x16, 0xB6, 0x20, 0x39, 0xC8, 0xA5, 0x22, 0x5D, 0x83, 0xF8,
0x55, 0x8E, 0xB1, 0xBC, 0xBC, 0xAD, 0x7E, 0x36, 0x00, 0xD5, 0x05, 0x85, 0x30, 0x29, 0x85, 0x50,
0x32, 0x1F, 0x1B, 0x23, 0x0B, 0x3A, 0x25, 0x50, 0x95, 0x81, 0x45, 0xBD, 0x1A, 0xC0, 0x20, 0x23,
0x2F, 0x2D, 0x40, 0x4B, 0x4E, 0x4C, 0x41, 0x30, 0x23, 0x1C, 0x00, 0x10, 0x40, 0x50, 0x2B, 0x48,
0x02, 0x65, 0x41, 0x20, 0x8E, 0x16, 0xA2, 0x23, 0xE9, 0xB1, 0xA7, 0xDC, 0x7D, 0x48, 0xC0, 0x96,
0x24, 0x27, 0x29, 0x27, 0x0D, 0x25, 0x1F, 0x1D, 0x19, 0x16, 0xB5, 0x43, 0x1F, 0x39, 0x66, 0x18,
0x41, 0x00, 0x90, 0x33, 0x1F, 0xA2, 0x63, 0x1A, 0xA1, 0x86, 0xE9, 0x62, 0xD1, 0xF3, 0x47, 0x22,
0x24, 0x25, 0x1F, 0x1E, 0x22, 0x2C, 0x01, 0x31, 0x2C, 0x26, 0x5A, 0x1A, 0xC9, 0x20, 0x53, 0x30,
0x22, 0x18, 0x27, 0x3F, 0x6B, 0xBA, 0x08, 0x93, 0x39, 0x26, 0x21, 0x08, 0x28, 0x46, 0x73, 0xC9,
0xA0, 0x1C, 0xD5, 0x05, 0x99, 0x0E, 0xB7, 0x54, 0xE8, 0x49, 0x28, 0x34, 0x78, 0x89, 0x6D, 0x34,
0x46, 0x8F, 0x01, 0xB0, 0xAB, 0x86, 0x29, 0x1D, 0x1B, 0xB5, 0x33, 0x69, 0x40, 0x49, 0x3C, 0x41,
0x55, 0x76, 0x11, 0x0A, 0x9E, 0x52, 0x20, 0x3F, 0x3C, 0x43, 0x5B, 0x7D, 0x85, 0x40, 0x1C, 0xD9,
0x81, 0xA0, 0x29, 0x2E, 0x83, 0x22, 0x3B, 0xA5, 0x9C, 0x8F, 0xA0, 0x02, 0x9A, 0x93, 0x87, 0x5A,
0x66, 0xA1, 0x86, 0x24, 0x00, 0x81, 0x44, 0xC4, 0xC1, 0x07, 0x00, 0x14, 0x1A, 0xD5, 0xC2, 0xBF,
0x19, 0xBE, 0xBF, 0xC3, 0xC5, 0x2E, 0x00, 0x50, 0x41, 0x60, 0x1A, 0x50, 0xD1, 0x79, 0x72, 0x43,
0x2D, 0x6C, 0x99, 0x47, 0x43, 0x54, 0x03, 0x9E, 0xA1, 0x3E, 0x30, 0x3D, 0x5C, 0xAA, 0x2C, 0x00,
0x1D, 0x02, 0x6F, 0x41, 0xF0, 0xFF, 0x4E, 0x22, 0xD1, 0xD9, 0xA5, 0x83, 0x8A, 0x75, 0x69, 0x2E,
0x28, 0x3C, 0x74, 0x8A, 0x2D, 0x1E, 0x00, 0x2A, 0x48, 0xA3, 0x41, 0x00, 0x3E, 0xD9, 0x11, 0xFF,
0x3D, 0xF0, 0xA8, 0x4C, 0x2A, 0x59, 0xAA, 0x39, 0x45, 0x8D, 0x23, 0x39, 0x8A, 0x14, 0x63, 0x24,
0x20, 0x32, 0x6C, 0x87, 0x27, 0x1A, 0x00, 0x24, 0x43, 0xA5, 0x2F, 0x51, 0x01, 0x61, 0xE9, 0xF2,
0xFF, 0x50, 0x3E, 0x21, 0xD5, 0xB5, 0x3D, 0x84, 0x22, 0x3A, 0x89, 0x66, 0x28, 0x07, 0x26, 0x34,
0x6D, 0x89, 0x2E, 0x21, 0x2B, 0x48, 0x00, 0xA5, 0x31, 0xE1, 0x0A, 0x4A, 0x96, 0xA0, 0x00, 0x00,
0xA2, 0x44, 0xA3, 0xA1, 0x01, 0x10, 0xA2, 0xA2, 0xA2, 0xA2, 0xA3, 0x04, 0xA2, 0xA2, 0xA0, 0x9A,
0x8B, 0x37, 0xAD, 0x9B, 0x35, 0x0C, 0xC0, 0x29, 0x9B, 0x61, 0xD5, 0x04, 0x8C, 0x84, 0x66, 0x64,
0x6D, 0x06, 0x8A, 0x9A, 0x68, 0x63, 0x68, 0x72, 0xAB, 0x2E, 0x00, 0x1B, 0x1F, 0x29, 0x08, 0x53,
0x55, 0x50, 0x4E, 0x4D, 0x04, 0x4C, 0x01, 0x10, 0x00, 0x00, 0x4D, 0x4D, 0x4D, 0x4C, 0x4D, 0x06,
0x4A, 0x43, 0x37, 0x29, 0x20, 0x69, 0xCB, 0x31, 0x80, 0x31, 0x60, 0x6C, 0x8C, 0x8A, 0x8A, 0x8C,
0x90, 0x8F, 0x8B, 0x00, 0x8A, 0x8B, 0x8D, 0x89, 0xF6, 0x0F, 0x27, 0x3A, 0x4A, 0x10, 0x4F, 0x47,
0x38, 0x2E, 0x01, 0x10, 0x9D, 0x01, 0x28, 0x29, 0x30, 0x29, 0x28, 0x2A, 0x29, 0x2A, 0x29, 0x27,
0x23, 0x00, 0x1F, 0xA1, 0xB6, 0x3A, 0x09, 0x95, 0x25, 0x32, 0x39, 0x3A, 0x0A, 0x3B, 0x39, 0x3C,
0x3D, 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x31, 0x21, 0xA1, 0x06, 0x4D, 0x41, 0x00, 0x38, 0x26, 0x1D,
0x14, 0x1D, 0x02, 0x00, 0xB4, 0x04, 0x1C, 0x1C, 0x1D, 0x1E, 0x1D, 0x06, 0x1C, 0x1D, 0xB6, 0x01,
0xF5, 0xC7, 0x81, 0xA4, 0x4C, 0x03, 0x01, 0x10, 0x22, 0x7C, 0x40, 0x03, 0x20, 0x75, 0x01, 0x3A,
0x89, 0x1D, 0x44, 0x1F, 0x50, 0x18, 0xF0, 0xD5, 0x95, 0x51, 0x0D, 0x91, 0x85, 0xD0, 0x3F, 0x6D,
0x71, 0x13, 0x2A, 0xF8, 0x95, 0xA7, 0xA8, 0x00, 0x54, 0x20, 0x01, 0x9D, 0x51, 0x71, 0x21, 0xF0,
0xA9, 0x5F, 0x4E, 0xC0, 0x1C, 0x7F, 0xAD, 0xBE, 0xB5, 0x33, 0x19, 0x94, 0x50, 0x1C, 0xA0, 0xD9,
0x11, 0x6F, 0x78, 0x4F, 0xBB, 0xD1, 0xF7, 0xB1, 0xB7, 0x04, 0x3E, 0x74, 0x97, 0x1A, 0x1E, 0x30,
0x85, 0x40, 0x5B, 0x6F, 0x38, 0x2A, 0x2B, 0x03, 0x30, 0x2A, 0x2B, 0x29, 0x2A, 0x08, 0x2A, 0x2A,
0x28, 0x29, 0x24, 0x20, 0x1C, 0x71, 0x93, 0x80, 0xE5, 0xF6, 0x7D, 0x8A, 0x21, 0x3F, 0x73, 0x5A,
0x4F, 0x4F, 0x50, 0x07, 0x4F, 0x01, 0x00, 0x4E, 0x4F, 0x4F, 0x4E, 0x50, 0x50, 0x02, 0x4F, 0x4D,
0x46, 0x38, 0x28, 0x20, 0x51, 0x41, 0x1C, 0x40, 0x71, 0x73, 0x1C, 0x3E, 0x31, 0x0B, 0x04, 0x20,
0x1D, 0xAB, 0x57, 0x24, 0x4D, 0x68, 0x5E, 0xFF, 0x3D, 0xF0, 0x3A, 0x24, 0x1B, 0x55, 0x9E, 0x3B,
0x45, 0xD9, 0xA1, 0x7C, 0x6C, 0x2B, 0x20, 0x7D, 0x23, 0x30, 0x53, 0x21, 0x49, 0x09, 0x21, 0x11,
0x0E, 0x40, 0xF0, 0xA5, 0x12, 0xE8, 0x71, 0x1F, 0x34, 0x3D, 0x21, 0x3F, 0x7F, 0x41, 0xDE, 0x1E,
0xAB, 0x9E, 0x40, 0x24, 0x1C, 0x07, 0x1E, 0x27, 0x3B, 0x85, 0xAF, 0x6E, 0x95, 0x01, 0x24, 0x2E,
0xC0, 0xFF, 0x21, 0xFB, 0x47, 0x89, 0x2D, 0x85, 0x80, 0x01, 0x10, 0x19, 0xFB, 0x53, 0xBA, 0x4E,
0x8E, 0xB4, 0x6F, 0x30, 0x33, 0x57, 0xA5, 0x00, 0xA0, 0x50, 0x2F, 0x21, 0x85, 0x40, 0x03, 0x30,
0x03, 0x30, 0x00, 0x00, 0xF0, 0x63, 0x0F, 0xDF, 0x3D, 0x25, 0xD9, 0x91, 0xDC, 0x3B, 0x28, 0x11,
0x2C, 0x84, 0x1D, 0x24, 0x30, 0x45, 0x65, 0xA7, 0xA1, 0x01, 0x8B, 0xB1, 0x78, 0x3E, 0x2A, 0x78,
0x07, 0x22, 0x89, 0x2D, 0xA0, 0x7D, 0x6E, 0x05, 0x30, 0x66, 0x01, 0x00, 0x65, 0x66, 0x66, 0x14,
0x66, 0x63, 0x59, 0x46, 0x30, 0x1F, 0x1C, 0xD9, 0xA1, 0x80, 0xED, 0x5F, 0x19, 0xCB, 0x4D, 0x4A,
0x76, 0xB6, 0xBB, 0x88, 0x05, 0x43, 0x5B, 0x23, 0xCD, 0x3D, 0x64, 0x44, 0x3A, 0x39, 0x06, 0x00,
0x86, 0x00, 0x00, 0x39, 0x38, 0x3A, 0x39, 0x38, 0x38, 0x38, 0x01, 0x32, 0x2B, 0x22, 0xC8, 0x20,
0x19, 0x6D, 0x77, 0x1C, 0xE5, 0x95, 0xA8, 0x27, 0x3B, 0x88, 0xB2, 0x8F, 0x79, 0xAC, 0x9F, 0x00,
0x41, 0x1A, 0x16, 0x23, 0xD0, 0x2C, 0x52, 0x2F, 0x20, 0x20, 0x0A, 0x1F, 0x1F, 0x20, 0x22, 0x21,
0x0C, 0x06, 0x1F, 0x21, 0x20, 0x1F, 0x20, 0x20, 0x20, 0x36, 0x01, 0x5D, 0x96, 0x95, 0xB1, 0x20,
0x70, 0x2F, 0x55, 0xA5, 0xA0, 0x5D, 0x3F, 0x3F, 0x51, 0x00, 0x8F, 0xB6, 0x6F, 0x2B, 0x1E, 0x58,
0x5D, 0x2B, 0x31, 0xD5, 0xA0, 0xB7, 0x22, 0xD6, 0x24, 0x19, 0x6D, 0xE7, 0x1E, 0x2A, 0x72, 0xB0,
0x0B, 0x77, 0x3E, 0x2B, 0x23, 0x24, 0x30, 0x47, 0x6F, 0x00, 0xAB, 0x9B, 0x24, 0xD0, 0x0C, 0x04,
0x1C, 0x4D, 0xE3, 0x08, 0x14, 0x9C, 0xD8, 0x21, 0x23, 0x20, 0x1E, 0x61, 0x92, 0x46, 0xDC, 0x39,
0x10, 0x27, 0x95, 0x95, 0x6F, 0x4D, 0x32, 0x9F, 0x1A, 0x1F, 0x2A, 0x22, 0x3B, 0x4A, 0x86, 0x26,
0x8D, 0x09, 0xA5, 0x12, 0x46, 0xEB, 0x80, 0xB0, 0x1C, 0x1E, 0x26, 0x2E, 0x36, 0x3A, 0x48, 0x29,
0x00, 0x1E, 0xC1, 0xB8, 0x4E, 0x46, 0x07, 0x30, 0x27, 0x26, 0x2E, 0x36, 0x1D, 0x4E, 0x23, 0x2B,
0x2B, 0x20, 0x50, 0x06, 0x4F, 0xBF, 0xC0, 0x10, 0xB9, 0x38, 0x10, 0x30, 0x1A, 0x19, 0x1C, 0x1E,
0x23, 0x04, 0x2A, 0xED, 0x03, 0x87, 0xC3, 0xF7, 0x36, 0xD1, 0x89, 0x34, 0x42, 0x41, 0xB0, 0x04,
0x08, 0x01, 0x71, 0x57, 0x15, 0x27, 0x37, 0x47, 0x48, 0x0F, 0x3E, 0x2B, 0x20, 0x11, 0x3E, 0x10,
0x26, 0x2F, 0x3A, 0x49, 0x0C, 0x69, 0xAC, 0x1B, 0x17, 0x43, 0xD8, 0x70, 0x0D, 0x31, 0xAC, 0x9F,
0x29, 0x74, 0x2D, 0xB1, 0x0B, 0x2E, 0x2E, 0x4D, 0x35, 0x2C, 0x18, 0x2A, 0x2B, 0x32, 0x28, 0xE0,
0x12, 0x1E, 0x20, 0x24, 0x2B, 0x36, 0x45, 0x02, 0x55, 0xA1, 0xD2, 0x3F, 0x30, 0x49, 0x27, 0xD1,
0xF9, 0x1B, 0x48, 0xF0, 0x5F, 0x78, 0xA4, 0xA5, 0xA6, 0xA4, 0xA4, 0xA5, 0x01, 0xA5, 0xA6, 0xA6,
0xA5, 0xA2, 0x19, 0x00, 0x1D, 0xB8, 0x00, 0xA0, 0x1C, 0x1C, 0x11, 0x05, 0x28, 0x32, 0x3D, 0x4E,
0x7B, 0x04, 0xC9, 0x10, 0x52, 0xFF, 0x42, 0x3D, 0x84, 0xB5, 0x53, 0x19, 0x49, 0x45, 0xB2, 0x28,
0x54, 0x6F, 0x72, 0x72, 0x72, 0x72, 0x73, 0x00, 0x79, 0x82, 0x9B, 0xBB, 0x8B, 0x99, 0x58, 0x21,
0x26, 0x20, 0x2F, 0x38, 0x4A, 0x68, 0xAD, 0xE1, 0x5C, 0x52, 0xDD, 0x40, 0xB1, 0x63, 0xD8, 0x0A,
0x1B, 0x19, 0x69, 0x9B, 0xF9, 0x97, 0x29, 0x64, 0x31, 0x71, 0x07, 0x38, 0x44, 0x62, 0xA5, 0xAD,
0x6E, 0x02, 0x37, 0x20, 0x69, 0x19, 0x1F, 0x24, 0x2B, 0x35, 0x42, 0x04, 0x54, 0x96, 0xD2, 0xA8,
0x52, 0xF8, 0xB4, 0x7D, 0x5E, 0x08, 0x4B, 0x37, 0x27, 0x20, 0xD0, 0x6C, 0x21, 0xD1, 0x29, 0xDE,
0x01, 0xD0, 0x19, 0x17, 0x6A, 0x23, 0x09, 0x28, 0x39, 0x78, 0xB6, 0x8F, 0x06, 0x45, 0x2F, 0x82,
0x10, 0x1E, 0x24, 0x30, 0x3C, 0x4C, 0x04, 0x79, 0xC0, 0xF4, 0x12, 0xD7, 0x25, 0x85, 0x00, 0x6A,
0x49, 0x35, 0x1C, 0x2B, 0x22, 0x20, 0xA9, 0x9F, 0x48, 0xE9, 0xE2, 0x20, 0x2C, 0x28, 0x4D, 0x9F,
0xAC, 0x67, 0x38, 0x25, 0x1E, 0x08, 0x2A, 0x80, 0x37, 0x50, 0xAB, 0x6C, 0x52, 0xF1, 0xCD, 0x9B,
0x0D, 0x01, 0x88, 0xE3, 0x4F, 0x2F, 0x1F, 0x80, 0x28, 0x19, 0xF6, 0xBE, 0x62, 0x26, 0x70, 0x37,
0x76, 0xB6, 0x8E, 0x41, 0x2E, 0x22, 0xB9, 0x40, 0x80, 0x51, 0x10, 0x51, 0xD3, 0x94, 0x6A, 0x63,
0x74, 0xA4, 0x02, 0x41, 0x00, 0x48, 0x55, 0x20, 0x09, 0xD5, 0xF0, 0x9F, 0x2C, 0x4E, 0xA1, 0x1D,
0xA7, 0x63, 0x3D, 0x2C, 0x25, 0x22, 0x21, 0x21, 0x00, 0x37, 0x03, 0x21, 0x3A, 0x64, 0xCF, 0x20,
0xD6, 0xAC, 0x7A, 0x11, 0x63, 0x4E, 0x40, 0x3F, 0x5A, 0xA3, 0x41, 0x20, 0xEB, 0x8F, 0xC0, 0x61,
0x22, 0x05, 0x09, 0x27, 0x19, 0x81, 0x2B, 0x6F, 0xB6, 0xA5, 0x0B, 0x7D, 0x72, 0x6A, 0x68, 0x68,
0x67, 0x68, 0x65, 0x00, 0x5D, 0x22, 0xB5, 0x23, 0x98, 0x25, 0xB5, 0x7D, 0x59, 0x42, 0x0C, 0x36,
0x37, 0x53, 0xA2, 0x85, 0x00, 0x45, 0xBA, 0x33, 0xA1, 0xA6, 0xD0, 0xE9, 0x92, 0x1E, 0x2F, 0x82,
0xAA, 0xAB, 0xA8, 0xA7, 0x01, 0xA7, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA2, 0x24, 0x00, 0x74, 0x04,
0x5D, 0xD1, 0x50, 0xDA, 0xA8, 0x60, 0x4D, 0x63, 0x05, 0x41, 0x00, 0xE1, 0x22, 0x02, 0xB8, 0xB2,
0x2D, 0x23, 0xA4, 0x86, 0x27, 0x39, 0x3D, 0x4A, 0x4A, 0x47, 0x46, 0x45, 0x46, 0x46, 0x46, 0x00,
0x46, 0x42, 0x35, 0x23, 0x79, 0x0C, 0x44, 0x65, 0x99, 0x10, 0xD5, 0xD1, 0x40, 0xF8, 0xD2, 0xAC,
0xA5, 0xFF, 0xFF, 0x02, 0xE2, 0x9A, 0x71, 0x21, 0x5F, 0x59, 0x8A, 0x98, 0x30, 0x25, 0x02, 0x10,
0x26, 0x5E, 0x24, 0x26, 0x25, 0x24, 0xB1, 0x12, 0x21, 0x2D, 0x3F, 0x10, 0x53, 0x65, 0x74, 0xB5,
0x69, 0x0F, 0x3B, 0x64, 0x5A, 0x39, 0x30, 0x29, 0x21, 0x3B, 0x44, 0x1B, 0x95, 0xF1, 0x89, 0xC5,
0xD0, 0x30, 0x25, 0x74, 0x2D, 0x39, 0x48, 0x59, 0x6C, 0x8F, 0xC5, 0xF1, 0x00, 0x44, 0x40, 0xF8,
0xCB, 0x83, 0x49, 0x39, 0x2B, 0xB3, 0x83, 0x81, 0x21, 0x33, 0xBD, 0x3C, 0xC7, 0xF0, 0x5E, 0x91,
0x29, 0x32, 0x40, 0x1C, 0x4F, 0x61, 0x72, 0xA4, 0xD6, 0x66, 0x12, 0x63, 0x22, 0xC3, 0x60, 0x74,
0x2E, 0x2C, 0x03, 0x35, 0xFC, 0x8C, 0x45, 0x42, 0x80, 0xB4, 0x84, 0x26, 0x7C, 0x2B, 0x37, 0x43,
0x55, 0x67, 0x82, 0xB5, 0xE3, 0x00, 0x69, 0x53, 0x3C, 0xF8, 0x70, 0x21, 0x3D, 0x44, 0x69, 0x9B,
0x64, 0x7D, 0x28, 0x94, 0xF5, 0x21, 0x27, 0x2F, 0x3B, 0x49, 0x5B, 0x6E, 0x8E, 0x00, 0xCD, 0xF2,
0x1B, 0x22, 0x46, 0x85, 0x50, 0x2D, 0x13, 0xF9, 0xE3, 0x30, 0xD4, 0xF4, 0x88, 0x62, 0x20, 0x22,
0x2A, 0x33, 0x40, 0x50, 0x62, 0x01, 0x74, 0xAC, 0xD5, 0x0D, 0x21, 0xC9, 0x80, 0x95, 0xC1, 0x25,
0x37, 0x25, 0x78, 0x29, 0x28, 0x29, 0x28, 0x27, 0x00, 0x13, 0x1F, 0x21, 0x20, 0x21, 0x20, 0x1D,
0xD7, 0x5B, 0x1E, 0x1E, 0x25, 0x2D, 0x08, 0x37, 0x45, 0x57, 0x6C, 0x86, 0xB5, 0xE7, 0x45, 0x00,
0x82, 0x22, 0x45, 0x9D, 0x24, 0xCB, 0x51, 0x82, 0x88, 0x76, 0x0C, 0x86, 0x47, 0x82, 0x23, 0x94,
0x06, 0x2F, 0x6C, 0x2E, 0x25, 0x2F, 0x82, 0x84, 0x1E, 0x21, 0x2A, 0x38, 0x4F, 0x6B, 0x7F, 0xCE,
0x00, 0x3F, 0x25, 0x9B, 0xA1, 0x16, 0x0D, 0x72, 0x3D, 0x24, 0x56, 0xAF, 0x93, 0x1E, 0x76, 0x6B,
0x6B, 0x6A, 0x69, 0x60, 0x24, 0x01, 0x0E, 0x80, 0x43, 0xF6, 0x87, 0x3B, 0x28, 0x1E, 0x1D, 0x97,
0x40, 0x80, 0xC5, 0x10, 0x39, 0x55, 0x9E, 0xF1, 0xB5, 0x93, 0x22, 0x59, 0xFA, 0xA1, 0x1F, 0x32,
0x84, 0x80, 0x42, 0x34, 0xC9, 0x10, 0x25, 0x40, 0xB4, 0x06, 0x38, 0x1C, 0x05, 0xA8, 0x42, 0x2B,
0x21, 0x3E, 0x56, 0x85, 0x22, 0x2B, 0x3E, 0x5A, 0xC2, 0x41, 0x20, 0xF1, 0x7B, 0x59, 0x6A, 0xE0,
0x76, 0x8D, 0x8A, 0x68, 0x2A, 0x39, 0x02, 0x20, 0x1E, 0x1C, 0x11, 0x2D, 0x03, 0x3C, 0x69, 0x0F,
0x00, 0xCD, 0x46, 0x2E, 0xC8, 0x3F, 0x89, 0x1E, 0x25, 0x32, 0x49, 0x7F, 0x4A, 0x21, 0x49, 0x29,
0x20, 0xA5, 0xC2, 0x81, 0xA4, 0x1F, 0x30, 0x6B, 0x88, 0x2D, 0x1E, 0x03, 0xBD, 0x5D, 0x3A, 0xD8,
0x14, 0xFF, 0xE0, 0x5C, 0x30, 0x23, 0x05, 0x1D, 0x47, 0x02, 0x28, 0x3A, 0x55, 0xB9, 0x82, 0x20,
0xF1, 0x42, 0x40, 0x25, 0xF9, 0xA3, 0x3B, 0x25, 0xCB, 0x28, 0x45, 0x9A, 0x14, 0x83, 0x43, 0x2F,
0x2E, 0x2F, 0x2D, 0x26, 0x1D, 0x02, 0x80, 0x33, 0x59, 0x90, 0x20, 0xE9, 0x6E, 0x34, 0x26, 0x1F,
0x04, 0x22, 0x2F, 0x44, 0x70, 0xDB, 0x82, 0x20, 0xCB, 0x65, 0x20, 0x35, 0x21, 0x85, 0xB0, 0x28,
0x62, 0xB2, 0x27, 0x47, 0x9A, 0x14, 0xBC, 0xA6, 0xA5, 0xA4, 0xA4, 0xA3, 0xA0, 0x24, 0x00, 0xCC,
0x00, 0x42, 0x68, 0xB4, 0x09, 0x20, 0x82, 0x3D, 0x34, 0x11, 0x3A, 0x51, 0x9A, 0x37, 0x20, 0xF8,
0xA9, 0x57, 0x3A, 0x08, 0x27, 0x1E, 0xA5, 0x82, 0x15, 0xBA, 0xEF, 0x2B, 0x75, 0xA2, 0x55, 0x1C,
0x47, 0x43, 0x43, 0x42, 0x3E, 0x32, 0x22, 0xCE, 0x01, 0x80, 0x2C, 0x45, 0x67, 0x9B, 0x57, 0x11,
0xFF, 0xAB, 0x59, 0x10, 0x72, 0xCC, 0x7F, 0x20, 0xDC, 0x78, 0x4C, 0x34, 0xAE, 0x40, 0x84, 0xE9,
0xF2, 0xDB, 0x3B, 0x1F, 0x36, 0x8B, 0x6C, 0x30, 0x26, 0x03, 0x26, 0x24, 0x24, 0x24, 0x22, 0x17,
0x10, 0x22, 0x2B, 0x20, 0x3F, 0x5F, 0x8F, 0xEA, 0x03, 0x10, 0xD4, 0xE9, 0x3C, 0x10, 0x90, 0xF9,
0xBB, 0x5D, 0x41, 0x2E, 0xC7, 0x9A, 0x19, 0x22, 0x20, 0xE9, 0x12, 0x85, 0x10, 0x76, 0x9D, 0x79,
0x6F, 0xEF, 0x8C, 0x77, 0x03, 0x3B, 0x67, 0x59, 0x83, 0xDD, 0x4B, 0x51, 0xE3, 0x86, 0x50, 0x37,
0x08, 0x29, 0xF4, 0x4D, 0x1C, 0x6E, 0x33, 0x22, 0x19, 0x06, 0x25, 0x4B, 0xB2, 0x67, 0xEA, 0x2E,
0x51, 0x98, 0x47, 0x31, 0x2F, 0x2F, 0x30, 0x00, 0x2D, 0x26, 0x28, 0x3A, 0x1F, 0x27, 0x37, 0x52,
0x74, 0x04, 0xCD, 0x06, 0x31, 0xC4, 0x66, 0x45, 0xEA, 0x06, 0xFD, 0xC2, 0x19, 0x26, 0xE2, 0x71,
0xB3, 0x2C, 0x6E, 0xA3, 0xB6, 0xA6, 0xA6, 0xA4, 0x01, 0xA6, 0xA4, 0xA1, 0xAE, 0x02, 0x5D, 0x09,
0x20, 0x21, 0x28, 0x18, 0x35, 0x50, 0x70, 0xB5, 0xC1, 0x10, 0xEA, 0x83, 0x51, 0x10, 0x34, 0x26,
0xC0, 0x0C, 0x57, 0x03, 0x79, 0x8B, 0xF5, 0x37, 0x61, 0x53, 0x1A, 0x7C, 0xC1, 0x01, 0x1D, 0x28,
0x55, 0x73, 0x77, 0x74, 0x71, 0x01, 0x71, 0x73, 0x71, 0x65, 0x24, 0x1B, 0x1C, 0x1F, 0x00, 0x26,
0x2C, 0x30, 0x33, 0x35, 0x39, 0x47, 0x5E, 0x00, 0x7B, 0x9C, 0x42, 0x20, 0x69, 0x41, 0x36, 0x24,
0x00, 0x2F, 0x44, 0x27, 0x68, 0x10, 0x49, 0x99, 0x6D, 0xC7, 0x1F, 0x26, 0x32, 0x34, 0x0E, 0x33,
0x3C, 0x04, 0x32, 0xB1, 0x01, 0x1E, 0x29, 0x39, 0x86, 0x0A, 0x8E, 0x90, 0x90, 0x90, 0x94, 0x9A,
0xA3, 0xA4, 0x00, 0xAD, 0xC4, 0x04, 0xFF, 0xEA, 0x98, 0x92, 0x8F, 0x91, 0x02, 0x8F, 0x8A, 0x80,
0x2B, 0x1F, 0xCE, 0x00, 0xE9, 0xF2, 0x3A, 0x84, 0xE0, 0x25, 0x27, 0x2A, 0x28, 0x25, 0x62, 0x0B,
0xB1, 0x07, 0x51, 0x60, 0x41, 0xF0, 0xFF, 0xC6, 0x21, 0x97, 0x20, 0x15, 0x5A, 0xE5, 0x56, 0xCC,
0x7A, 0x2B, 0x7D, 0x45, 0x79, 0x89, 0x87, 0x6E, 0x2C, 0x75, 0x0C, 0x21, 0x40, 0x39, 0x63, 0x01,
0x10, 0x3D, 0xF0, 0x44, 0x28, 0x69, 0xBB, 0x28, 0x4C, 0x35, 0xC9, 0x31, 0x7B, 0xB1, 0x94, 0x8E,
0x8E, 0x9A, 0x01, 0xB0, 0x56, 0xA8, 0x01, 0x39, 0x62, 0x01, 0x10, 0x39, 0xF4, 0x45, 0x64, 0x27,
0x1B, 0xA1, 0x76, 0x46, 0xDB, 0x59, 0x1A, 0x2B, 0x93, 0x28, 0x64, 0x57, 0xAB, 0x56, 0x40, 0x3D,
0x3F, 0x4B, 0x6C, 0x00, 0xA3, 0x2A, 0x1D, 0x20, 0x30, 0x4E, 0xC1, 0x05, 0x10, 0x80, 0xC5, 0xC5,
0xC5, 0xC5, 0xC4, 0xC5, 0xC6, 0x00, 0x00, 0x80, 0xC5, 0xC6, 0xC5, 0xC4, 0xC4, 0xC2, 0xB9, 0x39,
0x00, 0x0D, 0x91, 0x4D, 0x15, 0x50, 0x85, 0x56, 0x1A, 0x83, 0x7C, 0x33, 0x24, 0x0F, 0x25, 0x24,
0x2F, 0x48, 0x98, 0x56, 0x1E, 0x1E, 0x00, 0x29, 0x38, 0x4B, 0x59, 0x5B, 0x59, 0x01, 0x00, 0x03,
0x00, 0xC0, 0x5A, 0x5B, 0x59, 0x5A, 0x5A, 0x5B, 0x5B, 0x5B, 0x00, 0x5C, 0x5D, 0x53, 0x41, 0x2D,
0x1F, 0x1B, 0x1A, 0x00, 0x91, 0xB5, 0x6A, 0xA8, 0x37, 0x8A, 0x66, 0x24, 0x33, 0x00, 0x24, 0x43,
0x40, 0x8C, 0x62, 0x4B, 0x00, 0x30, 0x3D, 0x41, 0x3F, 0x08, 0x39, 0x33, 0x30, 0x30, 0x31, 0x32,
0x31, 0x32, 0x00, 0x30, 0x32, 0x30, 0x32, 0x32, 0x31, 0x38, 0x40, 0x00, 0x48, 0x46, 0x38, 0x29,
0x1F, 0x99, 0x80, 0x51, 0x51, 0x8E, 0x86, 0xE0, 0x74, 0x8F, 0x2E, 0x1E, 0x1D, 0x1E, 0x2B, 0x47,
0x00, 0xAB, 0x41, 0x20, 0x1F, 0x29, 0x3A, 0x87, 0x87, 0x00, 0x81, 0x2F, 0x24, 0xE1, 0x07, 0x24,
0x26, 0x27, 0x26, 0x08, 0x22, 0x8C, 0x02, 0x21, 0x2E, 0x41, 0xB7, 0xB8, 0xB3, 0x02, 0x32, 0x22,
0x9B, 0x50, 0x0D, 0x31, 0x29, 0x8E, 0x20, 0x18, 0x52, 0x1D, 0x6C, 0x2B, 0x45, 0xA5, 0x89, 0x45,
0x37, 0x3B, 0x59, 0x00, 0x9E, 0x8A, 0x2B, 0x1B, 0x8E, 0x00, 0x10, 0x00, 0x3B, 0x26, 0x30, 0x05,
0x02, 0x2B, 0x36, 0x39, 0x35, 0x28, 0x1F, 0x2E, 0x12, 0x81, 0x59, 0x2E, 0x00, 0x3F, 0x24, 0x5D,
0x86, 0x45, 0x51, 0x51, 0x81, 0x81, 0xD2, 0x55, 0x8D, 0xB0, 0xBC, 0xBC, 0xAC, 0x7D, 0xE5, 0x06,
0x80, 0x22, 0xC1, 0x28, 0x48, 0x28, 0x1B, 0x1E, 0x28, 0x3F, 0x02, 0xC0, 0xDE, 0xDD, 0x70, 0x27,
0x85, 0x00, 0x3B, 0x68, 0x20, 0x2E, 0x00, 0x49, 0x58, 0x19, 0x1A, 0x84, 0x43, 0xD9, 0x21, 0x42,
0xBA, 0x9D, 0x05, 0xF5, 0x4B, 0x4F, 0x4D, 0x42, 0x31, 0x24, 0x4A, 0x09, 0x3E, 0x40, 0x20, 0x11,
0x4D, 0x28, 0x1C, 0x1E, 0x31, 0x53, 0x41, 0x00, 0x81, 0x87, 0x2E, 0x51, 0x01, 0x3E, 0x6E, 0xB6,
0x10, 0x50, 0x10, 0x1A, 0x64, 0x71, 0x43, 0x48, 0xB5, 0x13, 0x81, 0xA4, 0xE9, 0x06, 0x24, 0x25,
0x45, 0x17, 0x9D, 0x1F, 0x1E, 0x1D, 0x23, 0x3F, 0x10, 0x20, 0x2A, 0x1C, 0x20, 0x20, 0x36, 0x61,
0x41, 0x00, 0x8F, 0x30, 0x1F, 0x1B, 0x08, 0x21, 0x82, 0x21, 0x4F, 0x2B, 0x1C, 0x1A, 0xD5, 0xF5,
0x1B, 0x42, 0x1D, 0x62, 0x5D, 0x41, 0x9B, 0x01, 0x19, 0x1E, 0x27, 0x5D, 0x09, 0x4F, 0x1E, 0x21,
0x41, 0x10, 0x30, 0x19, 0x06, 0xC9, 0x20, 0x34, 0x70, 0xC6, 0x01, 0x3F, 0x72, 0x30, 0xA5, 0x82,
0xC5, 0x04, 0x28, 0xCE, 0x40, 0x4B, 0x39, 0xDD, 0x2E, 0x41, 0x8B, 0x69, 0x34, 0x2F, 0x2F, 0x2F,
0x00, 0x34, 0x41, 0x8F, 0x5F, 0x20, 0x98, 0x30, 0x4E, 0x29, 0x20, 0x1B, 0x20, 0xD5, 0x35, 0x33,
0x1F, 0x1B, 0x23, 0x2E, 0x20, 0x84, 0x50, 0x2A, 0x1D, 0x72, 0x6D, 0xA7, 0xFE, 0x27, 0x90, 0xA8,
0xB2, 0x1C, 0xAC, 0xA5, 0xA5, 0xA5, 0xA5, 0xA7, 0xA7, 0xAB, 0x00, 0x3D, 0x1F, 0x22, 0x54, 0x40,
0xAC, 0x03, 0x67, 0x91, 0x45, 0x21, 0x58, 0x2E, 0x50, 0x41, 0xB0, 0xC7, 0x84, 0x1E, 0x2E, 0x63,
0x7C, 0xA0, 0x07, 0x8F, 0x75, 0x73, 0x73, 0x73, 0x72, 0x70, 0x3E, 0x00, 0x27, 0x1B, 0x23, 0x40,
0x6F, 0x10, 0x20, 0x09, 0x05, 0x65, 0x60, 0xC5, 0x14, 0x31, 0x1E, 0xB6, 0x10, 0x41, 0x20, 0x19,
0x1B, 0x95, 0x91, 0x99, 0xF9, 0x03, 0xEA, 0x72, 0x22, 0x2F, 0x43, 0x7C, 0x61, 0x37, 0x03, 0x32,
0x33, 0x33, 0x31, 0x2D, 0x24, 0x1E, 0xC9, 0x40, 0x80, 0x57, 0x34, 0x25, 0x2B, 0x41, 0x6D, 0x41,
0x00, 0x94, 0x40, 0x3D, 0x28, 0x27, 0x2E, 0x49, 0x73, 0x85, 0x20, 0x64, 0x71, 0xC0, 0x29, 0x27,
0xCC, 0x60, 0xA0, 0x25, 0x29, 0x2D, 0x28, 0x20, 0x1E, 0x07, 0x1E, 0x1F, 0x1E, 0x16, 0x04, 0x85,
0x00, 0x71, 0x10, 0x00, 0x6D, 0x58, 0x53, 0x44, 0x4A, 0x5D, 0x7A, 0x4A, 0x00, 0xA0, 0x58, 0x20,
0x48, 0x45, 0x4B, 0x63, 0x7C, 0x85, 0x20, 0x38, 0x58, 0x95, 0x31, 0xE0, 0x29, 0x83, 0x64, 0x70,
0x53, 0x23, 0x78, 0x03, 0x28, 0x12, 0x16, 0x21, 0x56, 0x40, 0x70, 0x10, 0x00, 0x07, 0x00, 0xE1,
0xE3, 0xE3, 0xF8, 0x0C, 0xFF, 0xFF, 0xEB, 0xE3, 0xCC, 0x15, 0xE3, 0x41, 0x10, 0x2A, 0x50, 0x65,
0x51, 0x0D, 0x11, 0x71, 0x03, 0x29, 0xB4, 0x1E, 0x2C, 0x4E, 0x81, 0x0F, 0x26, 0x2D, 0x5D, 0x96,
0x8E, 0x3B, 0x1F, 0x1B, 0x00, 0x22, 0x40, 0x6F, 0x01, 0x10, 0x3D, 0xF0, 0x4F, 0x29, 0x54, 0x30,
0x98, 0x1A, 0x85, 0x20, 0xDA, 0x95, 0x11, 0x19, 0x82, 0x70, 0x1E, 0x26, 0x2A, 0x4B, 0xAE, 0x78,
0x2F, 0x4C, 0xAF, 0x84, 0x88, 0x00, 0xA3, 0x28, 0x1C, 0x21, 0x3E, 0x6A, 0x01, 0x10, 0x3D, 0xF0,
0xC0, 0x4B, 0x1C, 0x51, 0x1C, 0x98, 0x00, 0xB5, 0x93, 0x1A, 0xFA, 0x23, 0x30, 0x5A, 0x7D, 0x85,
0x38, 0x37, 0x7C, 0x8D, 0x49, 0x4E, 0x00, 0x98, 0x54, 0x1E, 0x1F, 0x36, 0xD5, 0x55, 0x4D, 0xF5,
0x19, 0x60, 0xA5, 0x62, 0xD9, 0x11, 0x58, 0xA7, 0x20, 0x36, 0x89, 0x68, 0x2F, 0x07, 0x3F, 0x9F,
0x5F, 0x2F, 0x40, 0x8B, 0x62, 0x20, 0x00, 0x20, 0x2B, 0x43, 0x5D, 0x6B, 0x04, 0x00, 0xDA, 0x35,
0xD0, 0x15, 0xE0, 0x86, 0x06, 0x71, 0x6E, 0xD5, 0x05, 0xC5, 0x84, 0x33, 0x48, 0xDC, 0x19, 0xF9,
0x53, 0x1A, 0xB2, 0x54, 0x7C, 0x79, 0x3C, 0x56, 0xB0, 0x05, 0x37, 0x2B, 0x43, 0x97, 0x4D, 0x21,
0x1C, 0x21, 0x00, 0x2A, 0x36, 0x3C, 0x09, 0x30, 0x41, 0x3F, 0xD2, 0x75, 0x3A, 0x48, 0x31, 0x85,
0xB0, 0x95, 0x01, 0x00, 0x97, 0x1C, 0x1E, 0x2B, 0x50, 0x0E, 0xAB, 0x8E, 0xA1, 0x8A, 0x31, 0x43,
0x86, 0xA4, 0x00, 0x2E, 0x1D, 0xE7, 0x04, 0x27, 0x29, 0x2D, 0x02, 0x03, 0x10, 0x2A, 0x64, 0x00,
0x00, 0x2A, 0x28, 0x10, 0x12, 0x28, 0x28, 0x22, 0x9D, 0x42, 0x89, 0xE9, 0x72, 0x1C, 0x86, 0xA6,
0x23, 0x36, 0x55, 0x86, 0x7D, 0x05, 0x37, 0x2D, 0x5B, 0x97, 0x47, 0x6D, 0x01, 0x21, 0x29, 0x20,
0x35, 0x3A, 0x3C, 0x3D, 0x3A, 0x3B, 0x3C, 0x3D, 0x00, 0x3C, 0x3B, 0x03, 0x10, 0x3C, 0x3C, 0x3C,
0x3C, 0x3B, 0x04, 0x3B, 0x37, 0x2E, 0x4D, 0x95, 0x34, 0x45, 0xC5, 0x04, 0x0E, 0x31, 0xC8, 0x43,
0x50, 0x1E, 0x22, 0x2E, 0x33, 0x2E, 0x24, 0x22, 0x01, 0x2E, 0x31, 0x27, 0x1E, 0x1B, 0x20, 0x2B,
0x40, 0x00, 0xB7, 0xBB, 0x02, 0x20, 0x03, 0x30, 0x00, 0x00, 0xBE, 0xBE, 0xBE, 0x1C, 0xBD, 0xBA,
0xB3, 0x31, 0x22, 0xC9, 0x80, 0x41, 0x10, 0x1C, 0x60, 0x1C, 0xFA, 0xB5, 0x1F, 0x21, 0x1E, 0x10,
0x15, 0xAE, 0x13, 0x34, 0x62, 0x57, 0x01, 0x10, 0x3D, 0xF0, 0x3E, 0x25, 0x1B, 0x1C, 0x51, 0x81,
0x86, 0x39, 0x29, 0x95, 0xB1, 0x21, 0x2B, 0x35, 0x36, 0x36, 0x04, 0x36, 0x35, 0x34, 0x31, 0x29,
0x20, 0x6A, 0x02, 0x65, 0x40, 0x01, 0x10, 0x3D, 0xF0, 0x48, 0x27, 0x09, 0x44, 0x1D, 0x52, 0x1E,
0xB2, 0x2B, 0x73, 0x88, 0xBA, 0xBB, 0xBA, 0xBC, 0xBA, 0xBA, 0xBC, 0x00, 0xA1, 0x24, 0x1B, 0x22,
0x38, 0x5F, 0x01, 0x10, 0x29, 0xF3, 0xC0, 0x43, 0x0C, 0x20, 0xD9, 0x71, 0x27, 0x3D, 0xA1, 0x1D,
0x29, 0x3D, 0x16, 0x4B, 0x51, 0x51, 0x51, 0x53, 0x5A, 0x7B, 0x92, 0x00, 0x2B, 0x1B, 0x20, 0x30,
0x49, 0x96, 0x9E, 0xA2, 0x00, 0xA2, 0xA2, 0xA2, 0xA2, 0xA5, 0xA5, 0xEA, 0xFF, 0x00, 0xFF, 0xBE,
0xA4, 0xA3, 0xA2, 0xA2, 0xA1, 0xA3, 0x00, 0xA0, 0x9A, 0x8A, 0x37, 0x24, 0xF9, 0x72, 0x35, 0x46,
0x20, 0xDB, 0x3B, 0x29, 0x1B, 0x1C, 0xF8, 0x80, 0x1D, 0x1F, 0x20, 0x22, 0x27, 0x27, 0x27, 0x28,
0x2A, 0x34, 0x4A, 0x00, 0x97, 0x4A, 0x1E, 0x1E, 0x24, 0x31, 0x40, 0x49, 0x00, 0x0B, 0x00, 0x4D,
0x51, 0x63, 0x7C, 0x41, 0x00, 0xA2, 0x60, 0x21, 0x50, 0x4C, 0x4D, 0x4D, 0x4D, 0x4C, 0x43, 0x37,
0x00, 0x28, 0x82, 0x70, 0x21, 0x33, 0x46, 0xA5, 0x02, 0x7D, 0xC1, 0xE9, 0x42, 0xE2, 0x3E, 0x8A,
0x62, 0x1F, 0x1B, 0x1D, 0x21, 0x26, 0x00, 0x27, 0x28, 0x29, 0x29, 0x2A, 0x2F, 0x45, 0x6E, 0x00,
0x41, 0x00, 0x96, 0x40, 0x2D, 0x2A, 0x29, 0x2A, 0x29, 0x01, 0x28, 0x20, 0x04, 0x1D, 0x41, 0xB0,
0x27, 0x1F, 0x14, 0x3D, 0x81, 0x24, 0x6A, 0x26, 0x29, 0x27, 0x29, 0x2B, 0x33, 0x4A, 0xA5, 0x00,
0x4D, 0x1E, 0x16, 0x24, 0x1E, 0x1E, 0x1C, 0x1E, 0x23, 0x04, 0x3A, 0x69, 0x41, 0x10, 0x35, 0x20,
0x1D, 0x1D, 0x1D, 0x04, 0x1D, 0x1D, 0xF1, 0x10, 0x2D, 0x83, 0xC9, 0xE0, 0x1D, 0x24, 0x60, 0x1C,
0x86, 0x87, 0x87, 0x88, 0x89, 0x98, 0xAF, 0x8A, 0x00, 0x2E, 0xF4, 0x73, 0x20, 0x3A, 0xC9, 0x40,
0x1C, 0x5F, 0xE3, 0x22, 0x52, 0x41, 0x10, 0x27, 0x2D, 0xA0, 0x1E, 0x24, 0x4E, 0x67, 0x6A, 0x05,
0x6A, 0x6B, 0x6D, 0x6F, 0x59, 0x34, 0x22, 0xD1, 0x83, 0x80, 0x39, 0x85, 0x20, 0x32, 0x20, 0x18,
0x60, 0x1D, 0xA2, 0x3B, 0x28, 0x32, 0x0B, 0xA3, 0x1C, 0x20, 0x27, 0x2D, 0x2F, 0x2E, 0x2E, 0x01,
0x31, 0x2E, 0x28, 0x21, 0x42, 0x83, 0x21, 0x3A, 0x41, 0x10, 0x90, 0x91, 0x33, 0x20, 0xA7, 0x83,
0x19, 0x85, 0x40, 0x41, 0x60, 0x19, 0x82, 0xE8, 0x20, 0x1F, 0x20, 0x1E, 0x1F, 0x21, 0x1F, 0x1C,
0x00, 0x45, 0x93, 0x20, 0x38, 0x66, 0x85, 0x00, 0x90, 0x33, 0x26, 0x62, 0x91, 0xD9, 0x80, 0x95,
0x01, 0x3A, 0x85, 0x20, 0x1C, 0x81, 0x41, 0x20, 0x27, 0x2B, 0x32, 0x56, 0x35, 0x1D, 0x1D, 0x24,
0x49, 0x4A, 0x00, 0x28, 0x20, 0x1B, 0x1D, 0x12, 0x23, 0x26, 0x26, 0x26, 0x08, 0x26, 0x27, 0x2A,
0x3F, 0x6C, 0xE2, 0xFF, 0xFF, 0x00, 0x94, 0x3E, 0x28, 0x25, 0x26, 0x27, 0x27, 0x26, 0x00, 0x24,
0x21, 0x1E, 0xE8, 0x10, 0x1C, 0xD9, 0x71, 0x1D, 0x22, 0x1C, 0x68, 0x3A, 0x32, 0x1E, 0x2D, 0x61,
0xB1, 0xA8, 0x51, 0x1E, 0x01, 0x1D, 0x2B, 0x77, 0xAF, 0xA3, 0x3D, 0x20, 0x1B, 0x00, 0x1D, 0x22,
0x2E, 0x3A, 0x41, 0x45, 0x45, 0x45, 0x00, 0x46, 0x48, 0x5C, 0x79, 0xE3, 0xFF, 0xFF, 0xA1, 0x00,
0x5A, 0x49, 0x45, 0x44, 0x45, 0x45, 0x43, 0x3E, 0x00, 0x33, 0x26, 0x20, 0x1B, 0x1C, 0x0D, 0x61,
0xC9, 0x00, 0x41, 0x80, 0xE0, 0x1C, 0x26, 0x4D, 0xB1, 0x71, 0x3D, 0x27, 0x1C, 0x00, 0x1D, 0x26,
0x39, 0x4E, 0x81, 0x9B, 0x27, 0x1B, 0x00, 0x1F, 0x2E, 0x47, 0xDE, 0xE0, 0xE2, 0xE2, 0x07, 0x10,
0x80, 0xE3, 0xF7, 0xFF, 0xFF, 0xEA, 0xE3, 0xE2, 0xE2, 0x00, 0xE2, 0xE3, 0xE2, 0xE1, 0xE0, 0xDD,
0x34, 0x21, 0x00, 0x41, 0x90, 0xDA, 0x41, 0x90, 0x20, 0x2F, 0x7E, 0x8B, 0x38, 0x05, 0x25, 0x1E,
0x49, 0x12, 0x32, 0x4B, 0x9D, 0x3D, 0x1D, 0x04, 0x1F, 0x37, 0x5D, 0x03, 0x30, 0x85, 0xF0, 0x1E,
0x72, 0x35, 0x85, 0x00, 0xB8, 0x28, 0xC9, 0x70, 0x22, 0x37, 0x8B, 0x68, 0x27, 0xDE, 0x31, 0x82,
0x26, 0x3F, 0x8A, 0x61, 0x21, 0x21, 0x3B, 0x66, 0x00, 0x01, 0x10, 0x3D, 0xF0, 0x47, 0x28, 0x92,
0x61, 0xC9, 0x00, 0xDA, 0x3B, 0x33, 0x27, 0x1C, 0xF3, 0x61, 0x21, 0x38, 0x8B, 0x71, 0x25, 0x04,
0x76, 0x30, 0x24, 0x3C, 0x91, 0x62, 0x21, 0x1F, 0x35, 0x01, 0x5B, 0x07, 0x70, 0x03, 0x30, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0x41, 0x0E, 0x25, 0xD9, 0x60, 0x21, 0x34, 0x47, 0xDB, 0x39, 0x27, 0x02,
0xA6, 0x71, 0x1F, 0x31, 0x65, 0xA4, 0x32, 0x20, 0x55, 0x11, 0x81, 0x20, 0x2E, 0x55, 0xAA, 0x34,
0x1E, 0x1E, 0x2C, 0x00, 0x42, 0x5C, 0x6A, 0x01, 0x00, 0x71, 0x6F, 0x03, 0x10, 0x70, 0x48, 0x00,
0x00, 0x70, 0x70, 0x6F, 0x6F, 0x6D, 0x63, 0x4C, 0x01, 0x32, 0xAC, 0x20, 0x1C, 0x41, 0x30, 0x48,
0xDB, 0x3A, 0x26, 0x0A, 0x32, 0x50, 0xFD, 0x10, 0x42, 0x92, 0x9D, 0x52, 0x33, 0x2F, 0x03, 0x2F,
0x32, 0x3A, 0x6C, 0xAB, 0x72, 0x29, 0x1D, 0x00, 0x1B, 0x21, 0x2B, 0x36, 0x3D, 0x40, 0x3F, 0x05,
0x40, 0x80, 0x41, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x3F, 0x39, 0x02, 0x30, 0x24, 0x40, 0x70,
0x21, 0x35, 0x47, 0xDC, 0x3A, 0x04, 0x29, 0x65, 0x80, 0x20, 0x2D, 0x46, 0x81, 0xB0, 0xB0, 0x02,
0xA4, 0xA5, 0xA6, 0xB6, 0xA6, 0x6B, 0x32, 0x20, 0x00, 0x1B, 0x1B, 0x1D, 0x20, 0x20, 0x21, 0x22,
0x0B, 0x10, 0x80, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x23, 0x22, 0x00, 0x21, 0x23, 0x23, 0x21,
0x22, 0x21, 0x1E, 0x1E, 0x00, 0x25, 0x70, 0x20, 0x32, 0x45, 0xDA, 0x37, 0x27, 0x62, 0x30, 0x81,
0x8A, 0x30, 0x1F, 0x2B, 0x3C, 0x4A, 0x59, 0x71, 0x71, 0x01, 0x70, 0x4B, 0x3E, 0x2E, 0x21, 0x0A,
0x90, 0x1A, 0x04, 0x40, 0xA0, 0x6E, 0xF0, 0x21, 0x2E, 0x3B, 0xDC, 0x32, 0x24, 0x1B, 0x40, 0x81,
0x1A, 0x0C, 0x20, 0x1E, 0x23, 0x27, 0x2D, 0x32, 0x30, 0x02, 0x2E, 0x28, 0x24, 0x1E, 0x55, 0xC0,
0x19, 0x7A, 0x20, 0x19, 0x50, 0x45, 0xA0, 0x1C, 0x37, 0x00, 0x1E, 0x27, 0x2D, 0x30, 0x29, 0x05,
0x1F, 0x12, 0xC0, 0x73, 0x00, 0x1E, 0x1F, 0x2C, 0x80, 0x22, 0xF0, 0x53, 0xB0, 0xE6, 0x1F, 0x24,
0x24, 0x21, 0x1D, 0x1C, 0xF0, 0x1C, 0x1B, 0x80, 0xA0, 0x19, 0x02, 0x20, 0x1D, 0xF0, 0x0A, 0x60,
0x1C, 0x1C, 0x1C, 0x1D, 0x0E, 0x1C, 0x0A, 0xA0, 0x1B, 0x03, 0x30, 0x00, 0x00, 0x1B, 0x1B, 0x1B,
0x1A, 0xFF, 0xFF, 0xFF, 0x30, 0x1A, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xD0, 0x18, 0x00, 0x00
};
#endif

204
bootloader/gfx/tui.c Normal file
View File

@@ -0,0 +1,204 @@
/*
* Copyright (c) 2018 naehrwert
* Copyright (c) 2018 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "tui.h"
#include "../utils/btn.h"
#include "../config/config.h"
#include "../power/max17050.h"
#include "../utils/util.h"
#ifdef MENU_LOGO_ENABLE
extern u8 *Kc_MENU_LOGO;
#define X_MENU_LOGO 119
#define Y_MENU_LOGO 57
#define X_POS_MENU_LOGO 577
#define Y_POS_MENU_LOGO 1179
#endif //MENU_LOGO_ENABLE
extern hekate_config h_cfg;
void tui_sbar(gfx_con_t *con, int force_update)
{
u32 timePassed = get_tmr_s() - h_cfg.sbar_time_keeping;
if (!force_update)
if (timePassed < 5)
return;
u8 prevFontSize = con->fntsz;
con->fntsz = 16;
h_cfg.sbar_time_keeping = get_tmr_s();
u32 battPercent = 0;
int battVoltCurr = 0;
gfx_con_getpos(con, &con->savedx, &con->savedy);
gfx_con_setpos(con, 0, 1260);
max17050_get_property(MAX17050_RepSOC, (int *)&battPercent);
max17050_get_property(MAX17050_VCELL, &battVoltCurr);
gfx_clear_partial_grey(con->gfx_ctxt, 0x30, 1256, 24);
gfx_printf(con, "%K%k Battery: %d.%d%% (%d mV) - Charge:", 0xFF303030, 0xFF888888,
(battPercent >> 8) & 0xFF, (battPercent & 0xFF) / 26, battVoltCurr);
max17050_get_property(MAX17050_AvgCurrent, &battVoltCurr);
if (battVoltCurr >= 0)
gfx_printf(con, " %k+%d mA %k%K\n",
0xFF008800, battVoltCurr / 1000, 0xFFCCCCCC, 0xFF1B1B1B);
else
gfx_printf(con, " %k-%d mA %k%K\n",
0xFF880000, (~battVoltCurr) / 1000, 0xFFCCCCCC, 0xFF1B1B1B);
con->fntsz = prevFontSize;
gfx_con_setpos(con, con->savedx, con->savedy);
}
void tui_pbar(gfx_con_t *con, int x, int y, u32 val, u32 fgcol, u32 bgcol)
{
u32 cx, cy;
if (val > 200)
val = 200;
gfx_con_getpos(con, &cx, &cy);
gfx_con_setpos(con, x, y);
gfx_printf(con, "%k[%3d%%]%k", fgcol, val, 0xFFCCCCCC);
x += 7 * con->fntsz;
for (int i = 0; i < (con->fntsz >> 3) * 6; i++)
{
gfx_line(con->gfx_ctxt, x, y + i + 1, x + 3 * val, y + i + 1, fgcol);
gfx_line(con->gfx_ctxt, x + 3 * val, y + i + 1, x + 3 * 100, y + i + 1, bgcol);
}
gfx_con_setpos(con, cx, cy);
// Update status bar.
tui_sbar(con, 0);
}
void *tui_do_menu(gfx_con_t *con, menu_t *menu)
{
int idx = 0, prev_idx = 0, cnt = 0x7FFFFFFF;
gfx_clear_partial_grey(con->gfx_ctxt, 0x1B, 0, 1256);
tui_sbar(con, 1);
#ifdef MENU_LOGO_ENABLE
gfx_set_rect_rgb(con->gfx_ctxt, Kc_MENU_LOGO,
X_MENU_LOGO, Y_MENU_LOGO, X_POS_MENU_LOGO, Y_POS_MENU_LOGO);
#endif //MENU_LOGO_ENABLE
while (1)
{
gfx_con_setcol(con, 0xFFCCCCCC, 1, 0xFF1B1B1B);
gfx_con_setpos(con, menu->x, menu->y);
gfx_printf(con, "[%s]\n\n", menu->caption);
// Skip caption or seperator lines selection.
while (menu->ents[idx].type == MENT_CAPTION ||
menu->ents[idx].type == MENT_CHGLINE)
{
if (prev_idx <= idx || (!idx && prev_idx == cnt - 1))
{
idx++;
if (idx > (cnt - 1))
{
idx = 0;
prev_idx = 0;
}
}
else
{
idx--;
if (idx < 0)
{
idx = cnt - 1;
prev_idx = cnt;
}
}
}
prev_idx = idx;
// Draw the menu.
for (cnt = 0; menu->ents[cnt].type != MENT_END; cnt++)
{
if (cnt == idx)
gfx_con_setcol(con, 0xFF1B1B1B, 1, 0xFFCCCCCC);
else
gfx_con_setcol(con, 0xFFCCCCCC, 1, 0xFF1B1B1B);
if (menu->ents[cnt].type == MENT_CAPTION)
gfx_printf(con, "%k %s", menu->ents[cnt].color, menu->ents[cnt].caption);
else if (menu->ents[cnt].type != MENT_CHGLINE)
gfx_printf(con, " %s", menu->ents[cnt].caption);
if(menu->ents[cnt].type == MENT_MENU)
gfx_printf(con, "%k...", 0xFF0099EE);
gfx_printf(con, " \n");
}
gfx_con_setcol(con, 0xFFCCCCCC, 1, 0xFF1B1B1B);
gfx_putc(con, '\n');
// Print help and battery status.
gfx_con_getpos(con, &con->savedx, &con->savedy);
gfx_con_setpos(con, 0, 1191);
gfx_printf(con, "%k VOL: Move up/down\n PWR: Select option%k", 0xFF555555, 0xFFCCCCCC);
// Wait for user command.
u32 btn = btn_wait();
if (btn & BTN_VOL_DOWN && idx < (cnt - 1))
idx++;
else if (btn & BTN_VOL_DOWN && idx == (cnt - 1))
idx = 0;
if (btn & BTN_VOL_UP && idx > 0)
idx--;
else if (btn & BTN_VOL_UP && idx == 0)
idx = cnt - 1;
if (btn & BTN_POWER)
{
ment_t *ent = &menu->ents[idx];
switch (ent->type)
{
case MENT_HANDLER:
ent->handler(ent->data);
break;
case MENT_MENU:
return tui_do_menu(con, ent->menu);
break;
case MENT_CHOICE:
return ent->data;
break;
case MENT_BACK:
return NULL;
break;
default:
break;
}
con->fntsz = 16;
gfx_clear_partial_grey(con->gfx_ctxt, 0x1B, 0, 1256);
#ifdef MENU_LOGO_ENABLE
gfx_set_rect_rgb(con->gfx_ctxt, Kc_MENU_LOGO,
X_MENU_LOGO, Y_MENU_LOGO, X_POS_MENU_LOGO, Y_POS_MENU_LOGO);
#endif //MENU_LOGO_ENABLE
}
tui_sbar(con, 0);
}
return NULL;
}

65
bootloader/gfx/tui.h Normal file
View File

@@ -0,0 +1,65 @@
/*
* Copyright (c) 2018 naehrwert
* Copyright (C) 2018 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TUI_H_
#define _TUI_H_
#include "../utils/types.h"
#include "gfx.h"
#define MENT_END 0
#define MENT_HANDLER 1
#define MENT_MENU 2
#define MENT_CHOICE 3
#define MENT_BACK 4
#define MENT_CAPTION 5
#define MENT_CHGLINE 6
typedef struct _ment_t
{
u32 type;
const char *caption;
u32 color;
void *data;
union
{
void(*handler)(void *);
struct _menu_t *menu;
};
} ment_t;
typedef struct _menu_t
{
ment_t *ents;
const char *caption;
u32 x;
u32 y;
} menu_t;
#define MDEF_END() {MENT_END}
#define MDEF_HANDLER(caption, _handler) { MENT_HANDLER, caption, 0, NULL, { .handler = _handler } }
#define MDEF_HANDLER_EX(caption, data, _handler) { MENT_HANDLER, caption, 0, data, { .handler = _handler } }
#define MDEF_MENU(caption, _menu) { MENT_MENU, caption, 0, NULL, { .menu = _menu } }
#define MDEF_BACK() { MENT_BACK, "Back" }
#define MDEF_CAPTION(caption, color) { MENT_CAPTION, caption, color }
#define MDEF_CHGLINE() {MENT_CHGLINE}
void tui_sbar(gfx_con_t *con, int force_update);
void tui_pbar(gfx_con_t *con, int x, int y, u32 val, u32 fgcol, u32 bgcol);
void *tui_do_menu(gfx_con_t *con, menu_t *menu);
#endif