diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c index d4e2def..52a387d 100644 --- a/arch/arm/mach-msm/board-halibut.c +++ b/arch/arm/mach-msm/board-halibut.c @@ -41,29 +41,31 @@ #include #include -#define MSM_SMI_BASE 0x00000000 -#define MSM_SMI_SIZE 0x900000 +#include "board-halibut.h" -#define MSM_EBI_BASE 0x10000000 -#define MSM_EBI_SIZE 0x6e00000 +//#define MSM_SMI_BASE 0x00000000 +//#define MSM_SMI_SIZE 0x900000 -#define MSM_PMEM_GPU0_BASE 0x0 -#define MSM_PMEM_GPU0_SIZE 0x800000 +//#define MSM_EBI_BASE 0x10000000 +//#define MSM_EBI_SIZE 0x6e00000 -#define MSM_LINUX_BASE MSM_EBI_BASE -#define MSM_LINUX_SIZE 0x4c00000 +//#define MSM_PMEM_GPU0_BASE 0x0 +//#define MSM_PMEM_GPU0_SIZE 0x800000 -#define MSM_PMEM_MDP_BASE MSM_LINUX_BASE + MSM_LINUX_SIZE -#define MSM_PMEM_MDP_SIZE 0x800000 +//#define MSM_LINUX_BASE MSM_EBI_BASE +//#define MSM_LINUX_SIZE 0x4c00000 -#define MSM_PMEM_ADSP_BASE MSM_PMEM_MDP_BASE + MSM_PMEM_MDP_SIZE -#define MSM_PMEM_ADSP_SIZE 0x800000 +//#define MSM_PMEM_MDP_BASE MSM_LINUX_BASE + MSM_LINUX_SIZE +//#define MSM_PMEM_MDP_SIZE 0x800000 -#define MSM_PMEM_GPU1_BASE MSM_PMEM_ADSP_BASE + MSM_PMEM_ADSP_SIZE -#define MSM_PMEM_GPU1_SIZE 0x800000 +//#define MSM_PMEM_ADSP_BASE MSM_PMEM_MDP_BASE + MSM_PMEM_MDP_SIZE +//#define MSM_PMEM_ADSP_SIZE 0x800000 -#define MSM_FB_BASE MSM_PMEM_GPU1_BASE + MSM_PMEM_GPU1_SIZE -#define MSM_FB_SIZE 0x200000 +//#define MSM_PMEM_GPU1_BASE MSM_PMEM_ADSP_BASE + MSM_PMEM_ADSP_SIZE +//#define MSM_PMEM_GPU1_SIZE 0x800000 + +//#define MSM_FB_BASE MSM_PMEM_GPU1_BASE + MSM_PMEM_GPU1_SIZE +//#define MSM_FB_SIZE 0x200000 static int halibut_ffa; module_param_named(ffa, halibut_ffa, int, S_IRUGO | S_IWUSR | S_IWGRP); @@ -173,9 +175,13 @@ static int halibut_phy_init_seq[] = { 0x1D, 0x0D, 0x1D, 0x10, -1 }; static char *halibut_usb_functions[] = { "diag", + "ether", // netripper "adb", }; +// netripper +// orig vendor_id 0x18d1 +// orig product_id 0xd00d static struct msm_hsusb_platform_data msm_hsusb_pdata = { .phy_init_seq = halibut_phy_init_seq, .vendor_id = 0x18d1, diff --git a/arch/arm/mach-msm/board-halibut.h b/arch/arm/mach-msm/board-halibut.h new file mode 100644 index 0000000..6f13d75 --- /dev/null +++ b/arch/arm/mach-msm/board-halibut.h @@ -0,0 +1,23 @@ +#define MSM_SMI_BASE 0x00000000 +#define MSM_SMI_SIZE 0x900000 + +#define MSM_EBI_BASE 0x10000000 +#define MSM_EBI_SIZE 0x6e00000 + +#define MSM_PMEM_GPU0_BASE 0x0 +#define MSM_PMEM_GPU0_SIZE 0x800000 + +#define MSM_LINUX_BASE MSM_EBI_BASE +#define MSM_LINUX_SIZE 0x4c00000 + +#define MSM_PMEM_MDP_BASE MSM_LINUX_BASE + MSM_LINUX_SIZE +#define MSM_PMEM_MDP_SIZE 0x800000 + +#define MSM_PMEM_ADSP_BASE MSM_PMEM_MDP_BASE + MSM_PMEM_MDP_SIZE +#define MSM_PMEM_ADSP_SIZE 0x800000 + +#define MSM_PMEM_GPU1_BASE MSM_PMEM_ADSP_BASE + MSM_PMEM_ADSP_SIZE +#define MSM_PMEM_GPU1_SIZE 0x800000 + +#define MSM_FB_BASE MSM_PMEM_GPU1_BASE + MSM_PMEM_GPU1_SIZE +#define MSM_FB_SIZE 0x200000 diff --git a/arch/arm/mach-msm/io.c b/arch/arm/mach-msm/io.c index b9c00f4..e942a2e 100644 --- a/arch/arm/mach-msm/io.c +++ b/arch/arm/mach-msm/io.c @@ -62,6 +62,7 @@ static struct map_desc msm_io_desc[] __initdata = { MSM_DEVICE(SDC2), MSM_DEVICE(SDC3), MSM_DEVICE(SDC4), + MSM_DEVICE(TS), }; void __init msm_map_common_io(void) diff --git a/arch/arm/mach-msm/irq.c b/arch/arm/mach-msm/irq.c index c317bc9..19b1a70 100644 --- a/arch/arm/mach-msm/irq.c +++ b/arch/arm/mach-msm/irq.c @@ -443,7 +443,16 @@ void __init msm_init_irq(void) for (n = 0; n < NR_MSM_IRQS; n++) { set_irq_chip(n, &msm_irq_chip); set_irq_handler(n, handle_level_irq); - set_irq_flags(n, IRQF_VALID); + + // On Raphael/Diamond the device hangs when debug timer interrupt is enabled - netripper + if (n == INT_DEBUG_TIMER_EXP) + { + set_irq_flags(n, IRQF_NOAUTOEN); + } + else + { + set_irq_flags(n, IRQF_VALID); + } } } diff --git a/arch/arm/mach-msm/proc_comm.c b/arch/arm/mach-msm/proc_comm.c index 3a7c981..d5e028c 100644 --- a/arch/arm/mach-msm/proc_comm.c +++ b/arch/arm/mach-msm/proc_comm.c @@ -87,6 +87,8 @@ again: int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned *data2) { +// netripper ; proc comm disabled +return 0; unsigned base = MSM_SHARED_RAM_BASE; unsigned long flags; int ret; diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig index 9fda172..a66f2a6 100644 --- a/drivers/android/Kconfig +++ b/drivers/android/Kconfig @@ -94,4 +94,14 @@ config ANDROID_PARANOID_NETWORK bool "Only allow certain groups to create sockets" default y +config HTC_FB_CONSOLE + bool "Boot console for HTC phones (needs VGA FONT_8x16)" +# depends on FONT_8x16 + default n + +config HTC_FB_CONSOLE_DELAY + hex "Time to wait after each printk so you can see the output (something like miliseconds, but highly inaccurate)" + default 0 + depends on HTC_FB_CONSOLE + endmenu diff --git a/drivers/android/Makefile b/drivers/android/Makefile index 75fd262..b022353 100644 --- a/drivers/android/Makefile +++ b/drivers/android/Makefile @@ -5,3 +5,4 @@ obj-$(CONFIG_ANDROID_LOGGER) += logger.o obj-$(CONFIG_ANDROID_RAM_CONSOLE) += ram_console.o obj-$(CONFIG_ANDROID_TIMED_GPIO) += timed_gpio.o obj-$(CONFIG_ANDROID_PMEM) += pmem.o +obj-$(CONFIG_HTC_FB_CONSOLE) += htc_fb_console.o diff --git a/drivers/android/htc_fb_console.c b/drivers/android/htc_fb_console.c new file mode 100644 index 0000000..db39b09 --- /dev/null +++ b/drivers/android/htc_fb_console.c @@ -0,0 +1,308 @@ +/* drivers/android/fb_console.c + * + * By Octavian Voicu + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that 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. + * + */ + + +/* + * Ugly hack to get some basic console working for HTC Diamond but should + * also work for Raphael and other similar phones. Will register itself + * as an early console to show boot messages. This won't work unless + * the LCD is already powered up and functional (from wince, boot + * using Haret). We just DMA pixels to the LCD, all configuration + * must already be done. + * + * Not exactly very clean nor optimized, but it's a one night hack + * and it works :) + * + * If anyone makes any progress on HTC Diamond drop me a line + * (see email at the top), I do wanna see Android on my HTC Diamond! + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../video/msm/mdp_hw.h" + + +/* To use a different font, change this define, adjust font name + * below and also adjust font size (cols, rows) */ + +#ifndef CONFIG_FONT_8x16 +#error "VGA 8x16 font must be enabled in the kernel config (CONFIG_FONT_8x16)" +#endif + +extern void create_mapping(struct map_desc *md); + +extern const struct font_desc font_vga_8x16; + +#define HTC_FB_FONT (font_vga_8x16.data) +#define HTC_FB_FONT_COLS 8 +#define HTC_FB_FONT_ROWS 16 + +/* Green message (color = 2), the reset color to white (color = 6) */ +#define HTC_FB_MSG ("\n\n" "\x1b" "2" "HTC Linux framebuffer console by druidu" "\x1b" "7" "\n\n") + +#define HTC_FB_LCD_WIDTH 480 +#define HTC_FB_LCD_HEIGHT 640 + +#define HTC_FB_BASE 0xe2000000 +#define HTC_FB_PHYS 0x16800000 +#define HTC_FB_OFF 0x0006a000 +#define HTC_FB_SIZE 0x00100000 + +/* Size of console in chars */ +#define HTC_FB_CONSOLE_COLS ((HTC_FB_LCD_WIDTH) / (HTC_FB_FONT_COLS)) +#define HTC_FB_CONSOLE_ROWS ((HTC_FB_LCD_HEIGHT) / (HTC_FB_FONT_ROWS)) + +#define HTC_FB_RGB(r, g, b) ((((r) & 0x1f) << 11) | (((g) & 0x3f) << 5) | (((b) & 0x1f) << 0)) + +unsigned short htc_fb_colors[8] = { + HTC_FB_RGB(0x00, 0x00, 0x00), /* Black */ + HTC_FB_RGB(0x1f, 0x00, 0x00), /* Red */ + HTC_FB_RGB(0x00, 0x15, 0x00), /* Green */ + HTC_FB_RGB(0x0f, 0x15, 0x00), /* Brown */ + HTC_FB_RGB(0x00, 0x00, 0x1f), /* Blue */ + HTC_FB_RGB(0x1f, 0x00, 0x1f), /* Magenta */ + HTC_FB_RGB(0x00, 0x3f, 0x1f), /* Cyan */ + HTC_FB_RGB(0x1f, 0x3f, 0x1f) /* White */ +}; + +const unsigned char *htc_fb_font; + +/* Current position of cursor (where next character will be written) */ +unsigned int htc_fb_cur_x, htc_fb_cur_y; + +/* Current fg / bg colors */ +unsigned char htc_fb_cur_fg, htc_fb_cur_bg; + +/* Buffer to hold characters and attributes */ +unsigned char htc_fb_chars[HTC_FB_CONSOLE_ROWS][HTC_FB_CONSOLE_COLS]; +unsigned char htc_fb_fg[HTC_FB_CONSOLE_ROWS][HTC_FB_CONSOLE_COLS]; +unsigned char htc_fb_bg[HTC_FB_CONSOLE_ROWS][HTC_FB_CONSOLE_COLS]; + +/* msleep doesn't seem to work for me... */ +static unsigned int htc_fb_delay(int t) +{ + volatile unsigned int k, m = 0; + while(t--) + for (k = 0; k < 528000; k++) m += k * m; + /* Return something so compiler won't optimize the function to 'no code' */ + return m; +} + +/* Update the framebuffer from the character buffer then start DMA */ +static void htc_fb_console_update(void) +{ + unsigned int memaddr, fbram, stride, width, height, x, y, i, j, r1, c1, r2, c2; + unsigned int dma2_cfg; + unsigned short ld_param = 0; /* 0=PRIM, 1=SECD, 2=EXT */ + unsigned short *ptr; + unsigned char ch; + + fbram = HTC_FB_PHYS + HTC_FB_OFF; + memaddr = HTC_FB_BASE + HTC_FB_OFF; + + ptr = (unsigned short*) memaddr; + for (i = 0; i < HTC_FB_CONSOLE_ROWS * HTC_FB_FONT_ROWS; i++) { + r1 = i / HTC_FB_FONT_ROWS; + r2 = i % HTC_FB_FONT_ROWS; + for (j = 0; j < HTC_FB_CONSOLE_COLS * HTC_FB_FONT_COLS; j++) { + c1 = j / HTC_FB_FONT_COLS; + c2 = j % HTC_FB_FONT_COLS; + ch = htc_fb_chars[r1][c1]; + *ptr++ = htc_fb_font[(((int) ch) * HTC_FB_FONT_ROWS) + r2] & ((1 << (HTC_FB_FONT_COLS - 1)) >> c2) + ? htc_fb_colors[htc_fb_fg[r1][c1]] + : htc_fb_colors[htc_fb_bg[r1][c1]]; + } + ptr += HTC_FB_LCD_WIDTH - HTC_FB_CONSOLE_COLS * HTC_FB_FONT_COLS; + } + + stride = HTC_FB_LCD_WIDTH * 2; + width = HTC_FB_LCD_WIDTH; + height = HTC_FB_LCD_HEIGHT; + x = 0; + y = 0; + + dma2_cfg = DMA_PACK_TIGHT | + DMA_PACK_ALIGN_LSB | + DMA_PACK_PATTERN_RGB | + DMA_OUT_SEL_AHB | + DMA_IBUF_NONCONTIGUOUS; + + dma2_cfg |= DMA_IBUF_FORMAT_RGB565; + dma2_cfg |= DMA_OUT_SEL_MDDI; + dma2_cfg |= DMA_MDDI_DMAOUT_LCD_SEL_PRIMARY; + dma2_cfg |= DMA_DITHER_EN; + + /* setup size, address, and stride */ + writel((height << 16) | (width), MDP_FULL_BYPASS_WORD33); + writel(fbram, MDP_FULL_BYPASS_WORD34); + writel(stride, MDP_FULL_BYPASS_WORD35); + + /* 666 18BPP */ + dma2_cfg |= DMA_DSTC0G_6BITS | DMA_DSTC1B_6BITS | DMA_DSTC2R_6BITS; + + /* set y & x offset and MDDI transaction parameters */ + writel((y << 16) | (x), MDP_FULL_BYPASS_WORD37); + writel(ld_param, MDP_FULL_BYPASS_WORD40); + writel((MDDI_VDO_PACKET_DESC << 16) | MDDI_VDO_PACKET_PRIM, MDP_FULL_BYPASS_WORD41); + + writel(dma2_cfg, MDP_DMA_CONFIG); + + /* start DMA2 */ + writel(0, MDP_DMA_START); + + /* Wait a bit to let the transfer finish */ + htc_fb_delay(1); +} + +/* Clear screen and buffers */ +static void htc_fb_console_clear(void) +{ + /* Default white on black, clear everything */ + memset((void*) (HTC_FB_BASE + HTC_FB_OFF), 0, HTC_FB_LCD_WIDTH * HTC_FB_LCD_HEIGHT * 2); + memset(htc_fb_chars, 0, HTC_FB_CONSOLE_COLS * HTC_FB_CONSOLE_ROWS); + memset(htc_fb_fg, 7, HTC_FB_CONSOLE_COLS * HTC_FB_CONSOLE_ROWS); + memset(htc_fb_bg, 0, HTC_FB_CONSOLE_COLS * HTC_FB_CONSOLE_ROWS); + htc_fb_cur_x = htc_fb_cur_y = 0; + htc_fb_cur_fg = 7; + htc_fb_cur_bg = 0; + htc_fb_console_update(); +} + +/* Write a string to character buffer; handles word wrapping, auto-scrolling, etc + * After that, calls htc_fb_console_update to send data to the LCD */ +static void htc_fb_console_write(struct console *console, const char *s, unsigned int count) +{ + unsigned int i, j, k, scroll; + const char *p; + + scroll = 0; + for (k = 0, p = s; k < count; k++, p++) { + if (*p == '\n') { + /* Jump to next line */ + scroll = 1; + } else if (*p == '\t') { + /* Tab size 8 chars */ + htc_fb_cur_x = (htc_fb_cur_x + 7) % 8; + if (htc_fb_cur_x >= HTC_FB_CONSOLE_COLS) { + scroll = 1; + } + } else if (*p == '\x1b') { + /* Escape char (ascii 27) + * Some primitive way to change color: + * \x1b followed by one digit to represent color (0 black ... 7 white) */ + if (k < count - 1) { + p++; + htc_fb_cur_fg = *p - '0'; + if (htc_fb_cur_fg >= 8) { + htc_fb_cur_fg = 7; + } + } + } else if (*p != '\r') { + /* Ignore \r, other cars get written here */ + htc_fb_chars[htc_fb_cur_y][htc_fb_cur_x] = *p; + htc_fb_fg[htc_fb_cur_y][htc_fb_cur_x] = htc_fb_cur_fg; + htc_fb_bg[htc_fb_cur_y][htc_fb_cur_x] = htc_fb_cur_bg; + htc_fb_cur_x++; + if (htc_fb_cur_x >= HTC_FB_CONSOLE_COLS) { + scroll = 1; + } + } + if (scroll) { + scroll = 0; + htc_fb_cur_x = 0; + htc_fb_cur_y++; + if (htc_fb_cur_y == HTC_FB_CONSOLE_ROWS) { + /* Scroll below last line, shift all rows up + * Should have used a bigger buffer so no shift, + * would actually be needed -- but hey, it's a one night hack */ + htc_fb_cur_y--; + for (i = 1; i < HTC_FB_CONSOLE_ROWS; i++) { + for (j = 0; j < HTC_FB_CONSOLE_COLS; j++) { + htc_fb_chars[i - 1][j] = htc_fb_chars[i][j]; + htc_fb_fg[i - 1][j] = htc_fb_fg[i][j]; + htc_fb_bg[i - 1][j] = htc_fb_bg[i][j]; + } + } + for (j = 0; j < HTC_FB_CONSOLE_COLS; j++) { + htc_fb_chars[HTC_FB_CONSOLE_ROWS - 1][j] = 0; + htc_fb_fg[HTC_FB_CONSOLE_ROWS - 1][j] = htc_fb_cur_fg; + htc_fb_bg[HTC_FB_CONSOLE_ROWS - 1][j] = htc_fb_cur_bg; + } + } + } + } + + htc_fb_console_update(); + +#ifdef HTC_FB_CONSOLE_DELAY +#if HTC_FB_CONSOLE_DELAY > 0 + /* Delay so we can see what's there, we have no keys to scroll */ + htc_fb_delay(HTC_FB_CONSOLE_DELAY); +#endif +#endif +} + +static struct console htc_fb_console = { + .name = "htc_fb", + .write = htc_fb_console_write, + .flags = CON_PRINTBUFFER | CON_ENABLED, + .index = -1, +}; + +/* Init console on LCD using MDDI/MDP interface to transfer pixel data. + * We can DMA to the board, as long as we give a physical address to the LCD + * controller and use the coresponding virtual address to write pixels to. + * The physical address I used is the one wince had for the framebuffer */ +static int __init htc_fb_console_init(void) +{ + struct map_desc map; + + /* Map the framebuffer Windows was using, as we know the physical address */ + map.pfn = __phys_to_pfn(HTC_FB_PHYS & SECTION_MASK); + map.virtual = HTC_FB_BASE; + map.length = ((unsigned long) HTC_FB_SIZE + ~SECTION_MASK) & SECTION_MASK; + map.type = MT_MEMORY; + /* Ugly hack, but we're not sure what works and what doesn't, + * so better use the lowest level we have for setting the mapping */ + create_mapping(&map); + + /* Set font and clear the buffer; we could probably see the Haret + * output if we didn't clear the buffer (if it used same physical address) */ + htc_fb_font = HTC_FB_FONT; + htc_fb_console_clear(); + + register_console(&htc_fb_console); + console_verbose(); + + /* Welcome message */ + htc_fb_console_write(&htc_fb_console, HTC_FB_MSG, strlen(HTC_FB_MSG)); + + return 0; +} + +console_initcall(htc_fb_console_init); + diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index d1341cd..9921308 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -273,4 +273,13 @@ config TOUCHSCREEN_USB_GOTOP bool "GoTop Super_Q2/GogoPen/PenPower tablet device support" if EMBEDDED depends on TOUCHSCREEN_USB_COMPOSITE +config TOUCHSCREEN_MSM + default n + bool "MSM touchscreen" + +config MSM_VIRTUAL_KEYBOARD + default n + bool "On-screen virtual keyboard using MSM touchscreen" + depends on FB_MSM && TOUCHSCREEN_MSM + endif diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index b12f0d6..b74e18e 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -21,3 +21,5 @@ obj-$(CONFIG_TOUCHSCREEN_ELAN_I2C_8232) += elan8232_i2c.o obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o +obj-$(CONFIG_TOUCHSCREEN_MSM) += msm_ts.o +obj-$(CONFIG_MSM_VIRTUAL_KEYBOARD) += msm_vkeyb.o diff --git a/drivers/input/touchscreen/msm_ts.c b/drivers/input/touchscreen/msm_ts.c new file mode 100644 index 0000000..cfa768a --- /dev/null +++ b/drivers/input/touchscreen/msm_ts.c @@ -0,0 +1,243 @@ +/* drivers/input/touchscreen/msm_ts.c + * + * By Octavian Voicu + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that 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. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* For MSM_FB_BASE */ +#include "../../../arch/arm/mach-msm/board-halibut.h" + +#define MSM_TS_ABS_X_MIN 0x80 +#define MSM_TS_ABS_X_MAX 0x360 +#define MSM_TS_ABS_Y_MIN 0x60 +#define MSM_TS_ABS_Y_MAX 0x390 + +#define MSM_TS_LCD_WIDTH 480 +#define MSM_TS_LCD_HEIGHT 640 + +/* Touchscreen registers */ +#define TSSC_CTL 0x100 +#define TSSC_STATUS 0x10c +#define TSSC_DATA_LO_AVE 0x110 +#define TSSC_DATA_UP_AVE 0x114 + +#define FBRAM(x, y) (*(((unsigned short*) msm_ts_fbram) + MSM_TS_LCD_WIDTH * (y) + (x))) + +void __iomem *msm_ts_fbram; + +typedef void msm_ts_handler_t(int, int, int); +msm_ts_handler_t *msm_ts_handler; + +static void do_softint(struct work_struct *work); + +static struct input_dev *msm_ts_dev; +static DECLARE_DELAYED_WORK(work, do_softint); + +int calib_step, calib_xmin, calib_xmax, calib_ymin, calib_ymax; +int irq_disabled; + +static void do_softint(struct work_struct *tmp_work) +{ + unsigned long status, data; + int absx, absy, touched, x, y; + static int prev_absx, prev_absy, prev_touched = 0, nrskipped = 0; + + /* Draw two red dots during calibration (in upper-left and lower-right corners) */ + if (calib_step > 0 && calib_step < 3) { + FBRAM(0, 0) = 0xF800; + FBRAM(MSM_TS_LCD_WIDTH - 1, MSM_TS_LCD_HEIGHT - 1) = 0xF800; + } + + /* Read status and data */ + status = readl(MSM_TS_BASE + TSSC_STATUS); + data = readl(MSM_TS_BASE + TSSC_DATA_LO_AVE); + + /* Without next 2 lines, position won't get updated */ + writel(readl(MSM_TS_BASE + TSSC_CTL) & ~0x400, MSM_TS_BASE + TSSC_CTL); + writel(readl(MSM_TS_BASE + TSSC_CTL) & ~0xc00, MSM_TS_BASE + TSSC_CTL); + + /* Get stylus position and press state */ + absx = data & 0xFFFF; + absy = data >> 16; + touched = status & 0x100 ? 1 : 0; + + /* Only do something when the touch state or position have changed */ + if (absx != prev_absx || absy != prev_absy || touched != prev_touched) { + /* First three tap are to calibrate upper-left and lower-right corners */ + if (calib_step < 3) { + if (touched && !prev_touched) { + if (calib_step == 1) { + /* This is upper-left corner */ + calib_xmax = absx; + calib_ymin = absy; + printk(KERN_WARNING "msm_ts: maxx=%04x miny=%04x\n", calib_xmax, calib_ymin); + printk(KERN_WARNING "Calibration step 2: tap red dot in lower-right corner\n"); + } else if(calib_step == 2) { + /* This is lower-right corner */ + calib_xmin = absx; + calib_ymax = absy; + printk(KERN_WARNING "msm_ts: minx=%04x maxy=%04x\n", calib_xmin, calib_ymax); + printk(KERN_WARNING "Calibration successful!\n\n# "); + } else { + printk(KERN_WARNING "Calibration step 1: tap red dot in upper-left corner\n"); + } + calib_step++; + } + } else { + /* On stylus up, use same coordinates as last position we had (since they're 0 otherwise) */ + if (!touched) { + absx = prev_absx; + absy = prev_absy; + } + + /* Calculate coordinates in pixels, clip to screen and make sure we don't to divisions by zero */ + x = MSM_TS_LCD_WIDTH - 1 - (absx - calib_xmin) * MSM_TS_LCD_WIDTH / (calib_xmax == calib_xmin ? MSM_TS_LCD_HEIGHT : calib_xmax - calib_xmin); + if (x < 0) x = 0; + if (x >= MSM_TS_LCD_WIDTH) x = MSM_TS_LCD_WIDTH - 1; + y = (absy - calib_ymin) * MSM_TS_LCD_HEIGHT / (calib_ymax == calib_ymin ? MSM_TS_LCD_HEIGHT : calib_ymax - calib_ymin); + if (y < 0) y = 0; + if (y >= MSM_TS_LCD_HEIGHT) y = MSM_TS_LCD_HEIGHT - 1; + + /* Draw a yellow dot */ + FBRAM(x, y) = 0xFFE0; + + /* Call our handler if it's registered -- the virtual keyboards gets data from this */ + if (msm_ts_handler) { + nrskipped = 0; + (*msm_ts_handler)(x, y, touched); + } + + /* Send data to linux input system */ + if (touched) { + input_report_key(msm_ts_dev, BTN_TOUCH, 1); + input_report_abs(msm_ts_dev, ABS_X, absx); + input_report_abs(msm_ts_dev, ABS_Y, absy); + } else { + input_report_key(msm_ts_dev, BTN_TOUCH, 0); + } + + input_sync(msm_ts_dev); + } + + prev_absx = touched ? absx : 0; + prev_absy = touched ? absy : 0; + prev_touched = touched; + } else { + /* Let the virtual keyboard redraw itself anyway */ + if (msm_ts_handler) { + /* Call it at most four times per second if no updates */ + if (nrskipped >= 5) { + nrskipped = 0; + (*msm_ts_handler)(0, 0, -1); + } else { + nrskipped++; + } + } + } + + if (irq_disabled) { + enable_irq(INT_TCHSCRN1); + irq_disabled = 0; + } + + /* Reschedule ourselves; poll the touchscreen 20 times each second */ + schedule_delayed_work(&work, HZ / 20); +} + +static irqreturn_t msm_ts_interrupt(int irq, void *dev) +{ + printk(KERN_WARNING "IRQ %d fired! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n\n\n\n", irq); + + if (!irq_disabled) { + disable_irq_nosync(irq); + irq_disabled = 1; + } + + schedule_delayed_work(&work, HZ / 20); + + return IRQ_HANDLED; +} + +static int __init msm_ts_init(void) +{ + int err; + + msm_ts_fbram = ioremap(MSM_FB_BASE, MSM_FB_SIZE); + if (msm_ts_fbram == 0) { + printk(KERN_ERR "cannot allocate fbram!\n"); + return -ENOMEM; + } + + printk(KERN_WARNING "msm_ts: TSSC_CTL=%08x TSSC_STATUS=%08x\n", (unsigned int) readl(MSM_TS_BASE + TSSC_CTL), (unsigned int) readl(MSM_TS_BASE + TSSC_STATUS)); + + msm_ts_dev = input_allocate_device(); + if (!msm_ts_dev) + return -ENOMEM; + + msm_ts_dev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); + msm_ts_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(msm_ts_dev, ABS_X, + MSM_TS_ABS_X_MIN, MSM_TS_ABS_X_MAX, 0, 0); + input_set_abs_params(msm_ts_dev, ABS_Y, + MSM_TS_ABS_Y_MIN, MSM_TS_ABS_Y_MAX, 0, 0); + + msm_ts_dev->name = "MSM touchscreen"; + msm_ts_dev->phys = "msm_ts/input0"; + + if (request_irq(INT_TCHSCRN1, msm_ts_interrupt, IRQF_DISABLED, "msm_ts", 0) < 0) { + printk(KERN_ERR "msm_ts: Can't allocate irq %d\n", INT_TCHSCRN1); + err = -EBUSY; + goto fail1; + } + + err = input_register_device(msm_ts_dev); + if (err) + goto fail2; + + /* Call our work function first time */ + schedule_delayed_work(&work, HZ); + + printk(KERN_WARNING "msm_ts_init successful\n"); + + return 0; + + fail2: free_irq(INT_TCHSCRN1, NULL); + cancel_delayed_work(&work); + flush_scheduled_work(); + fail1: input_free_device(msm_ts_dev); + return err; +} + +static void __exit msm_ts_exit(void) +{ + free_irq(INT_TCHSCRN1, NULL); + cancel_delayed_work(&work); + flush_scheduled_work(); + input_unregister_device(msm_ts_dev); +} + +module_init(msm_ts_init); +module_exit(msm_ts_exit); + +MODULE_AUTHOR("Octavian Voicu, octavian.voicu@gmail.com"); +MODULE_DESCRIPTION("MSM touchscreen driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/msm_vkeyb.c b/drivers/input/touchscreen/msm_vkeyb.c new file mode 100644 index 0000000..ef307c3 --- /dev/null +++ b/drivers/input/touchscreen/msm_vkeyb.c @@ -0,0 +1,437 @@ +/* drivers/input/touchscreen/msm_vkeyb.c + * + * By Octavian Voicu + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that 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. + * + */ + +/* README + * + * Note: there are a few ugly hacks to make this work, but it works + * so it's ok for now (touchscreen irqs don't fire, so we just poll + * 20 times a second, we access framebuffer memory directly, so + * msm_fb was modified to update the whole screen every time). + * + * Using the virtual keyboard: + * + * 1. Don't touch the screen while booting + * 2. After you entered the shell, tap the screen once + * (you will get a message saying you entered calibration mode) + * 3. Tap the red pixel in the upper-left corner of the screen + * (a message will confirm your selection) + * 4. Tap the red pixel in the lower-right corner of the screen + * (a message will confirm your selection) + * 5. You can draw yellow dots on the screen by tapping and dragging + * 6. Type by tapping the keys; + * Shift/Alt/Ctrl/Caps/SysRq are sticky keys, they work in toggle mode; + * Left Shift/Alt/Ctrl reset automatically after tapping a normal key; + * Activating Shift shows the alternate chars on each key; + * Alt+Sys+KEY is the magic SysRq, see Alt+Sys+h for more info. + * Shift+PgU/PgD work for scrolling the framebuffer console. + */ + +#include +#include +#include +#include +#include +#include +#include + +/* For MSM_FB_BASE */ +#include "../../../arch/arm/mach-msm/board-halibut.h" + +#ifndef CONFIG_FONT_8x8 +#error "Must compile with CONFIG_FONT_8x8 (VGA 8x8 font) for this module to work" +#endif + +#define MSM_VKEYB_LAST_KEY KEY_PAUSE +#define MSM_VKEYB_ROWS 6 +#define MSM_VKEYB_COLS 15 + +#define MSM_VKEYB_LCD_WIDTH 480 +#define MSM_VKEYB_LCD_HEIGHT 640 + +#define MSM_VKEYB_LEFT 85 +#define MSM_VKEYB_TOP 0 +#define MSM_VKEYB_KEY_W 26 +#define MSM_VKEYB_KEY_H 13 + +#define MSM_VKEYB_FONT_COLS 8 +#define MSM_VKEYB_FONT_ROWS 8 + +#define FBRAM(x, y) (*(((unsigned short*) msm_ts_fbram) + MSM_VKEYB_LCD_WIDTH * (y) + (x))) +#define FONTDATA(ch, x, y) ((*(((unsigned char*) font_vga_8x8.data) + ch * MSM_VKEYB_FONT_ROWS + y)) & (1 << (MSM_VKEYB_FONT_COLS - 1 - (x)))) +#define SHIFTACTIVE() (vkeyb_key_state[KEY_LEFTSHIFT] || vkeyb_key_state[KEY_RIGHTSHIFT]) +#define CAPSACTIVE() (vkeyb_key_state[KEY_CAPSLOCK]) +#define ISALPHA(x) (((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z')) +#define TOGGLECASE(x) ((x) ^ 0x20) + +#define RGB(r, g, b) (((((r) * 0x1f / 0xff) & 0x1f) << 11) | ((((g) * 0x3f / 0xff) & 0x3f) << 5) | ((((b) * 0x1f / 0xff) & 0x1f) << 0)) + +#define COLOR_TRANSPARENT 0x6666 +#define COLOR_BLACK RGB(0x00, 0x00, 0x00) +#define COLOR_WHITE RGB(0xFF, 0xFF, 0xFF) +#define COLOR_DARKGRAY RGB(0x40, 0x40, 0x40) +#define COLOR_GRAY RGB(0x80, 0x80, 0x80) +#define COLOR_LIGHTGRAY RGB(0xC0, 0xC0, 0xC0) +#define COLOR_RED RGB(0xFF, 0x00, 0x00) +#define COLOR_GREEN RGB(0x00, 0xFF, 0xFF) + +extern void __iomem *msm_ts_fbram; +extern const struct font_desc font_vga_8x8; + +typedef void msm_ts_handler_t(int, int, int); +extern msm_ts_handler_t *msm_ts_handler; + +static struct input_dev *msm_vkeyb_dev; + +static int vkeyb_key_state[MSM_VKEYB_LAST_KEY]; + +/* Sticky keys remain pressed after being tapped */ +static int vkeyb_key_sticky[MSM_VKEYB_LAST_KEY] = { + [KEY_LEFTSHIFT] = 1, + [KEY_RIGHTSHIFT] = 1, + [KEY_LEFTCTRL] = 1, + [KEY_RIGHTCTRL] = 1, + [KEY_LEFTALT] = 1, + [KEY_RIGHTALT] = 1, + [KEY_CAPSLOCK] = 1, + [KEY_SYSRQ] = 1, +}; + +/* Sticky keys that have auto reset, will release automatically after a normal key is pressed */ +static int vkeyb_key_auto_reset[MSM_VKEYB_LAST_KEY] = { + [KEY_LEFTSHIFT] = 1, + [KEY_LEFTCTRL] = 1, + [KEY_LEFTALT] = 1, +}; + +static int vkeyb_keyboard[MSM_VKEYB_ROWS][MSM_VKEYB_COLS] = { + { KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_INSERT, KEY_DELETE }, + { KEY_GRAVE, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_HOME }, + { KEY_TAB, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LEFTBRACE, KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_PAGEUP }, + { KEY_CAPSLOCK, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, KEY_APOSTROPHE, KEY_ENTER, KEY_ENTER, KEY_PAGEDOWN }, + { KEY_LEFTSHIFT, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_DOT, KEY_SLASH, KEY_RIGHTSHIFT, KEY_SYSRQ, KEY_UP, KEY_END }, + { KEY_LEFTCTRL, KEY_LEFTALT, KEY_SPACE, KEY_SPACE, KEY_SPACE, KEY_SPACE, KEY_SPACE, KEY_SPACE, KEY_SPACE, KEY_SPACE, KEY_RIGHTALT, KEY_RIGHTCTRL, KEY_LEFT, KEY_DOWN, KEY_RIGHT} +}; + +static int vkeyb_active_key; + +static char *vkeyb_key_func[MSM_VKEYB_LAST_KEY] = { + [KEY_ESC] = "Esc", + [KEY_F1] = "F1", + [KEY_F2] = "F2", + [KEY_F3] = "F3", + [KEY_F4] = "F4", + [KEY_F5] = "F5", + [KEY_F6] = "F6", + [KEY_F7] = "F7", + [KEY_F8] = "F8", + [KEY_F9] = "F9", + [KEY_F10] = "F10", + [KEY_F11] = "F11", + [KEY_F12] = "F12", + [KEY_INSERT] = "Ins", + [KEY_DELETE] = "Del", + [KEY_GRAVE] = "`", + [KEY_1] = "1", + [KEY_2] = "2", + [KEY_3] = "3", + [KEY_4] = "4", + [KEY_5] = "5", + [KEY_6] = "6", + [KEY_7] = "7", + [KEY_8] = "8", + [KEY_9] = "9", + [KEY_0] = "0", + [KEY_MINUS] = "-", + [KEY_EQUAL] = "=", + [KEY_BACKSPACE] = "Bks", + [KEY_HOME] = "Hom", + [KEY_TAB] = "Tab", + [KEY_Q] = "q", + [KEY_W] = "w", + [KEY_E] = "e", + [KEY_R] = "r", + [KEY_T] = "t", + [KEY_Y] = "y", + [KEY_U] = "u", + [KEY_I] = "i", + [KEY_O] = "o", + [KEY_P] = "p", + [KEY_LEFTBRACE] = "[", + [KEY_RIGHTBRACE] = "]", + [KEY_BACKSLASH] = "\\", + [KEY_PAGEUP] = "PgU", + [KEY_CAPSLOCK] = "Cap", + [KEY_A] = "a", + [KEY_S] = "s", + [KEY_D] = "d", + [KEY_F] = "f", + [KEY_G] = "g", + [KEY_H] = "h", + [KEY_J] = "j", + [KEY_K] = "k", + [KEY_L] = "l", + [KEY_SEMICOLON] = ";", + [KEY_APOSTROPHE] = "'", + [KEY_ENTER] = "Enter", + [KEY_PAGEDOWN] = "PgD", + [KEY_LEFTSHIFT] = "\x1e", + [KEY_Z] = "z", + [KEY_X] = "x", + [KEY_C] = "c", + [KEY_V] = "v", + [KEY_B] = "b", + [KEY_N] = "n", + [KEY_M] = "m", + [KEY_COMMA] = ",", + [KEY_DOT] = ".", + [KEY_SLASH] = "/", + [KEY_RIGHTSHIFT] = "\x1e", + [KEY_SYSRQ] = "Sys", + [KEY_UP] = "\x18", + [KEY_END] = "End", + [KEY_LEFTCTRL] = "Ctr", + [KEY_LEFTALT] = "Alt", + [KEY_SPACE] = "Space", + [KEY_RIGHTALT] = "Alt", + [KEY_RIGHTCTRL] = "Ctr", + [KEY_LEFT] = "\x1b", + [KEY_DOWN] = "\x19", + [KEY_RIGHT] = "\x1a", +}; + +static char *vkeyb_key_shift_func[MSM_VKEYB_LAST_KEY] = { + [KEY_GRAVE] = "~", + [KEY_1] = "!", + [KEY_2] = "@", + [KEY_3] = "#", + [KEY_4] = "$", + [KEY_5] = "%", + [KEY_6] = "^", + [KEY_7] = "&", + [KEY_8] = "*", + [KEY_9] = "(", + [KEY_0] = ")", + [KEY_MINUS] = "_", + [KEY_EQUAL] = "+", + [KEY_Q] = "Q", + [KEY_W] = "W", + [KEY_E] = "E", + [KEY_R] = "R", + [KEY_T] = "T", + [KEY_Y] = "Y", + [KEY_U] = "U", + [KEY_I] = "I", + [KEY_O] = "O", + [KEY_P] = "P", + [KEY_LEFTBRACE] = "{", + [KEY_RIGHTBRACE] = "}", + [KEY_BACKSLASH] = "|", + [KEY_A] = "A", + [KEY_S] = "S", + [KEY_D] = "D", + [KEY_F] = "F", + [KEY_G] = "G", + [KEY_H] = "H", + [KEY_J] = "J", + [KEY_K] = "K", + [KEY_L] = "L", + [KEY_SEMICOLON] = ":", + [KEY_APOSTROPHE] = "\"", + [KEY_Z] = "Z", + [KEY_X] = "X", + [KEY_C] = "C", + [KEY_V] = "V", + [KEY_B] = "B", + [KEY_N] = "N", + [KEY_M] = "M", + [KEY_COMMA] = "<", + [KEY_DOT] = ">", + [KEY_SLASH] = "?", +}; + +void msm_vkeyb_putc(unsigned char ch, int x, int y, unsigned short color) +{ + int i, j; + + for (i = 0; i < MSM_VKEYB_FONT_ROWS; i++) { + for (j = 0; j < MSM_VKEYB_FONT_COLS; j++) { + if(FONTDATA(ch, j, i)) FBRAM(x + j, y + i) = color; + } + } +} + +void msm_vkeyb_puts(unsigned char *str, int x, int y, unsigned short color) +{ + while(*str) { + msm_vkeyb_putc(*str, x, y, color); + x += MSM_VKEYB_FONT_COLS; + str++; + } +} + +void msm_vkeyb_rect(int x, int y, int w, int h, unsigned short border, unsigned short fill) +{ + int i, j; + + for (i = y; i < y + h; i++) { + for (j = x; j < x + w; j++) { + if (i == y || j == x || i == y + h - 1 || j == x + w - 1) { + FBRAM(j, i) = border; + } else if (fill != COLOR_TRANSPARENT) { + FBRAM(j, i) = fill; + } + } + } +} + +void msm_vkeyb_draw_keyboard(void) +{ + int i, j, jj, key, x, y, w; + char *label, tmp[2]; + unsigned int fg, bg; + + y = MSM_VKEYB_TOP; + for (i = 0; i < MSM_VKEYB_ROWS; i++) { + x = MSM_VKEYB_LEFT; + for (j = 0; j < MSM_VKEYB_COLS; j++) { + key = vkeyb_keyboard[i][j]; + for (jj = j + 1; jj < MSM_VKEYB_COLS && vkeyb_keyboard[i][jj] == vkeyb_keyboard[i][jj - 1]; jj++) ; + w = MSM_VKEYB_KEY_W * (jj - j); + j = jj - 1; + if (key == vkeyb_active_key) { + /* Key under stylus */ + fg = COLOR_BLACK; + bg = COLOR_RED; + } else if (vkeyb_key_state[key]) { + /* Sticky key that is pressed */ + fg = COLOR_WHITE; + bg = COLOR_BLACK; + } else if (vkeyb_key_sticky[key]) { + /* Sticky key that is not pressed */ + fg = COLOR_BLACK; + bg = COLOR_LIGHTGRAY; + } else { + /* Normal key */ + fg = COLOR_BLACK; + bg = COLOR_WHITE; + } + label = SHIFTACTIVE() && vkeyb_key_shift_func[key] ? vkeyb_key_shift_func[key] : vkeyb_key_func[key]; + if (CAPSACTIVE() && strlen(label) == 1 && ISALPHA(label[0])) { + tmp[0] = TOGGLECASE(label[0]); + tmp[1] = '\0'; + label = tmp; + } + msm_vkeyb_rect(x, y, w + 1, MSM_VKEYB_KEY_H + 1, COLOR_GRAY, bg); + msm_vkeyb_puts(label, x + (w - MSM_VKEYB_FONT_COLS * strlen(label)) / 2, y + (MSM_VKEYB_KEY_H - MSM_VKEYB_FONT_ROWS) / 2, fg); + x += w; + } + y += MSM_VKEYB_KEY_H; + } +} + +void msm_vkeyb_handle_ts_event(int x, int y, int touched) +{ + int i, j, key; + +// printk(KERN_WARNING "msm_vkeyb_handle_ts_event(%d, %d, %d)\n", x, y, touched); + + if (touched == -1) { + /* Just redraw the keyboard */ + } else if (x >= MSM_VKEYB_LEFT && x < MSM_VKEYB_LEFT + MSM_VKEYB_KEY_W * MSM_VKEYB_COLS + && y >= MSM_VKEYB_TOP && y < MSM_VKEYB_TOP + MSM_VKEYB_KEY_H * MSM_VKEYB_ROWS) { + j = (x - MSM_VKEYB_LEFT) / MSM_VKEYB_KEY_W; + i = (y - MSM_VKEYB_TOP) / MSM_VKEYB_KEY_H; + key = vkeyb_keyboard[i][j]; + if(touched) { + vkeyb_active_key = key; + } else { + vkeyb_active_key = 0; + if (vkeyb_key_sticky[key]) { + vkeyb_key_state[key] = 1 - vkeyb_key_state[key]; + if (key == KEY_CAPSLOCK) { + /* Caps lock is special, we generate key press then key release to toggle it for the system */ + input_event(msm_vkeyb_dev, EV_KEY, key, 1); + input_sync(msm_vkeyb_dev); + input_event(msm_vkeyb_dev, EV_KEY, key, 0); + input_sync(msm_vkeyb_dev); + } else { + input_event(msm_vkeyb_dev, EV_KEY, key, vkeyb_key_state[key]); + input_sync(msm_vkeyb_dev); + } + } else { + input_event(msm_vkeyb_dev, EV_KEY, key, 1); + input_sync(msm_vkeyb_dev); + input_event(msm_vkeyb_dev, EV_KEY, key, 0); + input_sync(msm_vkeyb_dev); + for (i = 0; i < MSM_VKEYB_LAST_KEY; i++) { + if (vkeyb_key_sticky[i] && vkeyb_key_auto_reset[i] && vkeyb_key_state[i]) { + vkeyb_key_state[i] = 0; + input_event(msm_vkeyb_dev, EV_KEY, i, 0); + input_sync(msm_vkeyb_dev); + } + } + } + } + } else { + vkeyb_active_key = 0; + } + + msm_vkeyb_draw_keyboard(); +} + +static int __init msm_vkeyb_init(void) +{ + int err, i, j; + + msm_vkeyb_dev = input_allocate_device(); + if (!msm_vkeyb_dev) + return -ENOMEM; + + msm_vkeyb_dev->evbit[0] = BIT_MASK(EV_KEY); + + msm_vkeyb_dev->name = "MSM on-screen virtual keyboard"; + msm_vkeyb_dev->phys = "msm_vkeyb/input0"; + + for (i = 0; i < MSM_VKEYB_ROWS; i++) { + for (j = 0; j < MSM_VKEYB_COLS; j++) { + if (!j || vkeyb_keyboard[i][j] != vkeyb_keyboard[i][j - 1]) { + input_set_capability(msm_vkeyb_dev, EV_KEY, vkeyb_keyboard[i][j]); + } + } + } + + err = input_register_device(msm_vkeyb_dev); + if (err) { + input_free_device(msm_vkeyb_dev); + return err; + } + + msm_ts_handler = msm_vkeyb_handle_ts_event; + + return 0; +} + +static void __exit msm_vkeyb_exit(void) +{ + msm_ts_handler = NULL; + input_unregister_device(msm_vkeyb_dev); +} + +module_init(msm_vkeyb_init); +module_exit(msm_vkeyb_exit); + +MODULE_AUTHOR("Octavian Voicu, octavian.voicu@gmail.com"); +MODULE_DESCRIPTION("MSM on-screen virtual keyboard driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig index 9de1c11..319f9a3 100644 --- a/drivers/video/logo/Kconfig +++ b/drivers/video/logo/Kconfig @@ -27,6 +27,10 @@ config LOGO_LINUX_CLUT224 bool "Standard 224-color Linux logo" default y +config LOGO_DIAMRAPH_CLUT224 + bool "224-color Diamond/Raphael Linux logo" + default y + config LOGO_DEC_CLUT224 bool "224-color Digital Equipment Corporation Linux logo" depends on MACH_DECSTATION || ALPHA diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile index a5fc4ed..f49b7b7 100644 --- a/drivers/video/logo/Makefile +++ b/drivers/video/logo/Makefile @@ -4,6 +4,7 @@ obj-$(CONFIG_LOGO) += logo.o obj-$(CONFIG_LOGO_LINUX_MONO) += logo_linux_mono.o obj-$(CONFIG_LOGO_LINUX_VGA16) += logo_linux_vga16.o obj-$(CONFIG_LOGO_LINUX_CLUT224) += logo_linux_clut224.o +obj-$(CONFIG_LOGO_DIAMRAPH_CLUT224) += logo_diamraph_clut224.o obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o obj-$(CONFIG_LOGO_PARISC_CLUT224) += logo_parisc_clut224.o diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c index fc72684..599c2f3 100644 --- a/drivers/video/logo/logo.c +++ b/drivers/video/logo/logo.c @@ -33,6 +33,7 @@ extern const struct linux_logo logo_superh_mono; extern const struct linux_logo logo_superh_vga16; extern const struct linux_logo logo_superh_clut224; extern const struct linux_logo logo_m32r_clut224; +extern const struct linux_logo logo_diamraph_clut224; static int nologo; module_param(nologo, bool, 0); @@ -105,6 +106,10 @@ const struct linux_logo * __init_refok fb_find_logo(int depth) /* M32R Linux logo */ logo = &logo_m32r_clut224; #endif +#ifdef CONFIG_LOGO_DIAMRAPH_CLUT224 + /* Diamond/Raphael logo */ + logo = &logo_diamraph_clut224; +#endif } return logo; } diff --git a/drivers/video/logo/logo_diamraph_clut224.ppm b/drivers/video/logo/logo_diamraph_clut224.ppm new file mode 100644 index 0000000..cb029df --- /dev/null +++ b/drivers/video/logo/logo_diamraph_clut224.ppm @@ -0,0 +1,1603 @@ +P3 +80 80 +255 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 2 4 0 16 16 18 16 8 19 2 4 +0 16 16 19 2 4 0 16 16 19 2 4 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 16 16 19 18 18 +19 18 18 19 18 18 36 36 36 16 33 33 +36 36 36 36 36 36 19 18 18 19 18 18 +19 18 18 0 16 16 0 16 16 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +18 16 8 19 18 18 19 18 18 36 36 36 +53 52 52 71 70 70 71 70 70 71 70 70 +71 70 70 71 70 70 71 70 70 53 52 52 +36 36 36 19 18 18 19 18 18 19 2 4 +18 16 8 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +19 18 18 36 36 36 71 70 70 84 84 84 +71 70 70 36 36 36 53 52 52 19 18 18 +19 18 18 36 36 36 53 52 52 71 70 70 +84 84 84 71 70 70 53 52 52 19 18 18 +19 18 18 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 16 16 19 18 18 +53 52 52 84 84 84 68 54 54 0 16 16 +0 0 1 0 0 1 0 16 16 0 0 1 +0 16 16 0 0 1 0 16 16 0 0 1 +19 2 4 53 52 52 84 84 84 71 70 70 +36 36 36 19 18 18 18 16 8 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 19 18 18 53 52 52 +71 70 70 36 36 36 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 16 16 +0 0 1 0 0 1 0 0 1 0 16 16 +0 0 1 0 0 1 0 16 16 71 70 70 +71 70 70 53 52 52 19 18 18 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +18 16 8 19 18 18 36 36 36 84 84 84 +19 18 18 0 16 16 0 0 1 0 16 16 +0 0 1 0 0 1 0 16 16 0 0 1 +0 0 1 0 16 16 0 0 1 0 16 16 +53 52 52 36 36 36 0 0 1 0 16 16 +36 36 36 71 70 70 53 52 52 19 18 18 +0 16 16 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 36 36 36 71 70 70 53 52 52 +0 0 1 0 0 1 0 16 16 0 0 1 +0 16 16 0 16 16 0 0 1 0 16 16 +0 16 16 0 0 1 0 16 16 19 18 18 +84 84 84 104 103 103 53 52 52 19 2 4 +0 0 1 53 52 52 71 70 70 36 36 36 +19 2 4 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 18 18 36 36 36 84 84 84 0 16 16 +0 16 16 0 0 1 0 16 16 0 0 1 +0 16 16 0 0 1 0 0 1 0 16 16 +0 0 1 0 16 16 0 0 1 36 36 36 +84 84 84 101 90 90 53 52 52 19 18 18 +0 0 1 0 16 16 71 70 70 53 52 52 +19 18 18 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +16 33 33 68 54 54 71 70 70 0 0 1 +0 0 1 0 16 16 0 0 1 0 16 16 +0 0 1 0 16 16 0 16 16 0 0 1 +0 16 16 0 0 1 0 0 1 16 33 33 +53 52 52 53 52 52 19 18 18 0 16 16 +0 16 16 0 0 1 36 36 36 84 84 84 +51 37 37 19 18 18 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 16 16 +36 36 36 71 70 70 36 36 36 0 0 1 +0 0 1 0 16 16 0 16 16 0 0 1 +0 16 16 0 0 1 0 16 16 0 0 1 +0 0 1 0 16 16 0 0 1 0 16 16 +0 16 16 0 0 1 0 16 16 0 0 1 +0 0 1 0 0 1 0 0 1 71 70 70 +53 52 52 19 18 18 18 16 8 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +36 36 36 84 84 84 19 18 18 0 16 16 +0 16 16 0 0 1 0 16 16 0 0 1 +0 0 1 0 16 16 0 0 1 0 0 1 +0 16 16 0 0 1 0 0 1 0 16 16 +0 0 1 0 16 16 0 0 1 0 0 1 +0 16 16 0 0 1 0 16 16 53 52 52 +71 70 70 19 18 18 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +36 36 36 84 84 84 0 0 1 0 0 1 +0 0 1 0 16 16 19 2 4 0 16 16 +0 0 1 0 0 1 0 0 1 0 16 16 +0 0 1 0 0 1 0 0 1 0 16 16 +19 18 18 19 2 4 0 0 1 0 16 16 +0 0 1 0 16 16 0 0 1 19 18 18 +84 84 84 36 36 36 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +53 52 52 84 84 84 0 0 1 0 16 16 +0 16 16 19 2 4 19 18 18 36 36 36 +0 16 16 0 16 16 0 16 16 0 0 1 +0 0 1 0 16 16 19 18 18 16 33 33 +0 0 1 53 52 52 16 33 33 0 0 1 +0 16 16 0 0 1 0 16 16 19 2 4 +84 84 84 36 36 36 19 18 18 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +53 52 52 71 70 70 0 0 1 0 0 1 +36 36 36 118 117 117 84 84 84 19 18 18 +33 18 18 0 0 1 0 16 16 0 16 16 +19 18 18 84 84 84 135 135 135 170 169 169 +165 153 153 36 36 36 16 33 33 19 2 4 +0 16 16 0 0 1 0 0 1 0 16 16 +71 70 70 53 52 52 19 18 18 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +53 52 52 84 84 84 0 16 16 19 18 18 +135 135 135 199 198 198 199 198 198 118 117 117 +0 16 16 0 0 1 0 0 1 19 2 4 +101 90 90 188 184 184 219 218 218 219 218 218 +219 218 218 135 135 135 19 18 18 0 0 1 +0 0 1 0 16 16 0 0 1 0 0 1 +84 84 84 53 52 52 19 18 18 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +51 37 37 84 84 84 0 0 1 53 52 52 +219 218 218 199 198 198 219 218 218 235 235 234 +53 52 52 0 0 1 0 0 1 16 33 33 +219 218 218 254 252 252 170 169 169 118 117 117 +219 218 218 235 235 234 71 70 70 0 16 16 +0 16 16 0 0 1 0 16 16 0 0 1 +71 70 70 53 52 52 16 33 33 19 2 4 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +53 52 52 84 84 84 0 0 1 104 103 103 +170 169 169 16 33 33 84 84 84 219 218 218 +135 135 135 0 0 1 19 18 18 53 52 52 +235 235 234 188 184 184 19 18 18 71 70 70 +101 90 90 235 235 234 165 153 153 0 0 1 +0 0 1 0 16 16 0 16 16 0 0 1 +71 70 70 53 52 52 33 18 18 0 16 16 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +16 33 33 84 84 84 0 16 16 118 117 117 +118 117 117 0 0 1 71 70 70 152 152 152 +135 135 135 18 16 8 36 36 36 71 70 70 +219 218 218 104 103 103 0 0 1 19 18 18 +53 52 52 188 184 184 199 198 198 0 0 1 +0 0 1 0 16 16 0 0 1 0 16 16 +84 70 70 71 70 70 19 18 18 19 2 4 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +51 37 37 84 84 84 19 18 18 104 103 103 +135 135 135 0 0 1 19 18 18 118 117 117 +115 99 49 121 85 8 121 85 8 86 57 8 +170 169 169 104 103 103 0 16 16 0 0 1 +0 16 16 199 198 198 199 198 198 0 0 1 +0 0 1 0 0 1 0 16 16 0 0 1 +71 70 70 71 70 70 16 33 33 0 16 16 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 18 16 8 +53 52 52 84 84 84 19 18 18 53 52 52 +219 218 218 19 18 18 53 37 8 156 115 8 +221 168 8 236 201 16 221 168 8 181 148 8 +206 165 16 165 132 66 33 21 8 0 16 16 +71 70 70 254 252 252 135 135 135 0 16 16 +0 16 16 0 0 1 0 0 1 0 16 16 +71 70 70 71 70 70 19 18 18 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +36 36 36 84 70 70 19 18 18 0 16 16 +199 198 198 189 165 115 187 132 8 218 173 16 +238 182 8 222 181 16 236 201 16 236 201 16 +247 206 41 236 201 16 236 201 16 181 148 8 +222 198 132 220 203 202 36 36 36 0 0 1 +0 0 1 0 16 16 0 16 16 0 0 1 +53 52 52 71 70 70 36 36 36 19 2 4 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +36 36 36 84 84 84 19 18 18 0 0 1 +123 90 24 187 132 8 232 173 16 232 173 16 +236 201 16 236 201 16 247 214 16 247 216 57 +247 216 57 247 219 41 247 214 16 236 201 16 +236 201 16 222 181 16 123 90 24 0 0 1 +0 16 16 0 0 1 0 16 16 0 16 16 +53 52 52 84 84 84 36 36 36 0 16 16 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +16 33 33 84 84 84 36 36 36 53 37 8 +181 123 8 201 148 8 231 173 8 239 185 16 +238 182 8 247 214 16 236 201 16 247 222 74 +247 219 41 247 214 16 247 214 16 247 214 16 +222 181 16 218 173 16 181 148 8 0 16 16 +0 0 1 0 16 16 0 0 1 0 0 1 +19 18 18 84 84 84 36 36 36 19 18 18 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +36 36 36 71 70 70 53 52 52 103 69 8 +187 132 8 214 153 8 238 182 8 238 182 8 +236 201 16 236 201 16 247 216 57 247 219 41 +247 214 16 247 214 16 247 214 16 201 148 8 +198 140 8 214 153 8 156 115 8 0 0 1 +0 16 16 0 0 1 0 0 1 0 0 1 +0 16 16 84 84 84 53 52 52 19 18 18 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 18 16 8 +36 36 36 71 70 70 53 52 52 19 18 18 +137 86 8 221 168 8 239 185 16 236 201 16 +236 201 16 236 201 16 247 214 16 247 214 16 +236 201 16 206 165 16 187 132 8 214 153 8 +214 153 8 214 153 8 103 69 8 0 0 1 +0 16 16 68 54 54 19 18 18 0 16 16 +0 0 1 71 70 70 71 70 70 36 36 36 +18 16 8 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +36 36 36 71 70 70 53 52 52 0 16 16 +84 68 33 140 99 16 201 148 8 222 181 16 +231 198 33 236 201 16 218 173 16 189 148 16 +168 116 8 187 132 8 214 153 8 214 153 8 +206 148 33 181 156 107 99 99 90 19 2 4 +19 2 4 84 70 70 118 117 117 53 52 52 +0 0 1 16 33 33 84 84 84 53 52 52 +19 18 18 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 18 16 8 +36 36 36 84 70 70 53 52 52 19 2 4 +135 135 135 173 153 115 152 103 8 168 116 8 +201 148 8 181 148 8 198 140 8 201 148 8 +201 148 8 198 140 8 198 140 8 189 165 115 +202 185 185 199 198 198 185 165 165 19 18 18 +19 2 4 33 18 18 119 107 107 118 117 117 +33 18 18 0 16 16 84 70 70 71 70 70 +36 36 36 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 19 2 4 19 18 18 +53 52 52 99 99 90 19 18 18 0 16 16 +152 152 152 188 184 184 173 153 115 156 115 8 +189 148 16 201 148 8 198 140 8 187 132 8 +181 123 8 185 136 33 189 173 140 188 184 184 +202 185 185 220 203 202 237 183 183 83 52 52 +36 0 3 36 0 3 83 38 38 68 54 54 +19 2 4 0 16 16 19 2 4 84 84 84 +53 52 52 19 18 18 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 16 16 36 36 36 +71 70 70 71 70 70 0 0 1 0 0 1 +152 152 152 199 198 198 188 184 184 181 165 148 +156 123 53 152 103 8 152 103 8 169 123 41 +173 153 115 188 184 184 201 170 169 217 187 186 +253 218 218 254 201 201 254 201 201 202 151 151 +71 20 20 52 1 3 52 1 3 33 18 18 +19 18 18 19 2 4 0 16 16 71 70 70 +71 70 70 36 36 36 19 18 18 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 18 16 8 19 18 18 53 52 52 +84 84 84 19 18 18 0 0 1 53 52 52 +235 235 234 219 218 218 188 184 184 188 184 184 +188 184 184 188 184 184 188 184 184 188 184 184 +202 185 185 188 184 184 218 170 170 254 201 201 +253 184 184 237 170 170 169 100 100 83 52 52 +165 153 153 167 115 115 68 0 1 52 1 3 +36 0 3 19 2 4 19 2 4 19 18 18 +84 84 84 53 52 52 19 18 18 19 18 18 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 19 18 18 53 52 52 84 84 84 +53 52 52 19 18 18 0 16 16 188 184 184 +254 252 252 235 235 234 199 198 198 188 184 184 +188 184 184 202 185 185 201 170 169 201 170 169 +218 170 170 232 203 202 254 201 201 253 184 184 +203 136 136 19 2 4 51 37 37 139 69 69 +154 86 86 219 218 218 201 170 169 52 1 3 +52 1 3 19 2 4 19 2 4 0 0 1 +36 36 36 84 84 84 36 36 36 19 18 18 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +19 18 18 36 36 36 71 70 70 71 70 70 +0 0 1 19 2 4 84 84 84 254 252 252 +254 252 252 252 236 236 235 220 217 202 185 185 +201 170 169 201 170 169 201 170 169 237 170 170 +237 183 183 237 183 183 121 88 88 254 169 169 +220 135 135 19 2 4 187 100 100 254 137 137 +254 137 137 151 52 52 252 236 236 167 115 115 +52 1 3 52 1 3 19 18 18 0 16 16 +0 0 1 71 70 70 71 70 70 36 36 36 +19 18 18 0 16 16 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +36 36 36 71 70 70 71 70 70 19 2 4 +0 0 1 19 18 18 220 203 202 252 236 236 +252 236 236 253 218 218 253 218 218 254 201 201 +237 183 183 237 170 170 237 170 170 254 169 169 +254 153 153 239 152 152 19 2 4 187 100 100 +254 137 137 71 20 20 104 53 53 254 118 118 +254 137 137 220 87 87 185 137 137 220 203 202 +68 0 1 33 18 18 19 2 4 19 2 4 +0 16 16 19 18 18 84 84 84 71 70 70 +36 36 36 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 16 16 19 18 18 +53 52 52 84 84 84 19 18 18 0 0 1 +0 16 16 119 107 107 252 236 236 253 218 218 +253 218 218 254 201 201 254 201 201 253 184 184 +254 169 169 140 86 86 0 0 1 139 69 69 +254 137 137 254 137 137 121 66 66 83 38 38 +254 118 118 171 71 71 18 16 8 237 103 103 +254 118 118 236 133 133 169 100 100 235 220 217 +52 1 3 52 1 3 19 2 4 0 16 16 +0 0 1 0 16 16 19 18 18 101 90 90 +53 52 52 19 18 18 0 16 16 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 19 18 18 53 52 52 +84 84 84 36 36 36 0 16 16 19 2 4 +33 18 18 201 170 169 253 218 218 254 201 201 +254 201 201 237 170 170 220 148 148 254 153 153 +254 153 153 154 86 86 19 2 4 19 18 18 +106 37 37 255 105 105 206 87 87 19 2 4 +220 87 87 255 105 105 33 18 18 139 69 69 +254 137 137 239 156 70 154 101 101 235 220 217 +68 0 1 52 1 3 19 2 4 19 2 4 +0 16 16 0 0 1 0 0 1 36 36 36 +84 84 84 53 52 52 19 18 18 19 2 4 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 19 18 18 36 36 36 84 84 84 +36 36 36 19 2 4 19 2 4 36 0 3 +68 36 36 202 151 151 253 184 184 220 148 148 +104 70 70 18 16 8 0 0 1 51 37 37 +189 87 87 237 103 103 18 16 8 151 52 52 +52 1 3 71 20 20 220 87 87 71 20 20 +136 53 53 255 105 105 139 69 69 51 37 37 +237 123 123 169 100 100 156 134 134 154 101 101 +52 1 3 33 18 18 19 2 4 0 16 16 +0 16 16 0 0 1 0 0 1 0 16 16 +53 52 52 84 84 84 36 36 36 19 18 18 +18 16 8 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 18 18 33 18 18 68 54 54 71 70 70 +19 2 4 36 0 3 52 1 3 51 20 20 +104 53 53 200 117 117 220 148 148 68 54 54 +104 70 70 220 135 135 237 123 123 104 70 70 +51 37 37 236 90 90 118 52 52 71 20 20 +255 90 90 83 38 38 33 18 18 136 53 53 +68 54 54 237 103 103 206 87 87 68 54 54 +84 70 70 84 70 70 154 101 101 71 20 20 +52 1 3 19 2 4 19 2 4 19 2 4 +0 0 1 0 0 1 0 16 16 0 0 1 +0 0 1 71 70 70 71 70 70 16 33 33 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +33 18 18 51 37 37 104 70 70 33 18 18 +33 18 18 52 1 3 68 0 1 167 115 115 +155 71 71 219 107 107 169 100 100 36 36 36 +254 153 153 254 137 137 254 137 137 254 118 118 +68 36 36 139 69 69 206 87 87 19 2 4 +220 87 87 255 105 105 139 69 69 19 18 18 +19 18 18 173 84 84 237 123 123 140 86 86 +169 100 100 220 135 135 218 170 170 173 135 135 +33 18 18 33 18 18 53 52 52 19 18 18 +0 16 16 0 0 1 0 0 1 0 16 16 +0 0 1 0 0 1 84 70 70 53 52 52 +19 18 18 18 16 8 0 0 1 19 2 4 +0 0 1 19 2 4 19 2 4 0 0 1 +0 0 1 19 2 4 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +19 2 4 19 2 4 19 2 4 36 0 3 +51 20 20 83 52 52 104 53 53 52 1 3 +52 1 3 83 1 1 173 135 135 235 235 234 +140 86 86 254 118 118 155 71 71 33 18 18 +254 137 137 254 137 137 254 137 137 254 118 118 +139 69 69 33 18 18 255 105 105 68 36 36 +139 69 69 254 137 137 254 137 137 169 100 100 +33 18 18 140 86 86 254 169 169 253 184 184 +237 183 183 218 170 170 202 151 151 232 203 202 +101 90 90 19 2 4 0 16 16 36 36 36 +36 36 36 0 16 16 0 16 16 0 0 1 +0 0 1 0 0 1 71 70 70 71 70 70 +33 18 18 19 2 4 19 2 4 19 2 4 +19 2 4 19 2 4 19 2 4 19 2 4 +19 2 4 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 2 4 0 0 1 19 2 4 19 2 4 +19 2 4 36 0 3 36 0 3 51 20 20 +85 18 18 121 66 66 106 37 37 68 0 1 +103 16 16 117 18 18 202 151 151 156 134 134 +33 18 18 237 103 103 184 70 70 0 0 1 +200 107 107 254 137 137 254 137 137 254 137 137 +155 71 71 36 36 36 254 118 118 154 86 86 +36 36 36 254 137 137 254 169 169 254 169 169 +253 184 184 253 184 184 254 201 201 254 201 201 +253 218 218 253 218 218 232 203 202 199 198 198 +220 203 202 19 18 18 0 0 1 0 0 1 +36 36 36 19 18 18 0 0 1 0 16 16 +0 0 1 0 0 1 19 18 18 84 84 84 +51 37 37 33 18 18 36 0 3 36 0 3 +52 1 3 36 0 3 36 0 3 36 0 3 +36 0 3 19 2 4 19 2 4 19 2 4 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 2 4 19 2 4 36 0 3 36 0 3 +52 1 3 52 1 3 68 0 1 83 1 1 +167 115 115 165 153 153 186 115 115 103 0 0 +136 18 18 120 0 0 202 151 151 104 53 53 +51 20 20 136 53 53 255 105 105 51 20 20 +118 52 52 254 153 153 254 137 137 254 137 137 +154 86 86 16 33 33 254 137 137 236 133 133 +121 88 88 254 169 169 253 184 184 253 184 184 +254 201 201 254 201 201 253 218 218 252 236 236 +252 236 236 252 236 236 252 236 236 219 218 218 +219 218 218 104 103 103 0 0 1 19 18 18 +19 18 18 36 36 36 19 2 4 19 2 4 +19 2 4 19 18 18 19 2 4 104 70 70 +83 52 52 51 20 20 52 1 3 52 1 3 +85 18 18 68 0 1 153 115 115 153 115 115 +52 1 3 36 0 3 19 2 4 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 2 4 19 2 4 19 2 4 19 2 4 +36 0 3 52 1 3 52 1 3 85 18 18 +173 135 135 139 69 69 83 1 1 120 0 0 +169 100 100 170 169 169 235 220 217 186 115 115 +151 1 1 135 0 0 169 100 100 106 37 37 +136 53 53 51 20 20 255 105 105 155 71 71 +19 2 4 154 86 86 222 121 121 154 86 86 +36 36 36 154 101 101 254 137 137 236 133 133 +236 133 133 254 169 169 253 184 184 254 201 201 +253 218 218 252 236 236 252 236 236 252 236 236 +254 252 252 254 252 252 254 252 252 235 235 234 +235 235 234 199 198 198 0 16 16 36 36 36 +53 52 52 33 18 18 51 37 37 19 18 18 +19 2 4 33 18 18 33 18 18 83 38 38 +121 66 66 85 18 18 104 53 53 185 137 137 +252 236 236 139 69 69 154 101 101 252 236 236 +85 18 18 52 1 3 19 2 4 19 2 4 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 2 4 19 2 4 19 2 4 19 2 4 +36 0 3 36 0 3 36 0 3 36 0 3 +52 1 3 52 1 3 68 0 1 154 101 101 +252 236 236 252 236 236 151 34 34 150 18 18 +171 35 35 202 185 185 200 117 117 202 185 185 +200 107 107 165 8 8 118 52 52 106 37 37 +236 90 90 19 2 4 189 87 87 254 137 137 +139 69 69 19 18 18 0 0 1 53 52 52 +153 115 115 254 137 137 171 71 71 51 20 20 +36 0 3 104 53 53 254 169 169 253 184 184 +253 218 218 252 236 236 252 236 236 252 236 236 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 51 37 37 36 36 36 +51 37 37 33 18 18 51 37 37 52 1 3 +36 0 3 52 1 3 52 1 3 68 0 1 +136 53 53 173 135 135 235 235 234 185 137 137 +136 53 53 103 0 0 117 18 18 252 236 236 +154 101 101 52 1 3 52 1 3 36 0 3 +19 2 4 19 2 4 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +19 2 4 19 2 4 36 0 3 52 1 3 +52 1 3 52 1 3 68 0 1 202 185 185 +140 86 86 83 1 1 83 1 1 134 35 35 +235 220 217 186 115 115 235 220 217 186 37 37 +186 37 37 203 136 136 218 170 170 186 37 37 +252 236 236 173 84 84 99 49 41 106 37 37 +254 118 118 83 52 52 104 53 53 254 153 153 +254 169 169 239 152 152 220 148 148 239 152 152 +254 153 153 200 107 107 52 1 3 206 87 87 +206 87 87 0 0 1 222 121 121 254 169 169 +254 201 201 252 236 236 252 236 236 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +252 236 236 254 252 252 101 90 90 19 2 4 +19 2 4 36 0 3 52 1 3 85 18 18 +137 99 99 173 135 135 83 1 1 103 0 0 +151 34 34 173 135 135 201 170 169 120 0 0 +135 0 0 120 0 0 103 0 0 203 136 136 +217 187 186 83 1 1 52 1 3 52 1 3 +36 0 3 19 2 4 0 0 1 0 0 1 +0 0 1 0 0 1 19 2 4 19 2 4 +36 0 3 52 1 3 52 1 3 52 1 3 +68 0 1 83 1 1 83 1 1 202 151 151 +217 187 186 103 0 0 120 0 0 150 18 18 +235 220 217 151 1 1 202 151 151 185 165 165 +186 37 37 183 54 54 220 203 202 171 35 35 +184 70 70 53 52 52 33 18 18 104 53 53 +254 137 137 200 117 117 68 54 54 254 169 169 +253 184 184 254 201 201 253 184 184 237 183 183 +253 184 184 200 107 107 36 0 3 220 87 87 +165 49 49 51 20 20 254 118 118 139 69 69 +220 148 148 254 201 201 253 218 218 252 236 236 +252 236 236 254 252 252 254 252 252 252 236 236 +252 236 236 252 236 236 156 134 134 36 0 3 +36 0 3 52 1 3 52 1 3 106 37 37 +235 220 217 252 236 236 185 137 137 120 0 0 +150 18 18 171 71 71 235 220 217 165 49 49 +186 115 115 232 203 202 136 18 18 151 52 52 +254 252 252 136 53 53 83 1 1 68 0 1 +36 0 3 19 2 4 19 2 4 0 0 1 +0 0 1 19 2 4 19 2 4 36 0 3 +52 1 3 85 18 18 167 115 115 217 187 186 +202 185 185 169 100 100 120 0 0 139 69 69 +252 236 236 151 34 34 135 0 0 151 34 34 +252 236 236 165 24 24 183 54 54 165 153 153 +202 151 151 151 1 1 201 170 169 200 117 117 +171 35 35 189 87 87 19 2 4 104 70 70 +254 169 169 253 184 184 254 201 201 253 218 218 +253 218 218 253 218 218 253 218 218 254 201 201 +253 184 184 254 153 153 118 52 52 19 18 18 +33 18 18 183 54 54 255 105 105 68 36 36 +139 69 69 253 184 184 254 201 201 253 218 218 +252 236 236 253 218 218 253 218 218 253 218 218 +252 236 236 253 218 218 202 151 151 68 36 36 +153 115 115 68 0 1 83 1 1 136 18 18 +202 151 151 186 115 115 235 220 217 200 117 117 +165 8 8 186 37 37 201 170 169 235 235 234 +218 170 170 171 71 71 120 0 0 120 0 0 +220 203 202 185 137 137 103 16 16 137 99 99 +153 115 115 36 0 3 19 2 4 19 2 4 +0 0 1 19 2 4 19 2 4 52 1 3 +153 115 115 252 236 236 218 170 170 169 100 100 +186 115 115 252 236 236 186 115 115 135 0 0 +220 203 202 200 117 117 135 0 0 151 34 34 +254 252 252 218 170 170 188 184 184 187 100 100 +235 220 217 202 151 151 169 100 100 235 220 217 +189 87 87 254 153 153 203 136 136 237 170 170 +254 201 201 254 201 201 253 218 218 252 236 236 +252 236 236 252 236 236 235 220 217 254 201 201 +254 201 201 254 153 153 254 137 137 51 20 20 +33 18 18 19 2 4 136 53 53 83 38 38 +104 53 53 254 169 169 254 169 169 254 201 201 +254 201 201 254 201 201 254 201 201 254 201 201 +253 184 184 253 184 184 220 148 148 85 18 18 +252 236 236 139 69 69 103 0 0 136 18 18 +202 151 151 187 100 100 183 54 54 252 236 236 +200 117 117 186 37 37 187 100 100 235 220 217 +135 0 0 135 0 0 120 0 0 103 0 0 +169 100 100 252 236 236 252 236 236 220 203 202 +137 99 99 19 2 4 19 2 4 0 0 1 +0 0 1 19 2 4 19 2 4 52 1 3 +154 101 101 252 236 236 117 18 18 120 0 0 +120 0 0 173 84 84 254 252 252 171 71 71 +200 117 117 235 220 217 135 0 0 151 34 34 +235 235 234 169 100 100 165 49 49 120 0 0 +106 37 37 202 185 185 136 53 53 173 135 135 +220 148 148 253 184 184 254 201 201 253 218 218 +253 218 218 252 236 236 252 236 236 252 236 236 +254 252 252 254 252 252 235 235 234 253 218 218 +254 201 201 253 184 184 169 100 100 33 18 18 +255 90 90 151 52 52 68 36 36 0 16 16 +51 37 37 104 70 70 239 152 152 254 169 169 +253 184 184 254 169 169 254 169 169 167 115 115 +68 36 36 254 153 153 236 133 133 103 0 0 +218 170 170 201 170 169 120 0 0 150 18 18 +202 151 151 200 117 117 150 18 18 189 165 115 +252 236 236 171 71 71 171 35 35 235 220 217 +173 84 84 136 18 18 186 115 115 185 137 137 +103 16 16 173 135 135 121 66 66 52 1 3 +36 0 3 19 2 4 19 2 4 0 0 1 +0 0 1 19 2 4 36 0 3 52 1 3 +85 18 18 252 236 236 169 100 100 120 0 0 +135 0 0 135 0 0 220 203 202 203 136 136 +150 18 18 252 236 236 173 84 84 151 34 34 +235 235 234 151 52 52 136 53 53 83 1 1 +68 0 1 103 16 16 68 0 1 71 20 20 +232 203 202 253 218 218 253 218 218 252 236 236 +252 236 236 252 236 236 254 252 252 254 252 252 +254 252 252 254 252 252 219 218 218 235 220 217 +253 218 218 253 184 184 154 101 101 18 16 8 +237 103 103 255 105 105 139 69 69 51 37 37 +154 101 101 121 88 88 220 148 148 200 117 117 +104 53 53 104 53 53 222 121 121 222 121 121 +19 2 4 187 100 100 237 123 123 120 0 0 +173 84 84 252 236 236 150 18 18 165 8 8 +220 148 148 232 203 202 252 236 236 237 183 183 +203 136 136 188 184 184 171 71 71 202 151 151 +235 220 217 235 220 217 217 187 186 140 86 86 +68 0 1 68 0 1 52 1 3 52 1 3 +19 2 4 19 2 4 19 2 4 0 0 1 +0 0 1 19 2 4 19 2 4 52 1 3 +68 0 1 185 137 137 217 187 186 120 0 0 +120 0 0 135 0 0 202 151 151 201 170 169 +120 0 0 202 151 151 217 187 186 117 18 18 +217 187 186 139 69 69 68 0 1 52 1 3 +52 1 3 68 36 36 52 1 3 68 36 36 +253 218 218 252 236 236 252 236 236 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 235 220 217 235 235 234 +253 218 218 254 201 201 237 170 170 51 37 37 +16 33 33 36 36 36 68 54 54 222 121 121 +254 137 137 236 133 133 83 38 38 71 20 20 +139 69 69 68 36 36 33 18 18 237 103 103 +68 36 36 106 37 37 171 71 71 217 187 186 +252 236 236 235 235 234 186 115 115 136 18 18 +202 151 151 217 187 186 151 34 34 120 0 0 +120 0 0 169 100 100 167 115 115 136 53 53 +167 115 115 117 18 18 52 1 3 52 1 3 +52 1 3 36 0 3 36 0 3 19 2 4 +19 2 4 19 2 4 0 0 1 0 0 1 +0 0 1 0 0 1 19 2 4 36 0 3 +68 0 1 118 52 52 254 252 252 151 52 52 +120 0 0 120 0 0 218 170 170 202 151 151 +103 0 0 136 53 53 167 115 115 71 20 20 +83 38 38 121 66 66 36 0 3 36 0 3 +33 18 18 84 70 70 51 37 37 68 54 54 +252 236 236 254 252 252 252 236 236 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +252 236 236 254 252 252 235 220 217 252 236 236 +253 218 218 254 201 201 253 184 184 254 169 169 +167 115 115 200 117 117 254 137 137 254 137 137 +254 137 137 254 137 137 85 18 18 139 69 69 +254 118 118 237 103 103 18 16 8 171 71 71 +171 71 71 0 0 1 68 36 36 186 115 115 +150 18 18 186 115 115 201 170 169 135 0 0 +202 151 151 202 151 151 103 0 0 68 0 1 +68 0 1 118 52 52 118 52 52 85 18 18 +52 1 3 52 1 3 36 0 3 36 0 3 +19 2 4 19 2 4 19 2 4 19 2 4 +19 2 4 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 19 2 4 36 0 3 +52 1 3 68 0 1 217 187 186 185 137 137 +117 18 18 186 115 115 252 236 236 106 37 37 +68 0 1 68 0 1 52 1 3 51 20 20 +83 52 52 83 52 52 19 2 4 19 2 4 +0 0 1 36 36 36 51 37 37 71 70 70 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 252 236 236 +252 236 236 252 236 236 232 203 202 253 218 218 +253 218 218 254 201 201 253 184 184 254 153 153 +254 153 153 155 71 71 155 71 71 254 137 137 +254 137 137 254 137 137 139 69 69 51 20 20 +254 118 118 236 90 90 19 2 4 189 87 87 +254 118 118 33 18 18 139 69 69 117 18 18 +120 0 0 136 18 18 219 218 218 139 69 69 +167 115 115 167 115 115 68 0 1 52 1 3 +52 1 3 104 53 53 83 52 52 51 20 20 +36 0 3 36 0 3 19 2 4 19 2 4 +19 2 4 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 19 2 4 19 2 4 +36 0 3 52 1 3 154 101 101 252 236 236 +252 236 236 217 187 186 118 52 52 68 0 1 +52 1 3 36 0 3 36 0 3 51 20 20 +68 54 54 68 54 54 0 0 1 0 16 16 +0 0 1 0 16 16 33 18 18 71 70 70 +235 235 234 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 252 236 236 252 236 236 +252 236 236 253 218 218 237 183 183 237 183 183 +253 184 184 253 184 184 254 169 169 254 169 169 +236 133 133 19 2 4 33 18 18 173 84 84 +254 118 118 254 118 118 237 103 103 19 18 18 +118 52 52 51 20 20 106 37 37 254 137 137 +254 153 153 139 69 69 84 70 70 103 0 0 +103 16 16 117 18 18 173 135 135 153 115 115 +85 18 18 83 1 1 52 1 3 36 0 3 +19 2 4 84 84 84 68 54 54 33 18 18 +18 16 8 19 2 4 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 2 4 +19 2 4 52 1 3 71 20 20 173 135 135 +103 82 53 68 0 1 52 1 3 36 0 3 +36 0 3 19 2 4 18 16 8 33 18 18 +68 54 54 118 117 117 74 49 16 187 132 8 +206 165 16 137 86 8 0 16 16 71 70 70 +235 235 234 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 252 236 236 +253 218 218 254 201 201 220 148 148 140 86 86 +104 70 70 139 69 69 254 153 153 254 153 153 +254 137 137 33 18 18 171 71 71 18 16 8 +173 84 84 254 118 118 254 118 118 83 38 38 +33 18 18 187 100 100 254 153 153 254 153 153 +254 153 153 220 148 148 104 103 103 139 69 69 +83 1 1 52 1 3 52 1 3 52 1 3 +33 18 18 51 20 20 83 52 52 51 37 37 +19 2 4 101 90 90 53 52 52 18 16 8 +19 2 4 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 2 4 19 2 4 36 0 3 52 1 3 +52 1 3 52 1 3 36 0 3 36 0 3 +19 2 4 18 16 8 19 18 18 51 37 37 +71 70 70 140 132 107 214 153 8 239 185 16 +247 188 16 247 188 16 156 115 8 19 2 4 +99 99 90 235 235 234 254 252 252 254 252 252 +254 252 252 254 252 252 252 236 236 252 236 236 +254 201 201 137 99 99 36 36 36 99 49 41 +140 86 86 19 2 4 139 69 69 254 137 137 +254 118 118 33 18 18 220 87 87 136 53 53 +19 2 4 206 87 87 254 118 118 189 87 87 +19 2 4 236 133 133 254 169 169 247 165 140 +239 156 70 239 156 70 140 115 115 99 49 41 +36 0 3 52 1 3 36 0 3 19 2 4 +19 2 4 19 2 4 51 37 37 51 37 37 +33 18 18 104 103 103 53 52 52 19 18 18 +18 16 8 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 19 2 4 19 2 4 19 2 4 +19 2 4 19 2 4 33 21 8 33 18 18 +36 36 36 36 36 36 53 52 52 71 70 70 +104 103 103 185 136 33 218 173 16 247 188 16 +247 188 16 247 188 16 247 188 16 156 115 8 +0 0 1 71 70 70 235 235 234 254 252 252 +254 252 252 254 252 252 252 236 236 253 218 218 +254 201 201 154 101 101 36 36 36 237 103 103 +254 118 118 106 37 37 118 52 52 254 118 118 +255 105 105 33 18 18 184 70 70 236 90 90 +51 20 20 33 18 18 237 103 103 254 137 137 +51 37 37 137 99 99 253 184 184 231 152 53 +247 165 8 247 188 16 247 173 16 51 20 20 +19 2 4 19 2 4 19 2 4 19 2 4 +0 16 16 19 2 4 36 36 36 19 18 18 +206 165 16 156 140 90 71 70 70 19 18 18 +18 16 8 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 19 2 4 0 0 1 19 2 4 +19 2 4 19 18 18 36 36 36 53 52 52 +84 70 70 84 84 84 104 103 103 118 117 117 +173 148 57 214 153 8 232 173 16 236 201 16 +247 188 16 247 188 16 247 188 16 238 182 8 +103 69 8 0 0 1 53 52 52 199 198 198 +254 252 252 254 252 252 252 236 236 253 218 218 +254 201 201 236 133 133 33 18 18 155 71 71 +184 70 70 33 18 18 171 71 71 255 105 105 +255 105 105 33 18 18 51 20 20 19 2 4 +104 53 53 83 38 38 33 18 18 220 135 135 +154 101 101 185 137 137 254 201 201 231 152 53 +247 173 16 239 185 16 214 153 8 36 0 3 +19 2 4 19 18 18 19 2 4 0 16 16 +0 16 16 0 0 1 0 16 16 123 90 24 +236 201 16 236 201 16 84 84 84 16 33 33 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 18 18 36 36 36 84 84 84 156 123 53 +185 136 33 201 148 8 198 140 8 198 140 8 +214 153 8 231 173 8 239 185 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +222 181 16 53 37 8 0 0 1 19 18 18 +152 152 152 254 252 252 254 252 252 253 218 218 +254 201 201 254 169 169 121 66 66 19 2 4 +33 18 18 33 18 18 51 20 20 220 87 87 +254 118 118 19 18 18 104 53 53 237 123 123 +254 137 137 254 153 153 83 52 52 153 115 115 +253 184 184 254 201 201 253 218 218 216 165 54 +247 165 8 238 182 8 214 153 8 53 37 8 +0 16 16 19 2 4 0 16 16 0 0 1 +0 0 1 0 0 1 53 37 8 232 173 16 +239 185 16 238 182 8 117 99 74 36 36 36 +19 18 18 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 18 18 68 54 54 156 123 53 214 153 8 +222 181 16 231 173 8 221 168 8 218 173 16 +238 182 8 239 185 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +236 201 16 181 148 8 0 16 16 0 0 1 +0 0 1 118 117 117 235 235 234 252 236 236 +254 201 201 253 184 184 200 117 117 0 0 1 +206 87 87 255 105 105 83 38 38 33 18 18 +237 103 103 33 18 18 154 86 86 254 153 153 +254 169 169 253 184 184 254 201 201 254 201 201 +253 218 218 232 203 202 201 170 169 216 165 54 +231 173 8 238 182 8 214 153 8 137 86 8 +19 2 4 0 0 1 0 0 1 0 16 16 +0 16 16 74 49 8 201 148 8 231 173 8 +239 185 16 232 173 16 123 115 90 71 70 70 +19 18 18 18 16 8 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 18 16 8 +36 36 36 71 70 70 185 136 33 221 168 8 +239 185 16 239 185 16 239 185 16 236 201 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 239 185 16 103 69 8 0 0 1 +0 0 1 0 16 16 71 70 70 220 203 202 +253 218 218 254 201 201 254 169 169 68 36 36 +121 66 66 254 137 137 254 137 137 83 52 52 +51 37 37 68 36 36 167 115 115 254 169 169 +254 201 201 254 201 201 253 218 218 253 218 218 +252 236 236 202 185 185 202 185 185 216 165 54 +231 173 8 231 173 8 214 153 8 187 132 8 +156 115 8 121 85 8 103 69 8 121 85 8 +165 107 8 198 140 8 221 168 8 239 185 16 +239 185 16 239 185 16 165 148 90 71 70 70 +36 36 36 19 18 18 0 16 16 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +36 36 36 71 70 70 185 136 33 231 173 8 +239 185 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 236 201 16 206 165 16 19 18 18 +0 16 16 0 0 1 0 0 1 51 37 37 +220 203 202 253 218 218 253 184 184 153 115 115 +19 18 18 239 152 152 254 169 169 254 169 169 +237 170 170 253 184 184 254 201 201 253 218 218 +253 218 218 252 236 236 252 236 236 252 236 236 +252 236 236 199 198 198 199 198 198 206 165 66 +221 168 8 238 182 8 221 168 8 214 153 8 +198 140 8 187 132 8 187 132 8 198 140 8 +214 153 8 232 173 16 239 185 16 247 188 16 +247 188 16 247 188 16 222 181 16 123 115 90 +71 70 70 33 18 18 19 18 18 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 18 16 8 +36 36 36 71 70 70 173 132 49 221 168 8 +247 173 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 236 201 16 140 99 16 +0 0 1 0 16 16 0 0 1 0 0 1 +84 70 70 253 218 218 253 218 218 237 183 183 +121 88 88 254 201 201 254 201 201 254 201 201 +254 201 201 253 218 218 253 218 218 252 236 236 +252 236 236 254 252 252 254 252 252 254 252 252 +254 252 252 219 218 218 199 198 198 189 148 49 +221 168 8 238 182 8 232 173 16 221 168 8 +214 153 8 214 153 8 214 153 8 221 168 8 +221 168 8 239 185 16 247 188 16 247 188 16 +247 188 16 247 188 16 239 185 16 206 165 41 +99 99 90 53 52 52 19 18 18 19 18 18 +18 16 8 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +36 36 36 71 70 70 173 132 49 214 153 8 +238 182 8 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 236 201 16 222 181 16 +53 37 8 0 16 16 0 0 1 19 2 4 +36 36 36 235 220 217 252 236 236 253 218 218 +253 218 218 253 218 218 253 218 218 253 218 218 +252 236 236 252 236 236 252 236 236 252 236 236 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 219 218 218 188 184 184 185 136 33 +214 153 8 238 182 8 239 185 16 238 182 8 +231 173 8 221 168 8 221 168 8 231 173 8 +238 182 8 239 185 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 239 185 16 +206 165 41 104 103 103 71 70 70 36 36 36 +19 18 18 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +16 33 33 84 70 70 165 132 66 214 153 8 +247 173 16 247 188 16 236 201 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 236 201 16 +189 148 16 18 16 8 0 0 1 0 0 1 +51 37 37 252 236 236 254 252 252 252 236 236 +252 236 236 252 236 236 252 236 236 252 236 236 +254 252 252 254 252 252 254 252 252 252 236 236 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 219 218 218 84 84 84 152 103 8 +214 153 8 238 182 8 239 185 16 236 201 16 +239 185 16 239 185 16 239 185 16 239 185 16 +239 185 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +239 185 16 232 173 16 140 123 74 71 70 70 +16 33 33 19 2 4 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 18 16 8 +19 18 18 71 70 70 165 132 66 214 153 8 +238 182 8 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +236 201 16 121 85 8 36 36 36 104 103 103 +219 218 218 254 252 252 254 252 252 252 236 236 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +235 235 234 84 84 84 18 16 8 165 107 8 +214 153 8 238 182 8 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +236 201 16 247 188 16 247 188 16 156 123 53 +53 52 52 19 18 18 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +36 36 36 71 70 70 156 123 53 214 153 8 +238 182 8 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +236 201 16 206 165 16 189 181 148 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 219 218 218 +53 52 52 0 0 1 33 18 18 168 116 8 +214 153 8 238 182 8 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 239 185 16 189 148 49 +53 52 52 19 18 18 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +36 36 36 84 84 84 185 136 33 214 153 8 +231 173 8 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 236 201 16 189 148 16 219 218 218 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 170 169 169 16 33 33 +0 16 16 0 0 1 19 18 18 165 107 8 +221 168 8 247 173 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 239 185 16 221 168 8 140 123 74 +53 52 52 19 18 18 18 16 8 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +53 52 52 104 103 103 181 123 8 231 173 8 +239 185 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +239 185 16 232 173 16 221 168 8 138 105 49 +219 218 218 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +199 198 198 68 54 54 0 16 16 0 0 1 +0 0 1 0 0 1 53 37 8 152 103 8 +221 168 8 239 185 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 236 201 16 239 185 16 +232 173 16 214 153 8 156 123 53 84 68 33 +36 36 36 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 18 16 8 19 18 18 +53 52 52 156 123 53 201 148 8 232 173 16 +239 185 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +236 201 16 238 182 8 206 165 16 165 107 8 +74 49 16 135 135 135 219 218 218 254 252 252 +254 252 252 254 252 252 254 252 252 254 252 252 +235 235 234 219 218 218 152 152 152 71 70 70 +0 16 16 0 0 1 0 0 1 0 16 16 +0 0 1 0 0 1 53 37 8 165 107 8 +214 153 8 238 182 8 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 239 185 16 231 173 8 221 168 8 +185 136 33 123 115 90 84 84 84 36 36 36 +19 18 18 18 16 8 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 16 16 19 18 18 +71 70 70 169 123 41 201 148 8 221 168 8 +238 182 8 239 185 16 239 185 16 236 201 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 238 182 8 214 153 8 168 116 8 +86 57 8 0 0 1 0 16 16 36 36 36 +53 52 52 71 70 70 53 52 52 36 36 36 +19 18 18 0 0 1 0 0 1 0 16 16 +0 0 1 0 0 1 0 16 16 0 0 1 +0 16 16 0 16 16 86 57 8 168 116 8 +214 153 8 238 182 8 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 239 185 16 239 185 16 239 185 16 +231 173 8 214 153 8 165 132 66 137 99 99 +84 84 84 53 52 52 16 33 33 19 18 18 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 19 2 4 19 18 18 +53 52 52 156 115 33 187 132 8 198 140 8 +214 153 8 231 173 8 221 168 8 221 168 8 +231 173 8 247 173 16 239 185 16 247 173 16 +239 185 16 247 188 16 247 188 16 247 188 16 +247 188 16 247 188 16 247 188 16 247 188 16 +247 188 16 231 173 8 214 153 8 165 107 8 +103 69 8 0 16 16 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 16 16 +0 0 1 0 0 1 0 16 16 0 0 1 +0 16 16 0 0 1 0 0 1 0 16 16 +0 0 1 19 2 4 86 57 8 168 116 8 +201 148 8 231 173 8 239 185 16 247 188 16 +247 188 16 247 188 16 247 188 16 239 185 16 +239 185 16 231 173 8 214 153 8 214 153 8 +169 123 41 123 115 90 84 84 84 53 52 52 +36 36 36 19 18 18 19 2 4 0 16 16 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 19 18 18 +36 36 36 84 84 84 138 105 49 156 115 33 +168 116 8 181 123 8 187 132 8 198 140 8 +201 148 8 201 148 8 214 153 8 221 168 8 +221 168 8 231 173 8 232 173 16 239 185 16 +247 188 16 247 188 16 239 185 16 247 188 16 +239 185 16 214 153 8 187 132 8 140 99 16 +103 69 8 19 18 18 0 0 1 0 0 1 +0 16 16 0 0 1 0 16 16 0 0 1 +0 0 1 0 16 16 0 0 1 0 16 16 +0 16 16 0 0 1 0 16 16 0 0 1 +0 0 1 19 2 4 74 49 16 152 103 8 +187 132 8 221 168 8 238 182 8 232 173 16 +247 188 16 239 185 16 239 185 16 238 182 8 +221 168 8 201 148 8 198 140 8 156 123 53 +84 84 84 68 54 54 51 37 37 19 18 18 +19 18 18 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 18 18 19 18 18 53 52 52 71 70 70 +104 103 103 123 115 90 138 105 49 156 115 8 +165 107 8 168 116 8 168 116 8 181 123 8 +187 132 8 198 140 8 214 153 8 221 168 8 +231 173 8 238 182 8 238 182 8 232 173 16 +221 168 8 198 140 8 165 107 8 137 86 8 +86 57 8 0 16 16 0 0 1 0 0 1 +19 18 18 36 36 36 36 36 36 36 36 36 +36 36 36 36 36 36 51 37 37 36 36 36 +36 36 36 36 36 36 33 18 18 0 16 16 +0 16 16 0 16 16 74 49 8 137 86 8 +168 116 8 201 148 8 221 168 8 231 173 8 +232 173 16 231 173 8 231 173 8 214 153 8 +187 132 8 168 116 8 123 115 90 84 84 84 +53 52 52 36 36 36 19 18 18 0 16 16 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 2 4 19 18 18 19 18 18 36 36 36 +36 36 36 53 52 52 71 70 70 84 84 84 +101 90 90 117 99 74 138 105 49 123 90 24 +137 86 8 152 103 8 165 107 8 181 123 8 +181 123 8 198 140 8 201 148 8 198 140 8 +181 123 8 152 103 8 137 86 8 103 69 8 +53 37 8 53 52 52 104 103 103 99 99 90 +84 84 84 84 84 84 71 70 70 71 70 70 +84 84 84 71 70 70 84 70 70 71 70 70 +71 70 70 84 84 84 84 84 84 84 84 84 +104 103 103 99 99 90 83 52 52 121 85 8 +152 103 8 181 123 8 187 132 8 201 148 8 +201 148 8 201 148 8 181 123 8 168 116 8 +140 99 16 104 103 103 71 70 70 36 36 36 +19 18 18 18 16 8 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 16 16 18 16 8 +19 18 18 19 18 18 36 36 36 36 36 36 +53 52 52 71 70 70 84 84 84 84 84 84 +84 84 84 117 99 74 123 90 24 121 85 8 +137 86 8 152 103 8 152 103 8 152 103 8 +137 86 8 121 85 8 103 69 8 74 49 16 +99 99 90 84 84 84 53 52 52 51 37 37 +36 36 36 36 36 36 36 36 36 36 36 36 +36 36 36 36 36 36 16 33 33 36 36 36 +36 36 36 36 36 36 36 36 36 36 36 36 +53 52 52 84 84 84 90 82 68 86 57 8 +137 86 8 152 103 8 168 116 8 168 116 8 +168 116 8 165 107 8 152 103 8 123 90 24 +84 84 84 71 70 70 36 36 36 19 18 18 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 18 16 8 +19 18 18 19 18 18 36 36 36 36 36 36 +53 52 52 71 70 70 84 84 84 99 99 90 +103 82 53 103 69 8 103 69 8 103 69 8 +103 69 8 86 57 8 99 49 41 84 84 84 +71 70 70 36 36 36 19 18 18 19 18 18 +18 16 8 0 0 1 18 16 8 0 0 1 +0 0 1 0 16 16 19 2 4 0 16 16 +0 0 1 18 16 8 0 0 1 19 18 18 +19 18 18 53 52 52 71 70 70 90 82 68 +86 57 8 103 69 8 121 85 8 137 86 8 +137 86 8 121 85 8 103 82 53 84 84 84 +53 52 52 16 33 33 19 18 18 18 16 8 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 18 16 8 19 18 18 +19 18 18 19 18 18 36 36 36 53 52 52 +71 70 70 84 84 84 90 82 68 90 82 68 +90 82 68 84 84 84 71 70 70 53 52 52 +36 36 36 19 18 18 18 16 8 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 19 18 18 36 36 36 53 52 52 +84 84 84 90 82 68 90 82 68 90 82 68 +90 82 68 84 70 70 71 70 70 53 52 52 +19 18 18 19 18 18 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 18 16 8 19 18 18 19 18 18 +36 36 36 36 36 36 53 52 52 53 52 52 +53 52 52 36 36 36 36 36 36 18 16 8 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 18 16 8 19 18 18 19 18 18 +51 37 37 53 52 52 53 52 52 71 70 70 +53 52 52 36 36 36 36 36 36 19 18 18 +18 16 8 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 16 16 +0 0 1 18 16 8 18 16 8 19 18 18 +19 18 18 19 18 18 0 0 1 0 16 16 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +19 18 18 19 18 18 19 18 18 19 18 18 +19 18 18 19 18 18 19 2 4 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 +0 0 1 0 0 1 0 0 1 0 0 1 diff --git a/drivers/video/msm/mdp.c b/drivers/video/msm/mdp.c index 6861e24..ba8606b 100644 --- a/drivers/video/msm/mdp.c +++ b/drivers/video/msm/mdp.c @@ -64,8 +64,9 @@ int enable_mdp_irq(uint32_t mask) /* if the mask bits are already set return an error, this interrupt * is already enabled */ if (mdp_irq_mask & mask) { - printk(KERN_ERR "mdp irq already on already on %x %x\n", - mdp_irq_mask, mask); +// netripper: we don't care about this error +// printk(KERN_ERR "mdp irq already on already on %x %x\n", +// mdp_irq_mask, mask); ret = -1; } /* if the mdp irq is not already enabled enable it */ @@ -206,7 +207,8 @@ void mdp_dma_to_mddi(uint32_t addr, uint32_t stride, uint32_t width, uint16_t ld_param = 0; /* 0=PRIM, 1=SECD, 2=EXT */ if (enable_mdp_irq(DL0_DMA2_TERM_DONE)) { - printk(KERN_ERR "mdp_dma_to_mddi: busy\n"); +// netripper: ignore this message +// printk(KERN_ERR "mdp_dma_to_mddi: busy\n"); return; } diff --git a/drivers/video/msm/msm_fb.c b/drivers/video/msm/msm_fb.c index fda4392..2d50c36 100644 --- a/drivers/video/msm/msm_fb.c +++ b/drivers/video/msm/msm_fb.c @@ -170,6 +170,7 @@ static int msmfb_start_dma(struct msmfb_info *par) y = par->update_info.top; w = par->update_info.eright - x; h = par->update_info.ebottom - y; + w = 0; y = 0; w = 480; h = 640; // XXX - VERY ugly hack so we can draw in fbram yoffset = par->yoffset; par->update_info.left = pi->width + 1; par->update_info.top = pi->height + 1; diff --git a/include/asm-arm/arch-msm/msm_iomap.h b/include/asm-arm/arch-msm/msm_iomap.h index 958d0a8..0dfffb7 100644 --- a/include/asm-arm/arch-msm/msm_iomap.h +++ b/include/asm-arm/arch-msm/msm_iomap.h @@ -125,6 +125,10 @@ #define MSM_SDC4_PHYS 0xA0700000 #define MSM_SDC4_SIZE SZ_4K +#define MSM_TS_BASE 0xE1008000 +#define MSM_TS_PHYS 0xAA300000 +#define MSM_TS_SIZE SZ_4K + /* Used by debug-macro.S, uncompress.h, etc. */ #if defined(CONFIG_MSM_LL_DEBUG_UART1) #define MSM_DEBUG_UART_PHYS MSM_UART1_PHYS diff --git a/init/main.c b/init/main.c index 99ce949..9155290 100644 --- a/init/main.c +++ b/init/main.c @@ -646,6 +646,12 @@ asmlinkage void __init start_kernel(void) acpi_early_init(); /* before LAPIC and SMP init */ +{ +//volatile unsigned *bank2_in = (unsigned int*)0xE0007838; +//volatile unsigned *bank2_out = (unsigned int*)0xE0007804; +//msm_putc('.'); +//*bank2_out = *bank2_in | 32768; +} /* Do the rest non-__init'ed, we're now alive */ rest_init(); }