[Scummvm-cvs-logs] CVS: scummvm/backends/psp Makefile,NONE,1.1 README.PSP,NONE,1.1 kbd_l_c.cpp,NONE,1.1 kbd_ls_c.cpp,NONE,1.1 kbd_s_c.cpp,NONE,1.1 kbd_ss_c.cpp,NONE,1.1 osys_psp.cpp,NONE,1.1 osys_psp.h,NONE,1.1 osys_psp_gu.cpp,NONE,1.1 osys_psp_gu.h,NONE,1.1 portdefs.h,NONE,1.1 psp_fs.cpp,NONE,1.1 psp_main.cpp,NONE,1.1 trace.cpp,NONE,1.1 trace.h,NONE,1.1

Joost Peters joostp at users.sourceforge.net
Tue Aug 16 10:16:24 CEST 2005


Update of /cvsroot/scummvm/scummvm/backends/psp
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8539/backends/psp

Added Files:
	Makefile README.PSP kbd_l_c.cpp kbd_ls_c.cpp kbd_s_c.cpp 
	kbd_ss_c.cpp osys_psp.cpp osys_psp.h osys_psp_gu.cpp 
	osys_psp_gu.h portdefs.h psp_fs.cpp psp_main.cpp trace.cpp 
	trace.h 
Log Message:
Added: PSP backend


--- NEW FILE: Makefile ---
# SCUMMVM-PSP MakeFile
# $Header: /cvsroot/scummvm/scummvm/backends/psp/Makefile,v 1.1 2005/08/16 17:15:36 joostp Exp $

#control build
DISABLE_SCALERS = true
DISABLE_HQ_SCALERS = true
DISABLE_HE = true
DISABLE_KYRA = true

srcdir = ../..
VPATH = $(srcdir)
HAVE_GCC3 = false

PSPSDK=$(shell psp-config --pspsdk-path)
PSPBIN = $(PSPSDK)/../bin
LDFLAGS =

CXX     = psp-g++
AS      = psp-gcc
LD      = psp-g++
AR      = psp-ar cru
RANLIB  = psp-ranlib
STRIP   = psp-strip
MKDIR 	= mkdir -p
RM 	= rm -f

INCDIR = ../../

#check PSPSDK presence
ifeq ($(PSPSDK),)
$(error $$(PSPSDK) is undefined.  Use "PSPSDK := $$(shell psp-config --pspsdk-path)" in your Makefile)
endif

# Add in PSPSDK includes and libraries.
INCDIR   := $(INCDIR) . $(PSPSDK)/include
LIBDIR   := $(LIBDIR) . $(PSPSDK)/lib

CFLAGS = -O2 -G0 -Wall -D__PSP__ -DNONSTANDARD_PORT -DUSE_ZLIB -Wno-multichar `$(PSPBIN)/sdl-config --cflags` 
CFLAGS	:= $(addprefix -I,$(INCDIR)) $(CFLAGS)
LDFLAGS := $(addprefix -L,$(LIBDIR)) $(LDFLAGS)
LIBS     = 

#comment this out if you don't want to use libmad
CFLAGS	+= -DUSE_MAD
LIBS	+= -lmad 

#comment this out if you don't want to use libtremor
CFLAGS	+= -DUSE_TREMOR
LIBS	+= -lvorbisidec

#comment this out if you don't want to use libmpeg2
CFLAGS	+= -DUSE_MPEG2
LIBS	+= -lmpeg2

LIBS	+= -lz -lm `$(PSPBIN)/sdl-config --libs` -lc -lpspgu -lpspctrl -lpspkernel -lpspuser


CXXFLAGS := $(CFLAGS) $(CXXFLAGS) -fno-exceptions -fno-rtti
ASFLAGS  := $(CFLAGS) $(ASFLAGS)

TARGET = scummvm-psp.elf
OBJS := psp_main.o \
	psp_fs.o \
	osys_psp.o \
	osys_psp_gu.o \
	kbd_ss_c.o \
	kbd_s_c.o \
	kbd_ls_c.o \
	kbd_l_c.o \
	trace.o

MODULE_DIRS += .

include $(srcdir)/Makefile.common

all: $(TARGET)
	$(STRIP) $(TARGET)

$(TARGET): $(OBJS)
	$(LINK.cpp) $(OBJS) $(LIBS) -o $@
	

--- NEW FILE: README.PSP ---
ScummVM-PSP 0.8.0CVS README 
===========================

Installation
============
 - Copy the relevant game datafiles to your memory stick (location
   doesn't matter).
 - Install ScummVM like any other homebrew
 - Run ScummVM and use the launcher to add games and run them


Controls
========

Left trigger 		- ESC
Right trigger 		- Enter 
Analog 			- Mouse movement
Directionals		- Mouse movement
Analog + triangle	- Fine control mouse
Cross 			- Mouse button 1
Circle			- Mouse button 2
Square			- '.' (skip dialogue in some games)
Select			- Show/Hide Virtual Keyboard
Start			- F5

Notes
=====

- While it's possible to compress certain game resources to reduce their size,
  this can (and usually will) cause games (especially animation) to be choppy
  sometimes, as it ofcourse needs extra CPU power to decode these files.
  As such, it is recommended to play games in their original, uncompressed,
  form whenever possible.


Frequently Asked Question
=========================

Q:  What do I need to run the games?
A:  A 1.00 or 1.50 firmware PSP and the necessary datafiles for the game you
    want to play and obviously this ScummVM port.

Q:  Can I run this on my 1.52/1.52/2.00 firmware PSP?
A:  No, you can't as of yet.

Q:  My Monkey Island 1 doesn't have any music, what gives?
A:  If your version of Monkey Island came on a CD then it has the music
    as CD Audio tracks. You need to rip those to MP3/Ogg and copy them
    to the same directory as the game datafiles for music to work.

Q:  Game X crashes, or feature Y doesn't work. Can you fix this?
A:  Possibly.  
    Because of the large amount of games ScummVM supports we obviously haven't
    played them all start-to-finish on the PSP, so it's very possible there
    are bugs or issues that we're not aware of.
    When you encounter such a bug, please use the "Bug Tracker" you find linked
    on the ScummVM website, and mention all relevant info (i.e. that you're
    using the PSP version, which ScummVM version it is, which build date it has,
    a detailed description of the problem, and if at all possible a nearby
    savegame), this will make it much easier for us to reproduce
    (and hopefully fix) the problem.


Building the source code
========================
To build ScummVM for PSP you need:

- PSP toolchain	(svn co svn://svn.pspdev.org/psp/trunk/toolchain)
- PSPSDK 	(svn co svn://svn.pspdev.org/psp/trunk/pspsdk)
- SDL		(svn co svn://svn.pspdev.org/psp/trunk/SDL)
- zlib		(svn co svn://svn.pspdev.org/psp/trunk/zlib)
- libmad	(svn co svn://svn.pspdev.org/psp/trunk/libmad)
- libTremor	(svn co svn://svn.pspdev.org/psp/trunk/libTremor)
- libmpeg2  	(http://libmpeg2.sf.net)

When you've installed these libraries, type "make" to build scummvm-psp.elf

You can control most of the build process (engines and libraries used) from
the Makefile.

Port Authors
============

Joost Peters   (joostp at scummvm.org)
Paolo Costabel (paoloc at pacbell.net)
Thomas Mayer   (tommybear at internode.on.net)


--- NEW FILE: kbd_l_c.cpp ---
#ifndef __keyboard_letters_compressed__
#define __keyboard_letters_compressed__

unsigned int size_keyboard_letters_compressed = 3271;
unsigned char keyboard_letters_compressed[] __attribute__((aligned(16))) = {
	0x78, 0x9c, 0xed, 0x9d, 0x69, 0x97, 0xb4, 0x36, 0x0e, 0x46, 0x99, 0xec, 0x99, 0xc9, 0x32, 0x93, 
	0x3d, 0xb3, 0xfd, 0xff, 0x5f, 0x48, 0xbe, 0xe6, 0xa4, 0xbb, 0x0b, 0x4b, 0xb2, 0x24, 0xdb, 0xd8, 
	0x66, 0x11, 0xcf, 0x3d, 0x27, 0xd5, 0x14, 0x16, 0xc6, 0x70, 0xb1, 0x31, 0xa6, 0x9c, 0xf7, 0x8f, 
	0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x11, 0x2b, 0xb8, 
	0x31, 0xb0, 0x1b, 0x1d, 0xd8, 0x8d, 0x0e, 0xf4, 0x06, 0x07, 0x7e, 0x63, 0x03, 0xbd, 0xc1, 0x81, 
	0xdf, 0xd8, 0x40, 0x6f, 0x70, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x9b, 0x92, 0xdf, 0xbf, 0x99, 0xf0, 
	0x7c, 0x3e, 0x31, 0xe1, 0x71, 0x9f, 0x9a, 0xf0, 0xb8, 0xcf, 0x4c, 0x78, 0xdc, 0xe7, 0x26, 0x3c, 
	0xee, 0x0b, 0x13, 0x1e, 0xf7, 0xa5, 0x09, 0x8f, 0xfb, 0xca, 0x84, 0xc7, 0x7d, 0x6d, 0xc2, 0xe3, 
	0xfe, 0x6e, 0xc2, 0xe3, 0xfe, 0x61, 0xb2, 0xaa, 0x14, 0xfc, 0xda, 0x7a, 0xb9, 0x60, 0x5b, 0x2f, 
	0x17, 0x6c, 0xeb, 0xe5, 0x82, 0x6d, 0xbd, 0x5c, 0xb0, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 0x72, 0xc1, 
	0xb6, 0x5e, 0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 0x7a, 0xb9, 0x60, 0x5b, 0x2f, 0x17, 0x6c, 0xeb, 
	0x35, 0x04, 0xfb, 0x7e, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 0xf6, 0xf4, 0x52, 0xc1, 0x9e, 
	0x5e, 0x2a, 0xd8, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 0x60, 0x4f, 0x2f, 0x15, 0xec, 0xe9, 0xa5, 
	0x82, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 0xf6, 0xf4, 0xea, 0x82, 0xe1, 0x17, 0x7e, 0xe1, 
	0x37, 0xb4, 0x5f, 0x6d, 0x33, 0xcd, 0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 0x34, 0xbf, 0x5a, 0x9c, 
	0xe6, 0x57, 0x8b, 0xd3, 0xfc, 0x6a, 0x71, 0x9a, 0x5f, 0x2d, 0x4e, 0xf3, 0xab, 0xc5, 0x69, 0x7e, 
	0xb5, 0x38, 0xcd, 0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 0xe0, 0xf7, 0x46, 0x7e, 0x97, 0x65, 0xd1, 
	0x13, 0xae, 0xe0, 0x97, 0x14, 0x6e, 0x1d, 0xe7, 0xf7, 0x95, 0xeb, 0xf5, 0xfc, 0xf2, 0xe3, 0xf5, 
	0xfc, 0xd2, 0x48, 0xf8, 0x9d, 0xe8, 0x77, 0x49, 0x65, 0xbc, 0xa4, 0xdf, 0xd5, 0x4c, 0x20, 0x1a, 
	0xf9, 0x7e, 0xe1, 0x37, 0x69, 0xa4, 0x25, 0x3c, 0xd2, 0x2f, 0x05, 0x7e, 0xcf, 0xf7, 0xbb, 0xbc, 
	0x93, 0x27, 0x84, 0xf4, 0x4b, 0x8f, 0xf6, 0x09, 0x7e, 0xdf, 0xa3, 0x4e, 0xf1, 0x5b, 0x75, 0xff, 
	0x1d, 0xec, 0x97, 0x1f, 0xae, 0xef, 0x97, 0x5c, 0x07, 0x9e, 0x5f, 0x12, 0xe6, 0xfa, 0xa5, 0x39, 
	0x3a, 0x7e, 0x69, 0x76, 0xfd, 0x7e, 0x3f, 0x82, 0xaa, 0xfc, 0x92, 0x03, 0x3e, 0xae, 0x7f, 0x75, 
	0xa2, 0x5f, 0x12, 0x68, 0xfb, 0x7d, 0x8b, 0xd8, 0xf2, 0xb3, 0xfd, 0xf2, 0xfc, 0x4c, 0xbf, 0x3c, 
	0x3b, 0xc7, 0x2f, 0xbf, 0xfe, 0x86, 0xf8, 0x25, 0x71, 0x47, 0xfb, 0x7d, 0x85, 0x8e, 0xb8, 0xff, 
	0xd2, 0x13, 0x53, 0x6c, 0x9f, 0x3f, 0xfe, 0x98, 0x7e, 0xb7, 0x30, 0x99, 0xf0, 0x46, 0xd2, 0x28, 
	0xce, 0xb3, 0xe5, 0x57, 0x84, 0x1d, 0x5b, 0x7f, 0xd7, 0xd3, 0xfc, 0x6e, 0x91, 0x43, 0xee, 0xbf, 
	0x0d, 0xf5, 0xb7, 0xd6, 0x6f, 0x9e, 0xf0, 0x06, 0xfc, 0xaa, 0x09, 0xd2, 0x6f, 0x0a, 0x3c, 0xba, 
	0x7d, 0x3e, 0xc1, 0x2f, 0x6b, 0x78, 0x1f, 0xe1, 0x97, 0xc4, 0x3d, 0xc0, 0x2f, 0x3b, 0xac, 0xa3, 
	0xfb, 0xcf, 0xf0, 0xfb, 0xc6, 0xec, 0xfb, 0xef, 0x96, 0xdf, 0xd1, 0xcf, 0xbf, 0x67, 0xf9, 0x1d, 
	0xd6, 0x3e, 0x8b, 0xe7, 0x80, 0x6b, 0xf6, 0x9f, 0x07, 0xde, 0x7f, 0x45, 0xec, 0x25, 0xfd, 0x92, 
	0x47, 0xc2, 0x43, 0xc7, 0xaf, 0xc8, 0x75, 0x75, 0xf0, 0xf3, 0xef, 0xa2, 0x25, 0xac, 0x51, 0xef, 
	0xbf, 0xe4, 0x14, 0xe2, 0xfd, 0xe0, 0x2e, 0xbf, 0x5b, 0xe8, 0xf5, 0xde, 0x0f, 0x6e, 0x05, 0x5c, 
	0x44, 0x02, 0xe7, 0x81, 0x7e, 0x29, 0x6e, 0xff, 0x8a, 0x9c, 0xe7, 0xeb, 0xf9, 0xe5, 0xc0, 0xef, 
	0x6d, 0xde, 0xef, 0xd3, 0xcb, 0x0a, 0x7e, 0xe3, 0xf9, 0x65, 0x1c, 0xe1, 0xd7, 0x24, 0xc5, 0x7d, 
	0xe2, 0x92, 0xe2, 0x3e, 0x75, 0x49, 0x71, 0x9f, 0xb9, 0xa4, 0xb8, 0xcf, 0x5d, 0x52, 0xdc, 0x17, 
	0x2e, 0x29, 0xee, 0x4b, 0x97, 0x14, 0xf7, 0x95, 0x4b, 0x8a, 0xfb, 0xda, 0x45, 0x68, 0x34, 0x11, 
	0x1a, 0x4d, 0xe0, 0x17, 0x7e, 0xe1, 0xf7, 0x49, 0x7e, 0x31, 0x3f, 0x45, 0xd5, 0x1b, 0x66, 0x7e, 
	0x0a, 0xe6, 0x97, 0xe9, 0x7a, 0xc3, 0xcc, 0x2f, 0x03, 0x37, 0x07, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 
	0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 
	0xc6, 0x06, 0x7e, 0x63, 0x53, 0xf2, 0xfb, 0xff, 0x4e, 0xce, 0x3a, 0xae, 0xa8, 0x7c, 0x63, 0xa2, 
	0xc7, 0x17, 0xfc, 0xf6, 0xea, 0x85, 0xe0, 0xb1, 0xd8, 0x7a, 0x0d, 0xc1, 0xbe, 0xdf, 0x7e, 0xbd, 
	0x10, 0x3c, 0x12, 0x4f, 0xaf, 0x2e, 0x18, 0x7e, 0xef, 0x04, 0xfc, 0xc6, 0x66, 0x8a, 0xdf, 0xfd, 
	0xc5, 0x81, 0xdf, 0xc1, 0x98, 0x1a, 0xe1, 0x37, 0x04, 0xf0, 0x1b, 0x1b, 0xa6, 0x91, 0xfe, 0x4e, 
	0x1a, 0x7e, 0x43, 0x30, 0xd5, 0x2f, 0x9f, 0x41, 0x98, 0xd6, 0xda, 0xc5, 0x81, 0xdf, 0xc1, 0x4c, 
	0xf6, 0xab, 0x65, 0x00, 0xbf, 0x07, 0x02, 0xbf, 0xb1, 0x39, 0xca, 0x6f, 0x6a, 0xa8, 0xe9, 0xdf, 
	0x85, 0xfc, 0xcd, 0x37, 0x07, 0xfd, 0x1c, 0x71, 0xff, 0x7d, 0x5f, 0x7c, 0x7d, 0xac, 0x62, 0x05, 
	0xbb, 0x3f, 0xc3, 0xef, 0x60, 0x8e, 0xab, 0xbf, 0xab, 0xe9, 0x77, 0x35, 0x36, 0x07, 0xfd, 0x9c, 
	0xe8, 0xf7, 0xa3, 0x6e, 0xc3, 0xef, 0x4c, 0xce, 0xad, 0xbf, 0x22, 0x08, 0x7e, 0x87, 0x83, 0xf6, 
	0x39, 0x36, 0x47, 0x8d, 0x6f, 0x10, 0xbf, 0x2b, 0xef, 0x37, 0xc3, 0xef, 0x4c, 0x30, 0x3e, 0x19, 
	0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0x06, 0xef, 0x07, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 
	0x4c, 0xf1, 0xdb, 0xc9, 0x9c, 0x23, 0x7d, 0x26, 0xdf, 0xb8, 0x68, 0x5b, 0xc0, 0xef, 0x9d, 0x80, 
	0xdf, 0xd8, 0x8c, 0xf6, 0x8b, 0xf9, 0x29, 0x17, 0xa3, 0x55, 0x2f, 0xe6, 0x97, 0xdd, 0x8c, 0x46, 
	0xbd, 0x98, 0x1f, 0x1a, 0x1c, 0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 
	0xb9, 0x80, 0x5f, 0xef, 0x17, 0xd4, 0xfc, 0xf7, 0x98, 0x7e, 0x4c, 0x1e, 0x59, 0xb1, 0xed, 0x96, 
	0x83, 0x32, 0x31, 0xc3, 0xda, 0x9a, 0x27, 0x68, 0xdb, 0x16, 0x36, 0x29, 0xee, 0x61, 0x1c, 0x57, 
	0xf7, 0x5b, 0xe3, 0xa8, 0xdb, 0xaf, 0xbe, 0x7d, 0x9d, 0x5f, 0x6b, 0xdf, 0x35, 0x79, 0x3d, 0xc2, 
	0x6f, 0xe1, 0xea, 0xaf, 0xf3, 0x9b, 0xfd, 0x34, 0xa8, 0x76, 0x5b, 0x12, 0x07, 0xbf, 0x53, 0x48, 
	0x7e, 0x49, 0x4b, 0x47, 0x97, 0xc4, 0x8a, 0xbc, 0x41, 0x5c, 0x16, 0xfa, 0xd3, 0x3e, 0xf6, 0xdb, 
	0xbf, 0x8a, 0xa6, 0x73, 0xcd, 0x84, 0xf1, 0xf6, 0x80, 0x4d, 0xd5, 0xa0, 0xff, 0xa6, 0x54, 0xb6, 
	0xad, 0xf2, 0x83, 0x61, 0xad, 0xcc, 0xd9, 0xb1, 0xcd, 0xe4, 0x74, 0xbf, 0xaa, 0x19, 0xfb, 0xf7, 
	0x99, 0xfc, 0xb7, 0x7d, 0x5b, 0x16, 0x96, 0x5f, 0x19, 0x2a, 0xcf, 0x3b, 0x59, 0x4b, 0xca, 0xa3, 
	0xe6, 0x91, 0xfd, 0xb0, 0x30, 0xdb, 0x56, 0x16, 0xb8, 0x58, 0xa8, 0x0b, 0xf8, 0xfd, 0x5f, 0x27, 
	0xc5, 0x02, 0xe8, 0x27, 0x61, 0xfb, 0x5a, 0xe9, 0xf7, 0xe5, 0xb8, 0x14, 0xea, 0x95, 0x43, 0xbd, 
	0xc8, 0x84, 0x5f, 0x52, 0x30, 0x63, 0x5b, 0xb1, 0x38, 0xda, 0xef, 0xb7, 0x26, 0x7a, 0x7c, 0xc1, 
	0x6f, 0xaf, 0xde, 0xb2, 0xe0, 0x45, 0x34, 0x57, 0xb2, 0x65, 0xad, 0xf4, 0xbb, 0xea, 0xb9, 0xc8, 
	0x50, 0xa3, 0xfe, 0xa6, 0x0d, 0xd7, 0x94, 0x2c, 0xbe, 0x3b, 0x7e, 0x65, 0xa5, 0x25, 0x8b, 0x83, 
	0xfd, 0xda, 0x7a, 0x0d, 0xc1, 0xbe, 0xdf, 0x7e, 0xbd, 0x25, 0xc1, 0xba, 0xc4, 0xe6, 0xf6, 0xb9, 
	0xda, 0x6f, 0x5d, 0x21, 0xb2, 0xb5, 0x4a, 0x82, 0x16, 0xc5, 0xdb, 0xea, 0xf1, 0x7e, 0x3d, 0xbd, 
	0xba, 0xe0, 0x30, 0x7e, 0x95, 0x06, 0x76, 0xbf, 0x5f, 0xb3, 0x7d, 0xb6, 0x77, 0xfe, 0xf1, 0x05, 
	0x7e, 0x39, 0xa6, 0x44, 0xab, 0x17, 0xcb, 0x5a, 0x74, 0x9e, 0x47, 0x96, 0x5e, 0xdb, 0x7f, 0x66, 
	0x81, 0xc5, 0xfe, 0x33, 0xd9, 0x55, 0xb6, 0x13, 0xb6, 0xc0, 0xfc, 0x0e, 0xe9, 0x3f, 0x4f, 0xf1, 
	0xdb, 0x58, 0x06, 0x42, 0xe7, 0xe6, 0x0e, 0xed, 0x77, 0xae, 0x63, 0x98, 0x5c, 0x2e, 0x53, 0x63, 
	0x20, 0xbf, 0xb5, 0x8d, 0xee, 0x19, 0xcc, 0x2e, 0xd6, 0x13, 0xfc, 0xae, 0xb5, 0x8d, 0xee, 0xe1, 
	0xcc, 0x2f, 0xd6, 0x23, 0xfc, 0x3e, 0x98, 0xc9, 0x7e, 0xcd, 0x47, 0xc7, 0x8f, 0x54, 0xb9, 0x06, 
	0x7e, 0x07, 0x33, 0xdd, 0x6f, 0xfa, 0xcc, 0x99, 0xe8, 0xb7, 0xdc, 0x11, 0xb6, 0x2f, 0xbd, 0xaa, 
	0xe7, 0xa3, 0x45, 0x2c, 0x0c, 0x2a, 0xd5, 0x68, 0x3e, 0x34, 0xbe, 0x0e, 0x36, 0x15, 0xe0, 0xf6, 
	0x7e, 0x9d, 0xfd, 0x16, 0x8a, 0x36, 0xcd, 0xef, 0xce, 0x67, 0xd8, 0x1e, 0x92, 0xdf, 0x95, 0x7f, 
	0x8e, 0xf7, 0xcb, 0x9e, 0x06, 0xf9, 0x20, 0x80, 0xb5, 0xf9, 0x7e, 0xca, 0xa7, 0xb2, 0xd7, 0xef, 
	0x42, 0xff, 0x8e, 0x2a, 0xd4, 0x70, 0xa6, 0xfb, 0xe5, 0x0f, 0xff, 0xfc, 0x63, 0x59, 0xe4, 0xc1, 
	0x9e, 0xe3, 0xd7, 0x1b, 0x0a, 0xb1, 0x36, 0x16, 0x7e, 0xf9, 0x10, 0x44, 0x3e, 0xc4, 0x42, 0x76, 
	0x49, 0x96, 0xd9, 0xde, 0xf3, 0xeb, 0x7f, 0x40, 0xc7, 0xff, 0xc0, 0xfa, 0xcb, 0x8f, 0xea, 0x55, 
	0x7c, 0x9e, 0xf9, 0x29, 0x7e, 0xf5, 0xa1, 0xc0, 0x14, 0xa7, 0xdc, 0xa9, 0x97, 0xed, 0x05, 0xa3, 
	0x32, 0x90, 0x66, 0x66, 0x66, 0xfa, 0x95, 0x2b, 0x44, 0x52, 0x07, 0x47, 0xb7, 0xcf, 0xd2, 0xaf, 
	0xc8, 0x7c, 0xa2, 0x5f, 0x29, 0x49, 0x58, 0x33, 0xfd, 0x5a, 0xd9, 0x5b, 0x7e, 0x69, 0x9d, 0xce, 
	0x8a, 0x20, 0x96, 0xf9, 0x66, 0x66, 0x52, 0x07, 0xc7, 0xf9, 0x55, 0x4a, 0x7d, 0x81, 0xfa, 0xbb, 
	0x95, 0xa3, 0xb9, 0xfe, 0x7e, 0x94, 0xde, 0xf5, 0x9b, 0x5d, 0x52, 0x62, 0x99, 0xed, 0xce, 0xba, 
	0x93, 0x75, 0x71, 0x9a, 0x5f, 0x76, 0xf9, 0x5b, 0x9b, 0xef, 0xa7, 0xc5, 0xaf, 0xdf, 0x3e, 0x9b, 
	0x1b, 0x5b, 0x7e, 0xb3, 0xbf, 0x6a, 0xa1, 0x74, 0x89, 0x56, 0x4d, 0xd8, 0xcd, 0x71, 0xfd, 0x2b, 
	0x56, 0x4b, 0x8e, 0xe9, 0x3f, 0xbb, 0xa7, 0xa7, 0xdb, 0xaf, 0xb9, 0x1d, 0xfb, 0x9b, 0xd7, 0x5f, 
	0xc3, 0xaf, 0x55, 0x09, 0xfa, 0x98, 0xec, 0xb7, 0x95, 0x43, 0xc7, 0x37, 0xb4, 0xe0, 0xea, 0xfe, 
	0xf3, 0x2a, 0xed, 0xa4, 0xcd, 0xd8, 0xfd, 0x47, 0x69, 0xeb, 0xc5, 0x72, 0xd6, 0x3e, 0x8b, 0x96, 
	0xba, 0x0b, 0x8c, 0x3f, 0xc7, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 
	0x6c, 0xa6, 0xf8, 0xed, 0x64, 0xce, 0x91, 0x96, 0x31, 0x9f, 0x5b, 0xb5, 0x50, 0xad, 0xa3, 0x5d, 
	0xd8, 0xb0, 0xaa, 0x6f, 0xae, 0x06, 0xec, 0x1f, 0xa7, 0xfc, 0xd6, 0x45, 0xdb, 0x22, 0xae, 0xdf, 
	0x8a, 0x41, 0x11, 0x1e, 0x59, 0xb7, 0xb6, 0x2d, 0xf7, 0x3d, 0x39, 0x3b, 0xc0, 0x2f, 0x25, 0x1f, 
	0x70, 0x71, 0x02, 0x6b, 0xd7, 0xf2, 0xd4, 0x9b, 0xfb, 0x3d, 0x60, 0x7e, 0xca, 0x4c, 0xaa, 0x06, 
	0x37, 0x56, 0x63, 0x70, 0x24, 0x1f, 0x9e, 0xb3, 0x46, 0x9f, 0xf9, 0x40, 0x16, 0x6b, 0xeb, 0xb3, 
	0x65, 0xb9, 0x6d, 0x23, 0xad, 0x7a, 0xcf, 0x9f, 0x5f, 0x36, 0x95, 0xfc, 0x44, 0x1a, 0xef, 0x17, 
	0xb4, 0x57, 0x12, 0x62, 0x85, 0xbc, 0x56, 0xa8, 0x38, 0xfe, 0x49, 0xda, 0x0d, 0x7d, 0xd0, 0xb3, 
	0x63, 0x20, 0xab, 0x51, 0xef, 0xf9, 0xf3, 0x43, 0xa7, 0x52, 0x79, 0x22, 0x65, 0x5d, 0x34, 0xfc, 
	0x2a, 0xdb, 0x25, 0x8b, 0x62, 0x71, 0x96, 0xdf, 0x56, 0x42, 0xfb, 0x55, 0xda, 0x67, 0xa3, 0xfe, 
	0xf2, 0x45, 0xa5, 0xc1, 0x35, 0xbb, 0xc2, 0xaf, 0x4f, 0xf8, 0x3d, 0x9c, 0x3d, 0xfd, 0x2b, 0xbd, 
	0xfe, 0x8a, 0xa0, 0x2c, 0x95, 0xb7, 0xd5, 0xf0, 0x7b, 0x08, 0xbb, 0x9e, 0x8f, 0xaa, 0xdb, 0x67, 
	0xf8, 0x3d, 0x19, 0xde, 0xfb, 0x29, 0x84, 0xf2, 0xd7, 0x7b, 0xc9, 0xda, 0x2b, 0x51, 0xc9, 0x87, 
	0x35, 0xf3, 0x6c, 0x81, 0xf9, 0x1d, 0xdb, 0x7f, 0x6e, 0x26, 0xae, 0xdf, 0x43, 0x39, 0xd0, 0x58, 
	0x1b, 0xf0, 0x3b, 0x82, 0xcb, 0xea, 0x85, 0xdf, 0x01, 0xec, 0x1f, 0x4f, 0x9e, 0x0f, 0xfc, 0xc6, 
	0x06, 0x7e, 0x63, 0x53, 0xf2, 0xfb, 0xdf, 0x4e, 0x76, 0x15, 0xca, 0x1e, 0x42, 0xa4, 0x6b, 0x07, 
	0xb6, 0x8a, 0x55, 0xef, 0xfa, 0x68, 0xf8, 0xfe, 0xd4, 0x4e, 0xbe, 0x33, 0xd1, 0xe3, 0x0b, 0x7e, 
	0x7b, 0xf5, 0xee, 0x13, 0x6c, 0x3c, 0x25, 0xaa, 0x4f, 0xa0, 0x23, 0x68, 0x7d, 0x2a, 0x3d, 0xcf, 
	0xaf, 0xad, 0xd7, 0x10, 0xec, 0xfb, 0xed, 0xd7, 0xbb, 0x4b, 0x70, 0x9d, 0xdf, 0x71, 0xdc, 0xc6, 
	0xaf, 0xa7, 0x57, 0x17, 0x7c, 0x43, 0xbf, 0x62, 0xc0, 0x61, 0xa1, 0xe3, 0x06, 0xd9, 0x8f, 0x8e, 
	0xab, 0x1a, 0x5e, 0x1a, 0xe1, 0xe6, 0x56, 0x8e, 0x5f, 0x1b, 0x86, 0x45, 0xdb, 0x79, 0x8a, 0x5f, 
	0x19, 0x65, 0x2f, 0x6a, 0x6f, 0xf5, 0x5a, 0xde, 0x2f, 0x64, 0x83, 0x5a, 0x66, 0x3c, 0x75, 0x3b, 
	0xab, 0x0a, 0x4f, 0xf1, 0xbb, 0xbf, 0x38, 0xfb, 0xfd, 0x92, 0xf7, 0xb1, 0xf2, 0x3d, 0xab, 0x18, 
	0x78, 0x2c, 0xfa, 0xad, 0xda, 0x9f, 0xf6, 0x5d, 0x55, 0x2b, 0xe3, 0x95, 0xa0, 0xa6, 0xae, 0x5a, 
	0x1b, 0xa6, 0xc6, 0xbb, 0xf9, 0x4d, 0x9f, 0xd9, 0xea, 0x4a, 0xbf, 0xc6, 0x5b, 0xbd, 0x52, 0xfd, 
	0x5d, 0xe9, 0xa5, 0xc5, 0xb3, 0x53, 0xe3, 0x75, 0xbf, 0x0d, 0xc7, 0xda, 0x04, 0xfc, 0xca, 0x6d, 
	0x1b, 0xea, 0xaf, 0x54, 0x25, 0xaa, 0x6e, 0x55, 0xfb, 0xfc, 0xbe, 0x0a, 0xf5, 0xd7, 0x67, 0x90, 
	0xdf, 0xc6, 0xf6, 0xd9, 0xf6, 0x7b, 0xad, 0xfb, 0x6f, 0x53, 0x42, 0x9d, 0x5f, 0xf5, 0xf9, 0x3f, 
	0x5b, 0x93, 0x45, 0x1c, 0xe1, 0x97, 0x96, 0x4d, 0xed, 0x3f, 0xd7, 0xed, 0x50, 0xc9, 0xc3, 0xeb, 
	0x3f, 0x8b, 0xa8, 0x6c, 0x97, 0x93, 0x04, 0xcf, 0xf3, 0xbb, 0xda, 0xe7, 0xdb, 0xfc, 0xde, 0x5b, 
	0xfd, 0xeb, 0xd1, 0xeb, 0xd6, 0xb8, 0x4c, 0xaf, 0x42, 0xd2, 0x28, 0xba, 0x11, 0x23, 0xfc, 0x16, 
	0x7d, 0x9e, 0xe2, 0xd7, 0xbe, 0x61, 0x0e, 0xc9, 0xf9, 0x5a, 0x30, 0xbf, 0xdb, 0xe7, 0x3a, 0xd6, 
	0x2f, 0xef, 0x60, 0xd2, 0x76, 0x49, 0xb6, 0x58, 0x87, 0xd4, 0x5f, 0xf6, 0x00, 0x35, 0xb2, 0x6b, 
	0xf3, 0x50, 0xbf, 0x85, 0x6e, 0x08, 0x5d, 0x3c, 0xac, 0x7d, 0x7e, 0x0a, 0xf0, 0x7b, 0x06, 0xc7, 
	0x55, 0xf4, 0x63, 0xfc, 0xf2, 0xbe, 0xa9, 0xfd, 0x7d, 0xbf, 0xdf, 0xfc, 0x8c, 0x6d, 0xe3, 0x12, 
	0x13, 0x7a, 0x52, 0x6a, 0x46, 0x46, 0x1f, 0xde, 0xde, 0x5e, 0x7d, 0xc6, 0xa8, 0xdc, 0x55, 0xed, 
	0x91, 0x1c, 0x56, 0x7f, 0xd7, 0x9a, 0xef, 0x23, 0xfd, 0x2a, 0x6b, 0xaf, 0xe2, 0x57, 0x3f, 0x39, 
	0x0d, 0xbb, 0xaa, 0x3f, 0x92, 0xa9, 0x7e, 0xe9, 0xe3, 0xe7, 0xe4, 0xf6, 0xb9, 0xf3, 0x34, 0x8c, 
	0xd8, 0xdb, 0xc3, 0xfc, 0x92, 0xb6, 0xc7, 0xea, 0x3f, 0x93, 0x9d, 0xf6, 0xf6, 0x9f, 0xdd, 0xd3, 
	0x20, 0x86, 0x2e, 0x4a, 0xe3, 0x1b, 0x6d, 0x8d, 0x26, 0x7f, 0x18, 0x90, 0x8f, 0x04, 0x5a, 0xae, 
	0xf4, 0xb2, 0xa7, 0x6b, 0xd8, 0xdd, 0x8a, 0xf5, 0xf0, 0xb3, 0xde, 0xbe, 0x7c, 0xee, 0x30, 0x99, 
	0xe5, 0x77, 0x27, 0xd3, 0xfc, 0x92, 0xaf, 0x7a, 0xcb, 0xb1, 0x2d, 0xca, 0x53, 0x96, 0xdf, 0xc6, 
	0x73, 0x35, 0x32, 0x9f, 0x2c, 0x37, 0x7a, 0x79, 0xad, 0x54, 0x17, 0x5d, 0x93, 0x3e, 0x5f, 0xff, 
	0x95, 0x4b, 0x5b, 0xaa, 0xc9, 0x41, 0xc6, 0x9f, 0xd9, 0x3d, 0x5d, 0x9e, 0xb7, 0x55, 0x39, 0x8d, 
	0x9e, 0xdf, 0x96, 0xbd, 0x95, 0xfd, 0xca, 0x0d, 0x64, 0xe5, 0xdf, 0xd6, 0x89, 0xc5, 0x4a, 0xbf, 
	0x05, 0xe2, 0xf9, 0x55, 0xd6, 0xd6, 0xf9, 0x5d, 0x5e, 0x2d, 0xac, 0xcc, 0xa3, 0x50, 0x7f, 0xe5, 
	0xc3, 0x80, 0x9a, 0x5b, 0x7e, 0xd1, 0xb1, 0xac, 0x76, 0xf9, 0x6d, 0x6b, 0x9f, 0x6b, 0x13, 0xc2, 
	0xfa, 0x75, 0x73, 0x32, 0xf7, 0x46, 0x1b, 0x0e, 0xf9, 0x29, 0x72, 0x53, 0x93, 0xd2, 0x2d, 0x84, 
	0x14, 0xb2, 0xd2, 0x6f, 0x45, 0x71, 0xe1, 0xf7, 0xb8, 0xf6, 0x79, 0xb4, 0xdf, 0x9a, 0x46, 0x3a, 
	0x8e, 0x5f, 0x6d, 0xb4, 0x40, 0xf5, 0xbb, 0x96, 0xfa, 0xcf, 0x6d, 0x7b, 0x63, 0x39, 0xd0, 0x4f, 
	0x96, 0x1b, 0x09, 0x17, 0xb9, 0xf0, 0xa2, 0x2a, 0x7e, 0x07, 0xf5, 0x9f, 0x6b, 0x13, 0x2a, 0xfc, 
	0x76, 0xe2, 0x97, 0x78, 0x0c, 0x6a, 0x0b, 0x7b, 0xf0, 0x8e, 0xab, 0xd6, 0x77, 0xf2, 0x9d, 0x8b, 
	0xb6, 0xc5, 0xed, 0xfd, 0xea, 0x2d, 0xde, 0xc9, 0xcc, 0x2a, 0xc4, 0x03, 0xfd, 0xae, 0x6a, 0x8b, 
	0x77, 0x2a, 0xf3, 0x0a, 0x31, 0xda, 0xef, 0x49, 0xf3, 0x53, 0x80, 0x45, 0xab, 0xde, 0x6b, 0xce, 
	0x2f, 0x03, 0x26, 0x8d, 0x7a, 0x31, 0x3f, 0x34, 0x38, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 
	0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 
	0xf0, 0x1b, 0x9b, 0x92, 0xdf, 0xff, 0x74, 0x72, 0xd6, 0x71, 0x45, 0xe5, 0x7b, 0x13, 0x3d, 0xbe, 
	0xe0, 0xb7, 0x57, 0x2f, 0x04, 0x8f, 0xc5, 0xd6, 0x6b, 0x08, 0xf6, 0xfd, 0xf6, 0xeb, 0x85, 0xe0, 
	0x91, 0x78, 0x7a, 0x75, 0xc1, 0xf0, 0x7b, 0x27, 0xe0, 0x37, 0x36, 0x53, 0xfc, 0xee, 0x2f, 0x0e, 
	0xfc, 0x0e, 0xc6, 0xd4, 0x08, 0xbf, 0x21, 0x80, 0xdf, 0xd8, 0xcc, 0xf3, 0xab, 0xfd, 0x1e, 0xb9, 
	0x08, 0xfc, 0x0e, 0x66, 0x9a, 0xdf, 0xec, 0xd7, 0xdc, 0x55, 0xc0, 0xef, 0x60, 0xe0, 0x37, 0x36, 
	0x54, 0x23, 0x6b, 0x50, 0xc7, 0xf8, 0x25, 0x19, 0xf3, 0x59, 0x20, 0xfa, 0x12, 0xfc, 0x8e, 0x26, 
	0x69, 0x14, 0xf3, 0xbb, 0x87, 0xdc, 0x7f, 0x3f, 0x56, 0x8a, 0xd9, 0x50, 0xe6, 0x07, 0xfc, 0x0e, 
	0x67, 0xd3, 0xc8, 0x27, 0x49, 0x8d, 0xe9, 0x3f, 0xb3, 0xd9, 0x50, 0x62, 0x4a, 0xa3, 0xfe, 0x15, 
	0x7e, 0x07, 0x33, 0xd5, 0xaf, 0x3a, 0xb1, 0x31, 0x9b, 0xa6, 0x47, 0x67, 0xfe, 0xc1, 0xef, 0x60, 
	0xa6, 0xf9, 0x55, 0x67, 0xc3, 0xaa, 0xf3, 0x56, 0xe9, 0x9d, 0x1a, 0x7e, 0x07, 0x73, 0xae, 0x5f, 
	0xdc, 0x7f, 0x67, 0x33, 0xaf, 0x7d, 0x76, 0x66, 0x51, 0xe7, 0xf3, 0xa2, 0xd1, 0x7f, 0x9e, 0xc4, 
	0xbc, 0xfe, 0x33, 0xa1, 0xfe, 0x29, 0x18, 0x7e, 0x07, 0x33, 0xed, 0xf9, 0x97, 0x02, 0xbf, 0xa7, 
	0x71, 0xc8, 0xfb, 0x05, 0xf8, 0x3d, 0x0d, 0xbc, 0x3f, 0x8a, 0x0d, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 
	0x03, 0xbf, 0xb1, 0x99, 0xe2, 0xb7, 0x93, 0x39, 0x47, 0xfa, 0x4c, 0xbe, 0x77, 0xd1, 0xb6, 0x80, 
	0xdf, 0x3b, 0x01, 0xbf, 0xb1, 0x19, 0xed, 0x17, 0xf3, 0x53, 0x2e, 0x46, 0xab, 0x5e, 0xcc, 0x2f, 
	0xbb, 0x19, 0x8d, 0x7a, 0x31, 0x3f, 0x34, 0x38, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 
	0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 0xf0, 
	0x1b, 0x9b, 0x92, 0xdf, 0x7f, 0x9b, 0xf0, 0x7c, 0x7e, 0x37, 0xe1, 0x71, 0xbf, 0x99, 0xf0, 0xb8, 
	0x5f, 0x4d, 0x78, 0xdc, 0x2f, 0x26, 0x3c, 0xee, 0x67, 0x13, 0x1e, 0xf7, 0x93, 0x09, 0x8f, 0xfb, 
	0xd1, 0x84, 0xc7, 0xfd, 0x60, 0xc2, 0xe3, 0xfe, 0x65, 0xc2, 0xe3, 0xfe, 0x69, 0xb2, 0xaa, 0x14, 
	0xfc, 0xda, 0x7a, 0xb9, 0x60, 0x5b, 0x2f, 0x17, 0x6c, 0xeb, 0xe5, 0x82, 0x6d, 0xbd, 0x5c, 0xb0, 
	0xad, 0x97, 0x0b, 0xb6, 0xf5, 0x72, 0xc1, 0xb6, 0x5e, 0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 0x7a, 
	0xb9, 0x60, 0x5b, 0x2f, 0x17, 0x6c, 0xeb, 0x35, 0x04, 0xfb, 0x7e, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 
	0x97, 0x0a, 0xf6, 0xf4, 0x52, 0xc1, 0x9e, 0x5e, 0x2a, 0xd8, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 
	0x60, 0x4f, 0x2f, 0x15, 0xec, 0xe9, 0xa5, 0x82, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 0xf6, 
	0xf4, 0xea, 0x82, 0xe1, 0x17, 0x7e, 0xe1, 0x37, 0xb4, 0x5f, 0x6d, 0x33, 0xcd, 0xaf, 0x16, 0xa7, 
	0xf9, 0xd5, 0xe2, 0x34, 0xbf, 0x5a, 0x9c, 0xe6, 0x57, 0x8b, 0xd3, 0xfc, 0x6a, 0x71, 0x9a, 0x5f, 
	0x2d, 0x4e, 0xf3, 0xab, 0xc5, 0x69, 0x7e, 0xb5, 0x38, 0xcd, 0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 
	0xe0, 0xb7, 0xdd, 0x2f, 0xfd, 0xff, 0x05, 0xc1, 0x2f, 0xfc, 0x2a, 0x09, 0x2d, 0x7e, 0xb5, 0xb0, 
	0xeb, 0xf9, 0x4d, 0xd3, 0x45, 0x45, 0xc2, 0x1b, 0xf0, 0xab, 0x27, 0x5c, 0xc0, 0x2f, 0xff, 0x27, 
	0x97, 0x7b, 0xfd, 0xd2, 0x69, 0xc3, 0x2c, 0xe1, 0x9d, 0x97, 0x46, 0xf1, 0x6f, 0x2c, 0x7b, 0x7e, 
	0xf9, 0x84, 0x58, 0xd3, 0xaf, 0x98, 0x37, 0x7b, 0x41, 0xbf, 0xec, 0x3c, 0x9b, 0x7e, 0x59, 0xd4, 
	0xb0, 0xfa, 0x3b, 0xcc, 0xef, 0x87, 0xd8, 0xad, 0x88, 0x37, 0xf6, 0xcb, 0xce, 0xb4, 0xe3, 0x97, 
	0xc5, 0x99, 0x7e, 0x45, 0xf9, 0x3c, 0xbf, 0x34, 0x6e, 0x8c, 0xdf, 0x74, 0xc4, 0xf6, 0xfd, 0xf7, 
	0xe5, 0x2d, 0x4b, 0xf8, 0x0b, 0xa2, 0x91, 0xb7, 0x07, 0xfd, 0x7e, 0xdf, 0xd2, 0xb7, 0xfc, 0xfa, 
	0xfd, 0xf2, 0x0a, 0x62, 0xfb, 0xe5, 0x19, 0x16, 0xfc, 0xaa, 0x09, 0x2b, 0xf1, 0x2b, 0xaa, 0x47, 
	0xc9, 0xef, 0x16, 0x38, 0xc4, 0x2f, 0x29, 0x60, 0xbf, 0xdf, 0x95, 0x9d, 0x3f, 0xeb, 0xfe, 0xfb, 
	0x21, 0x6d, 0x53, 0x77, 0x9c, 0xdf, 0xda, 0xfa, 0xdb, 0xe2, 0x57, 0x4f, 0x58, 0x6f, 0xe5, 0x97, 
	0x7b, 0xf3, 0xfa, 0x57, 0xf4, 0x82, 0xbe, 0xbb, 0x5f, 0x25, 0xe1, 0x2f, 0x6e, 0xe5, 0x97, 0x16, 
	0x70, 0x80, 0xdf, 0xaa, 0xfa, 0x9b, 0xe4, 0xbe, 0x87, 0x7a, 0xfd, 0x67, 0x9a, 0xdf, 0x35, 0xef, 
	0xbf, 0x7a, 0xc2, 0x7a, 0x0d, 0xbf, 0xac, 0x7c, 0x25, 0xbf, 0x5a, 0xc2, 0xda, 0x7e, 0xff, 0xbd, 
	0x83, 0x5f, 0x16, 0x7b, 0x5f, 0xbf, 0xbc, 0x1d, 0xf2, 0xc6, 0x37, 0xaa, 0xfc, 0x2e, 0xaf, 0xfb, 
	0xb4, 0xdb, 0x7f, 0x5e, 0xa5, 0x10, 0xf7, 0xf9, 0x97, 0xec, 0xf7, 0xae, 0xf7, 0xdf, 0xf3, 0xfa, 
	0xcf, 0xbc, 0xbe, 0x15, 0xfc, 0xea, 0x09, 0xed, 0xcf, 0xbf, 0xd9, 0x81, 0x74, 0xfb, 0x15, 0xc7, 
	0x71, 0x39, 0xbf, 0xe7, 0x3e, 0xff, 0x5a, 0x09, 0xa2, 0x7d, 0xd6, 0x13, 0xd6, 0x98, 0xe3, 0x57, 
	0x43, 0xef, 0xbf, 0x32, 0xb6, 0xd4, 0x3e, 0xe7, 0x09, 0x82, 0xe1, 0x7e, 0xf9, 0x8e, 0xef, 0xec, 
	0x97, 0xde, 0x68, 0x0e, 0x1e, 0x9f, 0xbc, 0xae, 0x5f, 0xb1, 0xdf, 0x5b, 0xfb, 0x5d, 0xcd, 0x84, 
	0xe7, 0xfa, 0x15, 0xc0, 0x2f, 0xfc, 0x2a, 0x09, 0x4f, 0xf7, 0xcb, 0x12, 0x2e, 0xf5, 0x7e, 0x50, 
	0x00, 0xbf, 0xf0, 0xab, 0x24, 0x3c, 0xd1, 0xef, 0x69, 0xbf, 0xdf, 0x30, 0x49, 0x71, 0xbf, 0xbb, 
	0xa4, 0xb8, 0xdf, 0x5c, 0x52, 0xdc, 0xaf, 0x2e, 0x29, 0xee, 0x17, 0x97, 0x14, 0xf7, 0xb3, 0x4b, 
	0x8a, 0xfb, 0xc9, 0x25, 0xc5, 0xfd, 0xe8, 0x92, 0xe2, 0x7e, 0x70, 0x11, 0x1a, 0x4d, 0x84, 0x46, 
	0x13, 0xf8, 0x85, 0x5f, 0xf8, 0x7d, 0x92, 0x5f, 0xcc, 0x4f, 0x51, 0xf5, 0x86, 0x99, 0x9f, 0x82, 
	0xf9, 0x65, 0xba, 0xde, 0x30, 0xf3, 0xcb, 0xc0, 0xcd, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0x34, 
	0xbf, 0x10, 0x1c, 0x06, 0x55, 0x2f, 0xfc, 0x86, 0x41, 0xf7, 0x0b, 0xc1, 0x41, 0x30, 0xf4, 0xc2, 
	0x6f, 0x10, 0x2c, 0xbf, 0x10, 0x1c, 0x02, 0x53, 0x2f, 0x0c, 0x07, 0xc0, 0xb3, 0x0b, 0xc3, 0x77, 
	0xa7, 0x64, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x18, 0xc2, 0x9f, 0xfe, 0xbb, 0x89, 0xf5 
};

#endif

--- NEW FILE: kbd_ls_c.cpp ---
#ifndef __keyboard_letters_shift_compressed__
#define __keyboard_letters_shift_compressed__

unsigned int size_keyboard_letters_shift_compressed = 3450;
unsigned char keyboard_letters_shift_compressed[] __attribute__((aligned(16))) = {
	0x78, 0x9c, 0xed, 0x9d, 0xe9, 0xb6, 0xab, 0x38, 0x0e, 0x46, 0xe9, 0xae, 0xb9, 0xbb, 0x86, 0xee, 
	0x9a, 0xab, 0xa7, 0xf7, 0x7f, 0x42, 0xea, 0x6f, 0xaf, 0x73, 0x13, 0xb0, 0x24, 0x4b, 0xb2, 0xc1, 
	0x03, 0x41, 0xf9, 0xf6, 0x5a, 0x27, 0x21, 0x58, 0x36, 0x0e, 0x1b, 0x8c, 0x31, 0xf1, 0xbd, 0x7f, 
	0xfe, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x8d, 0x58, 0xc1, 
	0x8d, 0x81, 0xdd, 0xe8, 0xc0, 0x6e, 0x74, 0xa0, 0x37, 0x38, 0xf0, 0x1b, 0x1b, 0xe8, 0x0d, 0x0e, 
	0xfc, 0xc6, 0x06, 0x7a, 0x83, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0x94, 0xfc, 0xfe, 0xc5, 0x84, 
	0x97, 0xf3, 0x57, 0x13, 0x1e, 0xf7, 0x99, 0x09, 0x8f, 0xfb, 0xdc, 0x84, 0xc7, 0x7d, 0x61, 0xc2, 
	0xe3, 0xbe, 0x34, 0xe1, 0x71, 0x5f, 0x99, 0xf0, 0xb8, 0xaf, 0x4d, 0x78, 0xdc, 0x37, 0x26, 0x3c, 
	0xee, 0x6f, 0x26, 0x3c, 0xee, 0xef, 0x26, 0xab, 0x4a, 0xc1, 0xaf, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 
	0x72, 0xc1, 0xb6, 0x5e, 0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 0x7a, 0xb9, 0x60, 0x5b, 0x2f, 0x17, 
	0x6c, 0xeb, 0xe5, 0x82, 0x6d, 0xbd, 0x5c, 0xb0, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 0x72, 0xc1, 0xb6, 
	0x5e, 0x43, 0xb0, 0xef, 0xd7, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 0x60, 0x4f, 0x2f, 0x15, 0xec, 
	0xe9, 0xa5, 0x82, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 0xf6, 0xf4, 0x52, 0xc1, 0x9e, 0x5e, 
	0x2a, 0xd8, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 0x60, 0x4f, 0xaf, 0x2e, 0x18, 0x7e, 0xe1, 0x17, 
	0x7e, 0x43, 0xfb, 0xd5, 0xb2, 0x69, 0x7e, 0xb5, 0x38, 0xcd, 0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 
	0x34, 0xbf, 0x5a, 0x9c, 0xe6, 0x57, 0x8b, 0xd3, 0xfc, 0x6a, 0x71, 0x9a, 0x5f, 0x2d, 0x4e, 0xf3, 
	0xab, 0xc5, 0x69, 0x7e, 0xb5, 0x38, 0xcd, 0xaf, 0x16, 0x07, 0xbf, 0xf0, 0x5b, 0xf2, 0xbb, 0x2c, 
	0x8b, 0x9e, 0x00, 0xbf, 0x56, 0x42, 0x38, 0xbf, 0xcb, 0x93, 0x2c, 0xe1, 0x01, 0xd5, 0xc8, 0x02, 
	0x2d, 0xbf, 0xb2, 0x3c, 0xd3, 0xef, 0xb2, 0xb0, 0x50, 0xdb, 0x2f, 0x0f, 0x74, 0xfc, 0xb2, 0x0d, 
	0x5b, 0x7e, 0xf7, 0x88, 0xe7, 0x82, 0xe7, 0x97, 0xee, 0xbf, 0x82, 0xdf, 0x3d, 0xd4, 0xf2, 0xbb, 
	0x05, 0x6c, 0xef, 0x1d, 0xfc, 0xb2, 0xfd, 0xec, 0xf8, 0x65, 0xf5, 0x33, 0xfd, 0x8a, 0x40, 0xc7, 
	0x2f, 0x2b, 0xcf, 0xf3, 0x4b, 0xbf, 0x96, 0xeb, 0x77, 0x55, 0x13, 0x3e, 0x48, 0x1a, 0xc5, 0x86, 
	0x5f, 0xd4, 0xef, 0x1e, 0x37, 0xd9, 0xef, 0xfe, 0x6e, 0xf9, 0x95, 0xfb, 0xa5, 0xe0, 0x77, 0x7f, 
	0x9f, 0xe5, 0x57, 0xd6, 0xef, 0x35, 0xfd, 0xa6, 0x12, 0xe1, 0x37, 0xa0, 0x5f, 0x52, 0x60, 0xbb, 
	0xdf, 0x8f, 0xc2, 0x52, 0x81, 0x8d, 0x7e, 0x85, 0x8d, 0xb2, 0xdf, 0x6d, 0x61, 0x92, 0xdf, 0xac, 
	0x7e, 0xaf, 0xe8, 0x97, 0x96, 0x37, 0xd9, 0x6f, 0xe9, 0xfa, 0x0b, 0xbf, 0xed, 0x7e, 0x59, 0x1d, 
	0x27, 0xfa, 0x65, 0x9b, 0x9e, 0xe9, 0x97, 0x6e, 0xb8, 0xa2, 0xff, 0x2c, 0x13, 0x3e, 0x38, 0xe3, 
	0x97, 0x15, 0x38, 0xd5, 0xef, 0xaa, 0x24, 0x48, 0x6a, 0xfd, 0x8a, 0x0b, 0xfa, 0x7b, 0x9c, 0xbf, 
	0xc9, 0x5b, 0xf8, 0xf3, 0xf7, 0x98, 0xdf, 0x38, 0xd7, 0xdf, 0x97, 0xf6, 0xdb, 0xf1, 0xfa, 0x2b, 
	0xda, 0x3f, 0xf8, 0xbd, 0xdc, 0xef, 0x4a, 0x05, 0xb7, 0xfa, 0x95, 0xde, 0x70, 0x7f, 0x34, 0xc8, 
	0xaf, 0x68, 0x27, 0x4b, 0xf7, 0x47, 0xbd, 0xee, 0x7f, 0xe1, 0xf7, 0x05, 0xfd, 0x12, 0xc1, 0x93, 
	0xfd, 0x96, 0xfa, 0x57, 0x59, 0xe0, 0xab, 0x8e, 0x4f, 0xce, 0x6f, 0x9f, 0x17, 0x76, 0x9f, 0x52, 
	0x1e, 0x9f, 0x5c, 0x78, 0x82, 0xa4, 0xfa, 0xfe, 0x88, 0x73, 0xeb, 0xe7, 0x0b, 0xab, 0x9a, 0xf0, 
	0x41, 0xfe, 0x7c, 0xe1, 0x19, 0x3d, 0xf1, 0xfa, 0xcb, 0xbe, 0x6f, 0xc5, 0xf3, 0x85, 0x85, 0x25, 
	0x48, 0x3a, 0xfb, 0x95, 0xe0, 0xf9, 0xe0, 0x7d, 0x9e, 0x0f, 0x52, 0xe0, 0x17, 0x7e, 0x95, 0x04, 
	0xf8, 0xd5, 0x13, 0x2e, 0xf5, 0x6b, 0x92, 0xe2, 0xfe, 0xea, 0x92, 0xe2, 0x3e, 0x73, 0x49, 0x71, 
	0x9f, 0xbb, 0xa4, 0xb8, 0x2f, 0x5c, 0x52, 0xdc, 0x97, 0x2e, 0x29, 0xee, 0x2b, 0x97, 0x14, 0xf7, 
	0xb5, 0x4b, 0x8a, 0xfb, 0xc6, 0x45, 0x68, 0x34, 0x11, 0x1a, 0x4d, 0xe0, 0x17, 0x7e, 0xe1, 0xf7, 
	0x9d, 0xfc, 0x62, 0x7e, 0x8a, 0xaa, 0x37, 0xcc, 0xfc, 0x14, 0xcc, 0x2f, 0xd3, 0xf5, 0x86, 0x99, 
	0x5f, 0x06, 0x6e, 0x0e, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 
	0x6f, 0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0xa6, 0xe4, 0xf7, 
	0x7f, 0x8d, 0x5c, 0xf5, 0xbd, 0xa2, 0xf2, 0xad, 0x89, 0x1e, 0x5f, 0xf0, 0xdb, 0xaa, 0x17, 0x82, 
	0xfb, 0x62, 0xeb, 0x35, 0x04, 0xfb, 0x7e, 0xdb, 0xf5, 0x42, 0x70, 0x4f, 0x3c, 0xbd, 0xba, 0x60, 
	0xf8, 0xbd, 0x13, 0xf0, 0x1b, 0x9b, 0x21, 0x7e, 0xcf, 0x57, 0x07, 0x7e, 0x3b, 0x63, 0x6a, 0x84, 
	0xdf, 0x10, 0xc0, 0x6f, 0x6c, 0x88, 0x46, 0x3e, 0x0f, 0x03, 0x7e, 0x43, 0x30, 0xd4, 0xaf, 0x9c, 
	0x0b, 0xb4, 0xad, 0xb5, 0xab, 0x03, 0xbf, 0x9d, 0x19, 0xec, 0x57, 0x2b, 0x00, 0x7e, 0x27, 0x02, 
	0xbf, 0xb1, 0x99, 0xe5, 0x37, 0x35, 0xd4, 0xf4, 0x7d, 0x59, 0xc5, 0xec, 0x46, 0xf8, 0xed, 0xcc, 
	0x8c, 0xeb, 0xef, 0x63, 0x71, 0x7b, 0x59, 0xc5, 0x0a, 0xb6, 0x59, 0xf8, 0xed, 0xcc, 0xbc, 0xf3, 
	0x77, 0x35, 0xfd, 0xae, 0x46, 0x76, 0xd0, 0xce, 0x85, 0x7e, 0x9f, 0xe7, 0x36, 0xfc, 0x8e, 0xe4, 
	0xda, 0xf3, 0x57, 0x04, 0xc1, 0x6f, 0x77, 0xd0, 0x3e, 0xc7, 0x66, 0xd6, 0xf8, 0x06, 0xf1, 0xbb, 
	0xf2, 0x7e, 0x33, 0xfc, 0x8e, 0x04, 0xe3, 0x93, 0xb1, 0x81, 0xdf, 0xd8, 0x70, 0xbf, 0xe4, 0x86, 
	0x15, 0x7e, 0x43, 0x80, 0xe7, 0x83, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0x86, 0xf8, 0x6d, 
	0x64, 0xcc, 0x37, 0x7d, 0x4f, 0xbe, 0x75, 0xd1, 0x72, 0xc0, 0xef, 0x9d, 0x80, 0xdf, 0xd8, 0xf4, 
	0xf6, 0x8b, 0xf9, 0x29, 0x2f, 0xc6, 0x51, 0xbd, 0x98, 0x5f, 0x76, 0x33, 0x0e, 0xea, 0xc5, 0xfc, 
	0xd0, 0xe0, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0xcd, 0x0b, 0xf8, 
	0xf5, 0x7e, 0x41, 0x2d, 0xff, 0xdf, 0x1b, 0x2f, 0x26, 0x8f, 0xac, 0xc8, 0xbb, 0x97, 0xa0, 0x4c, 
	0xcc, 0xb0, 0x72, 0xf3, 0x04, 0x2d, 0x6f, 0x21, 0x4b, 0x71, 0x0b, 0xfd, 0x78, 0x75, 0xbf, 0x35, 
	0x8e, 0x9a, 0xfd, 0xea, 0xf9, 0xeb, 0xfc, 0x5a, 0xdb, 0xae, 0x29, 0xeb, 0x2d, 0xfc, 0x16, 0x8e, 
	0xfe, 0x3a, 0xbf, 0xd9, 0x4f, 0x83, 0x6a, 0xf3, 0x92, 0x38, 0xf8, 0x1d, 0x42, 0xf2, 0x4b, 0x5a, 
	0x3a, 0xba, 0x24, 0x56, 0xe4, 0x0d, 0xe2, 0xa7, 0xff, 0xf1, 0x8b, 0x44, 0xae, 0x69, 0xaf, 0x57, 
	0x34, 0x9d, 0x6b, 0x26, 0x8c, 0xb7, 0x07, 0x6c, 0xaa, 0xc6, 0xf6, 0x53, 0x33, 0x35, 0xaf, 0xf2, 
	0x83, 0x61, 0xad, 0xce, 0xd9, 0x77, 0x1b, 0xc9, 0xe5, 0x7e, 0x55, 0x33, 0xf6, 0xef, 0x33, 0xf9, 
	0x6f, 0xfb, 0xf6, 0x22, 0x2c, 0xbf, 0x32, 0x54, 0xee, 0x77, 0xb2, 0x96, 0xd4, 0x47, 0x2d, 0x23, 
	0xfb, 0x61, 0x61, 0x96, 0x57, 0x56, 0xb8, 0x58, 0xa9, 0x17, 0xf0, 0xfb, 0xdf, 0x46, 0x8a, 0x15, 
	0xd0, 0x77, 0xc2, 0xfe, 0xb1, 0xd2, 0xef, 0xe6, 0xb8, 0x14, 0xea, 0xd5, 0x43, 0x3d, 0xc8, 0x84, 
	0x5f, 0x52, 0x31, 0x23, 0xaf, 0x58, 0xec, 0xed, 0xf7, 0x3b, 0x13, 0x3d, 0xbe, 0xe0, 0xb7, 0x55, 
	0x6f, 0x59, 0xf0, 0x22, 0x9a, 0x2b, 0xd9, 0xb2, 0x56, 0xfa, 0x5d, 0xf5, 0x52, 0x64, 0xa8, 0x71, 
	0xfe, 0xa6, 0x8c, 0x6b, 0x4a, 0x16, 0x9f, 0x1d, 0xbf, 0xf2, 0xa4, 0x25, 0x8b, 0x9d, 0xfd, 0xda, 
	0x7a, 0x0d, 0xc1, 0xbe, 0xdf, 0x76, 0xbd, 0x25, 0xc1, 0xba, 0xc4, 0xc3, 0xed, 0x73, 0xb5, 0xdf, 
	0xba, 0x4a, 0x64, 0x6b, 0x95, 0x04, 0x2d, 0x8a, 0xb7, 0xd5, 0xfd, 0xfd, 0x7a, 0x7a, 0x75, 0xc1, 
	0x61, 0xfc, 0x2a, 0x0d, 0xec, 0x79, 0xbf, 0x66, 0xfb, 0x6c, 0x6f, 0xfc, 0xf9, 0x01, 0x7e, 0x39, 
	0xa6, 0x44, 0xab, 0x17, 0xcb, 0x5a, 0x74, 0x5e, 0x46, 0x96, 0x5e, 0xdb, 0x7f, 0x66, 0x81, 0xc5, 
	0xfe, 0x33, 0xd9, 0x54, 0xb6, 0x11, 0xb6, 0xc0, 0xfc, 0x76, 0xe9, 0x3f, 0x0f, 0xf1, 0x7b, 0xb0, 
	0x0e, 0x84, 0xc6, 0xec, 0x0e, 0xc7, 0xaf, 0x5c, 0x73, 0x18, 0x5c, 0x2f, 0x53, 0x63, 0x20, 0xbf, 
	0xb5, 0x8d, 0xee, 0x15, 0x8c, 0xae, 0xd6, 0x3b, 0xf8, 0x5d, 0x6b, 0x1b, 0xdd, 0xe9, 0x8c, 0xaf, 
	0xd6, 0x53, 0x23, 0xdd, 0xd0, 0x63, 0x39, 0x92, 0xdf, 0x37, 0x66, 0xb0, 0x5f, 0xf3, 0xd6, 0xf1, 
	0x99, 0x2a, 0xd7, 0xc0, 0x6f, 0x67, 0x92, 0xdf, 0xd4, 0x8f, 0xeb, 0xea, 0x37, 0xbd, 0xe6, 0x0c, 
	0xf4, 0x5b, 0xee, 0x08, 0xdb, 0x87, 0x5e, 0xd5, 0xfd, 0xd1, 0x22, 0x16, 0x3a, 0xd5, 0xaa, 0x37, 
	0x71, 0xfd, 0x3a, 0xdb, 0x2d, 0x54, 0x6d, 0x98, 0xdf, 0x93, 0xf7, 0xb0, 0x2d, 0x10, 0xbf, 0xfc, 
	0xe6, 0xad, 0xbf, 0xdf, 0x7c, 0x1b, 0xe4, 0x76, 0x4f, 0xcf, 0x7e, 0x9e, 0xf2, 0xae, 0x6c, 0xf5, 
	0xbb, 0xd0, 0xf7, 0x5e, 0x95, 0xea, 0xce, 0x70, 0xbf, 0xfc, 0xe6, 0x9f, 0xbf, 0x2c, 0x8b, 0xfc, 
	0xb2, 0xd7, 0xf8, 0xf5, 0x86, 0x42, 0xac, 0xcc, 0xc2, 0x2f, 0x1f, 0x82, 0xc8, 0x87, 0x58, 0xc8, 
	0x26, 0xc9, 0x32, 0xdb, 0x7a, 0xee, 0xa0, 0x43, 0xc7, 0x9f, 0xfa, 0xdd, 0x37, 0x32, 0xae, 0x7d, 
	0xe6, 0xcd, 0x66, 0x5e, 0xfb, 0x4b, 0xfc, 0xea, 0x43, 0x81, 0x29, 0x4e, 0xb9, 0x52, 0x2f, 0xfb, 
	0x03, 0x46, 0x65, 0x20, 0xcd, 0x2c, 0xcc, 0xf4, 0x2b, 0x57, 0x88, 0xa4, 0x06, 0x26, 0xfa, 0x25, 
	0xdb, 0xd8, 0x53, 0x65, 0xf5, 0x07, 0xfa, 0x95, 0x92, 0x84, 0x35, 0xd3, 0xaf, 0x55, 0xbc, 0xe5, 
	0x97, 0x9e, 0xd3, 0x59, 0x15, 0xc4, 0x32, 0xcf, 0x66, 0x26, 0x35, 0x40, 0xee, 0x8f, 0xe8, 0xdf, 
	0x00, 0xbf, 0x4a, 0xad, 0x5f, 0xe0, 0xfc, 0xdd, 0xeb, 0x71, 0xf8, 0xfc, 0x7d, 0xd6, 0xde, 0xf5, 
	0x9b, 0x1d, 0x52, 0x62, 0x99, 0x6d, 0xce, 0xba, 0x92, 0x35, 0x71, 0x99, 0x5f, 0x76, 0xf8, 0x5b, 
	0xd9, 0xcf, 0x73, 0xc4, 0xaf, 0xdf, 0x3e, 0x9b, 0x99, 0x2d, 0xbf, 0xd9, 0xbb, 0x5a, 0x29, 0x5d, 
	0xa2, 0x75, 0x26, 0x9c, 0x86, 0x8e, 0x6f, 0x2c, 0x5b, 0x8d, 0x7b, 0xfa, 0x15, 0xbd, 0x06, 0xd6, 
	0x6d, 0x48, 0xfb, 0xc7, 0xc8, 0x7e, 0x9e, 0xf2, 0xee, 0x69, 0xf6, 0x6b, 0xe6, 0x63, 0xef, 0xf9, 
	0xf9, 0x6b, 0xf8, 0xb5, 0x4e, 0x82, 0x36, 0x06, 0xfb, 0x3d, 0xca, 0xd4, 0xf1, 0x0d, 0x2d, 0xb8, 
	0x9c, 0x2f, 0x65, 0x96, 0x8d, 0xf2, 0x42, 0x13, 0xe5, 0xca, 0xac, 0xf4, 0xac, 0x3b, 0x22, 0x2a, 
	0x21, 0xea, 0x78, 0x12, 0x36, 0x3e, 0x49, 0x5f, 0x6f, 0xee, 0x17, 0x3c, 0x80, 0xdf, 0xd8, 0xbc, 
	0xc5, 0xf3, 0xc1, 0x37, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x19, 0xe2, 0xb7, 0x91, 0x31, 0xdf, 
	0xb4, 0x8c, 0x79, 0xdf, 0xaa, 0x85, 0x6a, 0x1d, 0xed, 0x42, 0xc6, 0xaa, 0xbe, 0xb9, 0x1a, 0x50, 
	0xd3, 0xa5, 0xd7, 0xf9, 0xce, 0x45, 0xcb, 0x11, 0xd7, 0x6f, 0xc5, 0xa0, 0x08, 0x8f, 0xac, 0x5b, 
	0x7b, 0xac, 0xf4, 0x33, 0x25, 0x3b, 0xc0, 0x2f, 0x25, 0x1f, 0x70, 0x71, 0x02, 0x6b, 0xd7, 0xf2, 
	0xd4, 0x9b, 0xfb, 0x9d, 0x30, 0x3f, 0x65, 0x24, 0x55, 0x83, 0x1b, 0xab, 0x31, 0x38, 0x92, 0x0f, 
	0xcf, 0x59, 0xa3, 0xcf, 0x7c, 0x20, 0x8b, 0xb5, 0xf5, 0xd9, 0xb2, 0xcc, 0x7b, 0x90, 0xa3, 0x7a, 
	0xaf, 0x9f, 0x5f, 0x36, 0x94, 0x7c, 0x47, 0x1a, 0xcf, 0x17, 0x94, 0xa7, 0x01, 0x72, 0xe4, 0x51, 
	0x1e, 0x2b, 0x54, 0x1c, 0x7f, 0x25, 0xed, 0x86, 0x3e, 0xe8, 0xd9, 0x30, 0x90, 0x75, 0x50, 0xef, 
	0xf5, 0xf3, 0x43, 0x87, 0x52, 0xb9, 0x23, 0xe5, 0xb9, 0x68, 0xf8, 0x55, 0xf2, 0x25, 0x8b, 0x62, 
	0x71, 0x94, 0xdf, 0xa3, 0x84, 0xf6, 0xab, 0xb4, 0xcf, 0xc6, 0xf9, 0xcb, 0x17, 0x95, 0x06, 0xd7, 
	0xec, 0x0a, 0x6f, 0xaf, 0xf0, 0x3b, 0x9d, 0x33, 0xfd, 0x2b, 0xfd, 0xfc, 0x15, 0x41, 0x59, 0x2a, 
	0x6f, 0xab, 0xe1, 0x77, 0x0a, 0xa7, 0xee, 0x8f, 0xaa, 0xdb, 0x67, 0xf8, 0xbd, 0x18, 0xde, 0xfb, 
	0x29, 0x84, 0xf2, 0xc7, 0x7b, 0xc9, 0xda, 0x96, 0xa8, 0x94, 0xc3, 0x9a, 0x79, 0xb6, 0xc0, 0xfc, 
	0xf6, 0xed, 0x3f, 0x1f, 0x26, 0xae, 0xdf, 0xa9, 0x4c, 0x34, 0x76, 0x0c, 0xf8, 0xed, 0xc1, 0xcb, 
	0xea, 0x85, 0xdf, 0x0e, 0x9c, 0x1f, 0x4f, 0x1e, 0x0f, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x53, 0xf2, 
	0xfb, 0x9f, 0x46, 0x4e, 0x55, 0xca, 0x1e, 0x42, 0xa4, 0x6b, 0x3b, 0xb6, 0x8a, 0x55, 0xcf, 0xfa, 
	0x68, 0xf8, 0xf9, 0xd4, 0x46, 0xbe, 0x37, 0xd1, 0xe3, 0x0b, 0x7e, 0x5b, 0xf5, 0x9e, 0x13, 0x6c, 
	0xdc, 0x25, 0xaa, 0x77, 0xa0, 0x3d, 0x38, 0x7a, 0x57, 0x7a, 0x9d, 0x5f, 0x5b, 0xaf, 0x21, 0xd8, 
	0xf7, 0xdb, 0xae, 0xf7, 0x94, 0xe0, 0x3a, 0xbf, 0xfd, 0xb8, 0x8d, 0x5f, 0x4f, 0xaf, 0x2e, 0xf8, 
	0x86, 0x7e, 0xc5, 0x80, 0xc3, 0x42, 0xc7, 0x0d, 0xf8, 0x22, 0x79, 0xaf, 0xd8, 0xde, 0xb6, 0xec, 
	0x94, 0x56, 0x8e, 0x5f, 0x0f, 0x0c, 0x8b, 0x1e, 0xe7, 0x5d, 0xfc, 0xca, 0x28, 0x7b, 0x51, 0x7b, 
	0xaa, 0x77, 0xe4, 0xf9, 0x42, 0x36, 0xa8, 0x65, 0xc6, 0x53, 0xb7, 0xa3, 0x4e, 0xe1, 0x21, 0x7e, 
	0xcf, 0x57, 0xe7, 0xbc, 0x5f, 0xf2, 0x3c, 0x56, 0x3e, 0x67, 0x15, 0x03, 0x8f, 0x45, 0xbf, 0x55, 
	0xdb, 0xd3, 0x3e, 0xab, 0x6a, 0x65, 0xbc, 0x12, 0x74, 0xa8, 0xab, 0x76, 0x0c, 0x53, 0xe3, 0xdd, 
	0xfc, 0xa6, 0xd7, 0x6c, 0x75, 0xa5, 0x5f, 0xe3, 0xa9, 0x5e, 0xe9, 0xfc, 0x5d, 0xe9, 0xa1, 0xc5, 
	0x8b, 0x53, 0xe3, 0x75, 0xbf, 0x07, 0xbe, 0xeb, 0x21, 0xe0, 0x57, 0xe6, 0x3d, 0x70, 0xfe, 0x4a, 
	0x55, 0xe2, 0xd4, 0xad, 0x6a, 0x9f, 0x1f, 0xab, 0x70, 0xfe, 0xfa, 0x74, 0xf2, 0x7b, 0xb0, 0x7d, 
	0xb6, 0xfd, 0xbe, 0xd6, 0xf5, 0xf7, 0xb1, 0xd9, 0xbd, 0x61, 0xe1, 0x09, 0x92, 0x3a, 0xbf, 0xea, 
	0xfd, 0x7f, 0xb6, 0x26, 0x8b, 0x98, 0xe1, 0x97, 0xd6, 0x4d, 0xed, 0x3f, 0xd7, 0x6d, 0x50, 0x29, 
	0xc3, 0xeb, 0x3f, 0x8b, 0xa8, 0x6c, 0x93, 0x83, 0x04, 0x8f, 0xf3, 0xbb, 0xda, 0xfb, 0xdb, 0xfc, 
	0xdc, 0x7a, 0xfa, 0xd7, 0xa3, 0x9f, 0x5b, 0xfd, 0x0a, 0x7d, 0x15, 0x98, 0xdf, 0x87, 0x93, 0x7e, 
	0x7e, 0x8b, 0x3e, 0x2f, 0xf1, 0x6b, 0x5f, 0x30, 0xbb, 0x94, 0xfc, 0x5a, 0x4c, 0xf1, 0xcb, 0x3b, 
	0x98, 0x6c, 0x5b, 0xa2, 0xc5, 0x9a, 0x72, 0xfe, 0xb2, 0x1b, 0xa8, 0x9e, 0x5d, 0x9b, 0x97, 0xf7, 
	0xbb, 0x0c, 0xf1, 0x5b, 0xe8, 0x86, 0xd0, 0xc5, 0x69, 0xed, 0xf3, 0xbb, 0x00, 0xbf, 0x57, 0x30, 
	0xef, 0x44, 0xa7, 0x7e, 0xf7, 0x3f, 0x96, 0x20, 0x39, 0xe3, 0x97, 0xf7, 0x4d, 0xed, 0xcf, 0xe7, 
	0xfd, 0xe6, 0x7b, 0x6c, 0x1f, 0x97, 0x18, 0xd0, 0x93, 0x52, 0x0b, 0x32, 0xfa, 0xf0, 0x76, 0x7e, 
	0xf5, 0x1e, 0xa3, 0x72, 0x53, 0xb5, 0xdf, 0x64, 0x8e, 0x5f, 0xf9, 0xbd, 0xac, 0xcf, 0x3d, 0xfd, 
	0x2a, 0x6b, 0x5f, 0xc5, 0xaf, 0xbe, 0x73, 0x0e, 0x6c, 0xaa, 0xfe, 0x9b, 0x30, 0xbf, 0xf4, 0x88, 
	0xea, 0x78, 0x7f, 0x34, 0xa3, 0x7d, 0x6e, 0xdc, 0x0d, 0x3d, 0xb6, 0xf6, 0x66, 0x7e, 0x49, 0xdb, 
	0x63, 0xf5, 0x9f, 0xb7, 0x86, 0xa6, 0x43, 0xff, 0xd9, 0xdd, 0x0d, 0x62, 0xe8, 0x42, 0x1d, 0x9b, 
	0x60, 0x9d, 0xfa, 0x23, 0x8d, 0x26, 0xbf, 0x19, 0x90, 0xb7, 0x04, 0x5a, 0xa9, 0xf4, 0xb0, 0xa7, 
	0x6b, 0xd8, 0xd5, 0x8a, 0xf5, 0xf0, 0xb3, 0xde, 0xbe, 0xbc, 0xef, 0x30, 0xe1, 0x7e, 0x49, 0x8e, 
	0x7b, 0x8d, 0x4f, 0x16, 0xfd, 0x92, 0x8f, 0x7a, 0xcb, 0xb1, 0x2f, 0xca, 0x5d, 0x96, 0x5f, 0xc6, 
	0x73, 0x35, 0xb2, 0x9c, 0xac, 0x34, 0x7a, 0x78, 0xad, 0x54, 0x17, 0x5d, 0x93, 0x5e, 0xb7, 0xbf, 
	0x72, 0x6d, 0x4b, 0x67, 0x72, 0x3c, 0xbf, 0xfc, 0x80, 0x67, 0x89, 0x95, 0x7e, 0x8f, 0x6c, 0xad, 
	0xec, 0x57, 0x66, 0x90, 0x27, 0xff, 0xbe, 0x4e, 0x2c, 0x56, 0xfa, 0x2d, 0x20, 0xfc, 0xae, 0xf7, 
	0xf7, 0xab, 0xac, 0xad, 0xf3, 0xbb, 0x6c, 0x2d, 0xac, 0x2c, 0xa3, 0x70, 0xfe, 0xf2, 0xd6, 0xdf, 
	0x28, 0x2d, 0x3f, 0xe8, 0x58, 0x51, 0xa7, 0xfc, 0x9e, 0x68, 0x9f, 0xdf, 0xd9, 0xaf, 0x5b, 0x92, 
	0xb9, 0x35, 0xda, 0x70, 0xc8, 0x57, 0x51, 0x9a, 0x9a, 0x94, 0x2e, 0x21, 0xa4, 0x92, 0x95, 0x7e, 
	0x2b, 0xaa, 0x1b, 0xe4, 0xf9, 0x60, 0x27, 0xbf, 0x63, 0xdb, 0xe7, 0xde, 0x7e, 0x6b, 0x1a, 0xe9, 
	0x38, 0x7e, 0xb3, 0x46, 0x74, 0x35, 0xfc, 0xae, 0xa5, 0xfe, 0xf3, 0xb1, 0xad, 0xb1, 0x12, 0xe8, 
	0x2b, 0x2b, 0x8d, 0x84, 0x8b, 0x52, 0x78, 0x55, 0x15, 0xbf, 0x7d, 0xfa, 0xcf, 0xd5, 0x09, 0x15, 
	0x7e, 0x1b, 0xf1, 0x6b, 0xdc, 0x07, 0xb5, 0x85, 0x9d, 0xbc, 0xe1, 0xaa, 0xf5, 0x8d, 0x7c, 0xef, 
	0xa2, 0xe5, 0xb8, 0xbd, 0x5f, 0xbd, 0xc5, 0xbb, 0x98, 0x51, 0x95, 0x78, 0x43, 0xbf, 0xab, 0xda, 
	0xe2, 0x5d, 0xca, 0xb8, 0x4a, 0xf4, 0xf6, 0x7b, 0xd1, 0xfc, 0x14, 0x60, 0x71, 0x54, 0xef, 0x6b, 
	0xce, 0x2f, 0x03, 0x26, 0x07, 0xf5, 0x62, 0x7e, 0x68, 0x70, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 
	0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 
	0x6c, 0xe0, 0x37, 0x36, 0x25, 0xbf, 0xff, 0x6e, 0xe4, 0xaa, 0xef, 0x15, 0x95, 0x1f, 0x4c, 0xf4, 
	0xf8, 0x82, 0xdf, 0x56, 0xbd, 0x10, 0xdc, 0x17, 0x5b, 0xaf, 0x21, 0xd8, 0xf7, 0xdb, 0xae, 0x17, 
	0x82, 0x7b, 0xe2, 0xe9, 0xd5, 0x05, 0xc3, 0xef, 0x9d, 0x80, 0xdf, 0xd8, 0x0c, 0xf1, 0x7b, 0xbe, 
	0x3a, 0xf0, 0xdb, 0x19, 0x53, 0x23, 0xfc, 0x86, 0x00, 0x7e, 0x63, 0x43, 0x35, 0xb2, 0xdf, 0xe3, 
	0x36, 0xfb, 0xd5, 0x7e, 0x8f, 0x5c, 0x04, 0x7e, 0x3b, 0x93, 0x34, 0xa6, 0x9f, 0x6b, 0x8b, 0x04, 
	0x41, 0xa5, 0xdf, 0xec, 0xd7, 0xdc, 0x55, 0xc0, 0x6f, 0x67, 0x76, 0x8d, 0xf4, 0x27, 0xa3, 0x2c, 
	0x41, 0x02, 0xbf, 0x77, 0x62, 0xb0, 0xdf, 0xbd, 0x48, 0x39, 0x0b, 0x44, 0x5f, 0x82, 0xdf, 0xde, 
	0x6c, 0x1a, 0xc9, 0xa5, 0xf2, 0xb1, 0xd8, 0xe5, 0xfa, 0xbb, 0x97, 0x58, 0xf7, 0x02, 0xbf, 0xdd, 
	0x19, 0xe7, 0x97, 0x14, 0x2a, 0xa6, 0x81, 0x38, 0x1f, 0xe1, 0xb7, 0x33, 0x43, 0xfd, 0xaa, 0x13, 
	0x1b, 0xb3, 0x69, 0x7a, 0x74, 0xe6, 0x1f, 0xfc, 0x76, 0x66, 0x98, 0x5f, 0x75, 0x36, 0xac, 0x3a, 
	0x6f, 0x95, 0x5e, 0xa9, 0xe1, 0xb7, 0x33, 0xd7, 0xfa, 0xc5, 0xf5, 0x77, 0x34, 0x63, 0xfb, 0x57, 
	0xde, 0x84, 0x6a, 0xf4, 0x9f, 0x67, 0x30, 0xec, 0xfe, 0x88, 0x52, 0x7f, 0x17, 0x0c, 0xbf, 0x9d, 
	0x81, 0xdf, 0xd8, 0x0c, 0x1b, 0x9f, 0xa4, 0xc0, 0xef, 0x65, 0x8c, 0x7b, 0xbe, 0x70, 0x0a, 0xf8, 
	0xed, 0x0c, 0x9e, 0x0f, 0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x19, 0xe2, 0xb7, 0x91, 0x31, 
	0xdf, 0xf4, 0x3d, 0xf9, 0xc1, 0x45, 0xcb, 0x01, 0xbf, 0x77, 0x02, 0x7e, 0x63, 0xd3, 0xdb, 0x2f, 
	0xe6, 0xa7, 0xbc, 0x18, 0x47, 0xf5, 0x62, 0x7e, 0xd9, 0xcd, 0x38, 0xa8, 0x17, 0xf3, 0x43, 0x83, 
	0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xf8, 
	0x8d, 0x0d, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x29, 0xf9, 0xfd, 0x97, 0x09, 0x2f, 
	0xe7, 0x0f, 0x13, 0x1e, 0xf7, 0xbb, 0x09, 0x8f, 0xfb, 0xcd, 0x84, 0xc7, 0xfd, 0x6a, 0xc2, 0xe3, 
	0x7e, 0x31, 0xe1, 0x71, 0x3f, 0x9b, 0xf0, 0xb8, 0x9f, 0x4c, 0x78, 0xdc, 0x8f, 0x26, 0x3c, 0xee, 
	0x9f, 0x26, 0x3c, 0xee, 0x1f, 0x26, 0xab, 0x4a, 0xc1, 0xaf, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 0x72, 
	0xc1, 0xb6, 0x5e, 0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 0x7a, 0xb9, 0x60, 0x5b, 0x2f, 0x17, 0x6c, 
	0xeb, 0xe5, 0x82, 0x6d, 0xbd, 0x5c, 0xb0, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 0x72, 0xc1, 0xb6, 0x5e, 
	0x43, 0xb0, 0xef, 0xd7, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 0x60, 0x4f, 0x2f, 0x15, 0xec, 0xe9, 
	0xa5, 0x82, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 0xf6, 0xf4, 0x52, 0xc1, 0x9e, 0x5e, 0x2a, 
	0xd8, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 0x60, 0x4f, 0xaf, 0x2e, 0x18, 0x7e, 0xe1, 0x17, 0x7e, 
	0x43, 0xfb, 0xd5, 0xb2, 0x69, 0x7e, 0xb5, 0x38, 0xcd, 0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 0x34, 
	0xbf, 0x5a, 0x9c, 0xe6, 0x57, 0x8b, 0xd3, 0xfc, 0x6a, 0x71, 0x9a, 0x5f, 0x2d, 0x4e, 0xf3, 0xab, 
	0xc5, 0x69, 0x7e, 0xb5, 0x38, 0xcd, 0xaf, 0x16, 0x07, 0xbf, 0xf0, 0xeb, 0xf9, 0x5d, 0x08, 0x2c, 
	0xe1, 0xc1, 0xa6, 0x91, 0xfe, 0x23, 0x0e, 0x0b, 0x4d, 0x78, 0xf2, 0xd4, 0x48, 0xff, 0xa5, 0xa5, 
	0x47, 0x89, 0xaa, 0x5f, 0xfe, 0x3f, 0xb5, 0x7e, 0x7a, 0xb7, 0xfc, 0xca, 0x50, 0xcb, 0xaf, 0x9c, 
	0x97, 0x65, 0xf8, 0x5d, 0xe4, 0xf7, 0x75, 0xfc, 0xb2, 0x79, 0x22, 0x96, 0x5f, 0x5a, 0x16, 0x4b, 
	0x78, 0x40, 0x35, 0xb2, 0x40, 0xd3, 0xaf, 0x28, 0xb0, 0xd7, 0xf9, 0x5b, 0xf0, 0x9b, 0xed, 0x67, 
	0xe3, 0xfc, 0x65, 0xc7, 0xc1, 0xb2, 0xbe, 0x9c, 0x5f, 0x56, 0x56, 0x96, 0x40, 0x35, 0x8a, 0x79, 
	0x5e, 0x8e, 0x5f, 0x56, 0xa4, 0xe9, 0x57, 0x04, 0x7a, 0x7e, 0x69, 0x5c, 0x27, 0xbf, 0xfb, 0x11, 
	0x63, 0xb6, 0xcf, 0xdb, 0x3f, 0xd7, 0xb0, 0xc8, 0x84, 0x4f, 0xec, 0x1a, 0xe9, 0x64, 0x61, 0x96, 
	0xf0, 0xe0, 0x36, 0x7e, 0x65, 0x79, 0x05, 0xbf, 0xfb, 0xbb, 0xe5, 0x57, 0x96, 0x57, 0xf2, 0xbb, 
	0xbd, 0xf7, 0xf1, 0x9b, 0x1a, 0x04, 0xfb, 0xfa, 0xfb, 0x11, 0x92, 0xf6, 0x8c, 0x79, 0xfd, 0xdd, 
	0x8f, 0x83, 0x45, 0x24, 0x7c, 0xe2, 0xa9, 0x31, 0x05, 0x6d, 0x07, 0x8d, 0x79, 0xfd, 0x15, 0xc7, 
	0x15, 0xfc, 0x3e, 0x39, 0xea, 0x57, 0x4f, 0xa0, 0x1a, 0xd9, 0x75, 0xc6, 0xee, 0x5f, 0x3d, 0x8f, 
	0x83, 0x25, 0x4b, 0xf8, 0xe0, 0x4e, 0x7e, 0xd9, 0x6c, 0xd9, 0x46, 0xbf, 0xa4, 0xb4, 0xc7, 0xe2, 
	0x54, 0xbf, 0x4b, 0x95, 0x5f, 0xb6, 0x5f, 0x9c, 0xfe, 0x33, 0xeb, 0x1f, 0xdc, 0xd5, 0x2f, 0x3f, 
	0x9a, 0xef, 0xed, 0x97, 0x7e, 0x93, 0x0e, 0x7e, 0x59, 0x79, 0xc6, 0xfd, 0xd1, 0xd6, 0xd8, 0xef, 
	0x8d, 0xbe, 0x7d, 0x7f, 0xc4, 0xaf, 0x0b, 0xd3, 0xfc, 0xd6, 0xf7, 0x9f, 0x59, 0x91, 0x2f, 0xea, 
	0x57, 0x4f, 0x78, 0x6f, 0xbf, 0x2b, 0x3d, 0x89, 0x4b, 0xf7, 0x47, 0x8b, 0x4c, 0x78, 0x70, 0xda, 
	0xef, 0x96, 0xa1, 0x83, 0x5f, 0xd6, 0x0e, 0xcd, 0x69, 0x9f, 0xef, 0xe2, 0x37, 0x1d, 0xab, 0x33, 
	0xcf, 0x5f, 0xba, 0xff, 0xda, 0xfd, 0x2e, 0x9d, 0xfd, 0x2e, 0x4c, 0x88, 0x35, 0x7e, 0x45, 0xae, 
	0xbd, 0x9f, 0xde, 0x9d, 0xf1, 0x2b, 0x76, 0x25, 0x9c, 0xed, 0xb7, 0x53, 0xff, 0x99, 0xf4, 0x22, 
	0x2a, 0xdb, 0xe7, 0x2c, 0x41, 0x50, 0xeb, 0x97, 0xeb, 0x6d, 0xf7, 0x4b, 0xfa, 0x4c, 0x3c, 0xe1, 
	0x13, 0xb7, 0xf1, 0x2b, 0xcb, 0xeb, 0x73, 0x7f, 0x94, 0x4e, 0xcd, 0x59, 0x7e, 0x85, 0xde, 0x66, 
	0xbf, 0x8b, 0xf8, 0xc2, 0xf0, 0xcb, 0xee, 0x7f, 0xaf, 0xf0, 0xcb, 0xb2, 0x35, 0xfa, 0x25, 0x2a, 
	0x1e, 0x4b, 0xe6, 0xf3, 0x05, 0xb1, 0x63, 0xbc, 0xe7, 0x0b, 0x74, 0xbb, 0xe6, 0xf3, 0x05, 0x71, 
	0x21, 0x9c, 0x3c, 0x3e, 0x59, 0xf4, 0x2b, 0xcb, 0x9b, 0x79, 0xfe, 0xd2, 0x4b, 0x7a, 0x9b, 0x5f, 
	0xd6, 0x1a, 0x7c, 0x5a, 0x9e, 0xe6, 0x57, 0xf4, 0xeb, 0x26, 0xdf, 0x1f, 0x95, 0xfd, 0x8a, 0xae, 
	0xf6, 0xb4, 0xeb, 0xaf, 0x00, 0xcf, 0x07, 0x47, 0x3f, 0x1f, 0x2c, 0xf4, 0xaf, 0x04, 0xf0, 0x7b, 
	0x37, 0xbf, 0x6a, 0x02, 0xfc, 0xea, 0x09, 0xf0, 0x0b, 0xbf, 0x1f, 0xbc, 0xa5, 0x5f, 0x93, 0x14, 
	0xf7, 0x87, 0x4b, 0x8a, 0xfb, 0xdd, 0x25, 0xc5, 0xfd, 0xe6, 0x92, 0xe2, 0x7e, 0x75, 0x49, 0x71, 
	0xbf, 0xb8, 0xa4, 0xb8, 0x9f, 0x5d, 0x52, 0xdc, 0x4f, 0x2e, 0x29, 0xee, 0x47, 0x17, 0xa1, 0xd1, 
	0x44, 0x68, 0x34, 0x81, 0x5f, 0xf8, 0x85, 0xdf, 0x77, 0xf2, 0x8b, 0xf9, 0x29, 0xaa, 0xde, 0x30, 
	0xf3, 0x53, 0x30, 0xbf, 0x4c, 0xd7, 0x1b, 0x66, 0x7e, 0x19, 0xb8, 0x39, 0xf0, 0x1b, 0x1b, 0xf8, 
	0x8d, 0x8d, 0xe6, 0x17, 0x82, 0xc3, 0xa0, 0xea, 0x85, 0xdf, 0x30, 0xe8, 0x7e, 0x21, 0x38, 0x08, 
	0x86, 0x5e, 0xf8, 0x0d, 0x82, 0xe5, 0x17, 0x82, 0x43, 0x60, 0xea, 0x85, 0xe1, 0x00, 0x78, 0x76, 
	0x61, 0xf8, 0xee, 0x94, 0xec, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x5d, 0xf8, 0x3f, 0x67, 0xcc, 0x42, 0xb8 
};

#endif

--- NEW FILE: kbd_s_c.cpp ---
#ifndef __keyboard_symbols_compressed__
#define __keyboard_symbols_compressed__

unsigned int size_keyboard_symbols_compressed = 3155;
unsigned char keyboard_symbols_compressed[] __attribute__((aligned(16))) = {
	0x78, 0x9c, 0xed, 0x9d, 0xe9, 0xb6, 0xac, 0x36, 0x0e, 0x46, 0xe9, 0xcc, 0xe9, 0x4c, 0xdd, 0x99, 
	0xa7, 0xee, 0xf7, 0x7f, 0x42, 0xf2, 0x37, 0x2b, 0xe7, 0x9e, 0x02, 0x49, 0x96, 0x64, 0x1b, 0x0f, 
	0x80, 0xf8, 0xf6, 0x5a, 0xa9, 0x43, 0x61, 0xd9, 0x18, 0x36, 0x18, 0x63, 0xca, 0x37, 0x7f, 0xfd, 
	0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x8d, 0x58, 0xc1, 0x8d, 
	0x81, 0xdd, 0xe8, 0xc0, 0x6e, 0x74, 0xa0, 0x37, 0x38, 0xf0, 0x1b, 0x1b, 0xe8, 0x0d, 0x0e, 0xfc, 
	0xc6, 0x06, 0x7a, 0x83, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xe4, 0xfc, 0xfe, 0xcb, 0x84, 0x97, 
	0xf3, 0x91, 0x09, 0x8f, 0xfb, 0xd8, 0x84, 0xc7, 0x7d, 0x62, 0xc2, 0xe3, 0x3e, 0x35, 0xe1, 0x71, 
	0x9f, 0x99, 0xf0, 0xb8, 0xcf, 0x4d, 0x78, 0xdc, 0x17, 0x26, 0x3c, 0xee, 0x4b, 0x13, 0x1e, 0xf7, 
	0x6f, 0x13, 0x1e, 0xf7, 0x95, 0xc9, 0xaa, 0x92, 0xf1, 0x6b, 0xeb, 0xe5, 0x82, 0x6d, 0xbd, 0x5c, 
	0xb0, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 0x72, 0xc1, 0xb6, 0x5e, 0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 
	0x7a, 0xb9, 0x60, 0x5b, 0x2f, 0x17, 0x6c, 0xeb, 0xe5, 0x82, 0x6d, 0xbd, 0x5c, 0xb0, 0xad, 0xd7, 
	0x10, 0xec, 0xfb, 0xf5, 0xf4, 0x52, 0xc1, 0x9e, 0x5e, 0x2a, 0xd8, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 
	0xa9, 0x60, 0x4f, 0x2f, 0x15, 0xec, 0xe9, 0xa5, 0x82, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 
	0xf6, 0xf4, 0x52, 0xc1, 0x9e, 0x5e, 0x2a, 0xd8, 0xd3, 0xab, 0x0b, 0x86, 0x5f, 0xf8, 0x85, 0xdf, 
	0xd0, 0x7e, 0xb5, 0x6c, 0x9a, 0x5f, 0x2d, 0x4e, 0xf3, 0xab, 0xc5, 0x69, 0x7e, 0xb5, 0x38, 0xcd, 
	0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 0x34, 0xbf, 0x5a, 0x9c, 0xe6, 0x57, 0x8b, 0xd3, 0xfc, 0x6a, 
	0x71, 0x9a, 0x5f, 0x2d, 0x4e, 0xf3, 0xab, 0xc5, 0xc1, 0x2f, 0xfc, 0xc2, 0xef, 0xc3, 0xfd, 0x2e, 
	0xcb, 0xa2, 0x27, 0x30, 0x8d, 0xcb, 0x1b, 0x4a, 0xc2, 0xca, 0x35, 0xb2, 0xb8, 0x8c, 0xdf, 0x2d, 
	0xd0, 0xf4, 0xbb, 0x6c, 0x88, 0x84, 0x37, 0xa8, 0x46, 0xb6, 0x5d, 0xd3, 0xaf, 0x28, 0xcf, 0xf1, 
	0xcb, 0xca, 0x73, 0xfc, 0xb2, 0x38, 0xc7, 0x2f, 0x8b, 0x9b, 0xe9, 0x97, 0x6c, 0xd6, 0xf1, 0xfb, 
	0x16, 0xb4, 0x45, 0xda, 0x7e, 0x79, 0x5c, 0x0f, 0xbf, 0x74, 0xb7, 0x6c, 0xbf, 0x7c, 0xbb, 0xb9, 
	0xeb, 0x37, 0xef, 0x97, 0x97, 0x67, 0xfb, 0xe5, 0x71, 0xb6, 0x5f, 0x1e, 0x37, 0xcf, 0x2f, 0x3b, 
	0xad, 0x6c, 0xbf, 0xef, 0x31, 0xaf, 0x50, 0xd3, 0xaf, 0x88, 0xf3, 0xfd, 0x2e, 0xfd, 0xfc, 0x8a, 
	0xed, 0x66, 0xfc, 0x6e, 0xa5, 0x9a, 0x7e, 0x45, 0x79, 0xa6, 0x5f, 0x11, 0x67, 0xfa, 0x15, 0x71, 
	0x97, 0x6b, 0x9f, 0x47, 0xf8, 0x5d, 0xe0, 0xf7, 0x9d, 0xfb, 0xf8, 0x15, 0x45, 0x7a, 0x7e, 0x97, 
	0x42, 0xbf, 0xb4, 0x81, 0xc9, 0xf9, 0x4d, 0x13, 0xde, 0x10, 0x1a, 0xf7, 0x60, 0xf8, 0x65, 0xfd, 
	0xe7, 0x82, 0xfb, 0x2f, 0x8f, 0xf3, 0xfd, 0x16, 0xf6, 0xaf, 0x48, 0x79, 0x9e, 0xdf, 0xa2, 0xfe, 
	0x95, 0xd8, 0xe1, 0xe6, 0xfb, 0xef, 0x03, 0xfd, 0xd2, 0xe3, 0xec, 0xf8, 0x5d, 0x4a, 0xfd, 0xd2, 
	0x0d, 0xbb, 0x7e, 0x4b, 0xfb, 0x57, 0x64, 0x7f, 0x9b, 0xfb, 0xcf, 0xa1, 0xfc, 0xee, 0x81, 0xed, 
	0xd7, 0x2f, 0xf7, 0x91, 0x7b, 0xfe, 0x2d, 0xf1, 0x4b, 0xe3, 0xda, 0xfd, 0xd6, 0xf6, 0x9f, 0x7b, 
	0xf9, 0xe5, 0x0d, 0xd1, 0x54, 0xbf, 0x24, 0xae, 0xf9, 0xfe, 0xfb, 0x21, 0xe0, 0xba, 0x7e, 0x4b, 
	0xef, 0xbf, 0x42, 0xc8, 0x9d, 0xfd, 0xd2, 0x2e, 0x4c, 0xab, 0x5f, 0xb1, 0xbb, 0x53, 0xfd, 0xd2, 
	0xfd, 0xe8, 0xe0, 0x97, 0x95, 0x79, 0xe3, 0xf6, 0x99, 0xf5, 0x50, 0x5b, 0x9f, 0x8f, 0x16, 0x02, 
	0x4b, 0xf8, 0xc0, 0xa1, 0xfb, 0x2f, 0x8d, 0x9b, 0xe6, 0x37, 0xcc, 0xfd, 0x97, 0xe9, 0xed, 0x34, 
	0xbe, 0xd1, 0xb7, 0x7f, 0x45, 0xe3, 0xe0, 0xf7, 0xd8, 0xf3, 0x6f, 0x9a, 0xf0, 0xc6, 0xb8, 0xf1, 
	0x49, 0x51, 0x5e, 0x8f, 0xf1, 0xc9, 0x22, 0xbf, 0xd5, 0xfd, 0xab, 0x24, 0xe1, 0x1f, 0x2e, 0x30, 
	0x3e, 0xb9, 0x16, 0xfb, 0xa5, 0x37, 0xfe, 0x69, 0xef, 0x17, 0x44, 0x79, 0xcd, 0xef, 0x17, 0xd6, 
	0x52, 0xbf, 0x85, 0xcf, 0x47, 0x22, 0xee, 0x8a, 0xef, 0x17, 0x28, 0x78, 0x3f, 0x18, 0xf0, 0xfd, 
	0xe0, 0x6a, 0x26, 0xc0, 0xaf, 0x9e, 0x00, 0xbf, 0x7a, 0x02, 0xfc, 0xea, 0x09, 0x43, 0xfc, 0x9a, 
	0xec, 0x71, 0x1f, 0xb9, 0xec, 0x71, 0x1f, 0xbb, 0xec, 0x71, 0x9f, 0xb8, 0xec, 0x71, 0x9f, 0xba, 
	0xec, 0x71, 0x9f, 0xb9, 0xec, 0x71, 0x9f, 0xbb, 0xec, 0x71, 0x5f, 0xb8, 0xec, 0x71, 0x5f, 0xba, 
	0x08, 0x8d, 0x26, 0x42, 0xa3, 0x09, 0xfc, 0xc2, 0x2f, 0xfc, 0x3e, 0xc9, 0x2f, 0xe6, 0xa7, 0xa8, 
	0x7a, 0xc3, 0xcc, 0x4f, 0xc1, 0xfc, 0x32, 0x5d, 0x6f, 0x98, 0xf9, 0x65, 0xe0, 0xe6, 0xc0, 0x6f, 
	0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x03, 
	0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0x72, 0x7e, 0xff, 0xdf, 0xc8, 0x59, 0xfb, 0x15, 
	0x95, 0xaf, 0x4d, 0xf4, 0xf8, 0x8c, 0xdf, 0x56, 0xbd, 0x10, 0xdc, 0x17, 0x5b, 0xaf, 0x21, 0xd8, 
	0xf7, 0xdb, 0xae, 0x17, 0x82, 0x7b, 0xe2, 0xe9, 0xd5, 0x05, 0xc3, 0xef, 0x9d, 0x80, 0xdf, 0xd8, 
	0x0c, 0xf1, 0x7b, 0xbc, 0x3a, 0xf0, 0xdb, 0x19, 0x53, 0x23, 0xfc, 0x86, 0x00, 0x7e, 0x63, 0x03, 
	0xbf, 0xb1, 0x19, 0xea, 0x97, 0xcf, 0x28, 0xde, 0xd7, 0xda, 0xd5, 0x81, 0xdf, 0xce, 0x0c, 0xf6, 
	0xab, 0x15, 0x00, 0xbf, 0x13, 0x81, 0xdf, 0xd8, 0xcc, 0xf2, 0xbb, 0x37, 0xd4, 0xf4, 0xef, 0x42, 
	0xfe, 0xa6, 0xd9, 0x41, 0x3b, 0x9b, 0x46, 0xfa, 0xef, 0x1a, 0x2c, 0x6b, 0xd7, 0xfb, 0xef, 0x87, 
	0xc5, 0xd7, 0xc7, 0x2a, 0x56, 0xb0, 0xfb, 0x33, 0xfc, 0x76, 0x66, 0xb0, 0xdf, 0x95, 0x2d, 0x1a, 
	0x7e, 0x57, 0x23, 0x3b, 0x68, 0x67, 0x5e, 0xfb, 0xbc, 0x4a, 0xbf, 0xef, 0x67, 0x12, 0xfc, 0x8e, 
	0xe4, 0x44, 0xbf, 0x69, 0x10, 0xfc, 0x76, 0x07, 0xed, 0x73, 0x6c, 0x66, 0xf4, 0xaf, 0x36, 0xb5, 
	0xef, 0x2a, 0x79, 0xbf, 0x19, 0x7e, 0x47, 0x82, 0xf1, 0xc9, 0xd8, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 
	0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0x66, 0x88, 0xdf, 0x46, 0xc6, 0xec, 0xe9, 
	0x33, 0xf9, 0xda, 0x45, 0xcb, 0x01, 0xbf, 0x77, 0x02, 0x7e, 0x63, 0xd3, 0xdb, 0x2f, 0xe6, 0xa7, 
	0x5c, 0x8c, 0x5a, 0xbd, 0x98, 0x5f, 0x76, 0x33, 0x2a, 0xf5, 0x62, 0x7e, 0x68, 0x70, 0xe0, 0x37, 
	0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0xe6, 0x02, 0x7e, 0xbd, 0x5f, 0x50, 0xcb, 
	0xff, 0xdf, 0x8e, 0x17, 0x93, 0x46, 0x16, 0xe4, 0xdd, 0x4a, 0x50, 0x26, 0x66, 0x58, 0xb9, 0x79, 
	0x82, 0x96, 0x37, 0x93, 0x25, 0xbb, 0x85, 0x7e, 0x5c, 0xdd, 0x6f, 0x89, 0xa3, 0x66, 0xbf, 0x7a, 
	0xfe, 0x32, 0xbf, 0xd6, 0xb6, 0x4b, 0xca, 0x7a, 0x84, 0xdf, 0xcc, 0xd9, 0x5f, 0xe6, 0x37, 0xf9, 
	0x69, 0x50, 0x69, 0x5e, 0x12, 0x07, 0xbf, 0x43, 0xd8, 0xfd, 0x92, 0x96, 0x8e, 0x2e, 0x89, 0x15, 
	0x69, 0x83, 0xb8, 0x2c, 0xf4, 0xa7, 0x7d, 0xec, 0xb7, 0x7f, 0x05, 0x4d, 0xe7, 0x9a, 0x08, 0xe3, 
	0xed, 0x01, 0x9b, 0xaa, 0xf1, 0xfa, 0xa9, 0x99, 0x9a, 0x57, 0xf9, 0xc1, 0xb0, 0x56, 0xe7, 0x64, 
	0xdf, 0x46, 0x72, 0xba, 0x5f, 0xd5, 0x8c, 0xfd, 0xfb, 0x4c, 0xfe, 0xdb, 0xbe, 0xad, 0x08, 0xcb, 
	0xaf, 0x0c, 0x95, 0xc7, 0x9d, 0xac, 0x25, 0xf5, 0x51, 0xcb, 0x48, 0x7e, 0x58, 0x98, 0xe4, 0x95, 
	0x15, 0xce, 0x56, 0xea, 0x02, 0x7e, 0xff, 0xd7, 0x48, 0xb6, 0x02, 0xfa, 0x41, 0xd8, 0xbe, 0x16, 
	0xfa, 0x7d, 0x39, 0xce, 0x85, 0x7a, 0xf5, 0x50, 0x4f, 0x32, 0xe1, 0x97, 0x54, 0xcc, 0xc8, 0x2b, 
	0x16, 0x7b, 0xfb, 0xfd, 0xc6, 0x44, 0x8f, 0xcf, 0xf8, 0x6d, 0xd5, 0x9b, 0x17, 0xbc, 0x88, 0xe6, 
	0x4a, 0xb6, 0xac, 0x85, 0x7e, 0x57, 0xbd, 0x14, 0x19, 0x6a, 0x5c, 0xbf, 0x7b, 0xc6, 0x75, 0x4f, 
	0x16, 0xdf, 0x1d, 0xbf, 0xf2, 0xa2, 0x25, 0x8b, 0x9d, 0xfd, 0xda, 0x7a, 0x0d, 0xc1, 0xbe, 0xdf, 
	0x76, 0xbd, 0x39, 0xc1, 0xba, 0xc4, 0xea, 0xf6, 0xb9, 0xd8, 0x6f, 0x59, 0x25, 0x92, 0xb5, 0x4a, 
	0x82, 0x16, 0xc5, 0xdb, 0xea, 0xfe, 0x7e, 0x3d, 0xbd, 0xba, 0xe0, 0x30, 0x7e, 0x95, 0x06, 0xf6, 
	0xb8, 0x5f, 0xb3, 0x7d, 0xb6, 0x37, 0xfe, 0xfe, 0x05, 0x7e, 0x39, 0xa6, 0x44, 0xab, 0x17, 0xcb, 
	0x5a, 0x74, 0x5e, 0x46, 0x92, 0x5e, 0xda, 0x7f, 0x66, 0x81, 0xd9, 0xfe, 0x33, 0xd9, 0x54, 0xb2, 
	0x11, 0xb6, 0xc0, 0xfc, 0x76, 0xe9, 0x3f, 0x0f, 0xf1, 0x5b, 0x59, 0x07, 0x42, 0x63, 0x76, 0x87, 
	0xfa, 0x3b, 0xd7, 0x1c, 0x06, 0xd7, 0xcb, 0xd4, 0x18, 0xc8, 0x6f, 0x69, 0xa3, 0x7b, 0x06, 0xa3, 
	0xab, 0xf5, 0x04, 0xbf, 0x6b, 0x69, 0xa3, 0x3b, 0x9d, 0xf1, 0xd5, 0xa2, 0x1a, 0xd9, 0x61, 0x88, 
	0xe4, 0xf7, 0xc1, 0x08, 0xbf, 0x7a, 0x02, 0xa3, 0xca, 0xaf, 0xf9, 0xe8, 0xf8, 0x9e, 0x2a, 0xd7, 
	0xc0, 0x6f, 0x67, 0x86, 0xfb, 0xdd, 0x3f, 0x53, 0x06, 0xfa, 0xcd, 0x77, 0x84, 0xed, 0x53, 0xaf, 
	0xe8, 0xf9, 0x68, 0x11, 0x0b, 0x9d, 0x6a, 0xd5, 0x9b, 0xb8, 0x7e, 0x9d, 0xed, 0x66, 0xaa, 0x36, 
	0xcc, 0xef, 0xc1, 0x67, 0xd8, 0x16, 0x26, 0xfa, 0x65, 0x4f, 0x83, 0x7c, 0x10, 0xc0, 0xca, 0x7e, 
	0x9c, 0xfc, 0xa1, 0x6c, 0xf5, 0xbb, 0xd0, 0xbf, 0xbd, 0x2a, 0xd5, 0x9d, 0x79, 0xf7, 0x5f, 0x65, 
	0xac, 0x69, 0x59, 0xe4, 0xce, 0x9e, 0xe3, 0xd7, 0x1b, 0x0a, 0xb1, 0x32, 0x0b, 0xbf, 0x7c, 0x08, 
	0x22, 0x1d, 0x62, 0x21, 0x9b, 0x24, 0xcb, 0x6c, 0xeb, 0xe9, 0xf9, 0xdf, 0xa1, 0xe3, 0x3f, 0xb9, 
	0x7d, 0xe6, 0xcd, 0x66, 0x5a, 0xfb, 0x53, 0xfc, 0xea, 0x43, 0x81, 0x7b, 0x9c, 0x72, 0xa7, 0x5e, 
	0xb6, 0x17, 0x8c, 0xea, 0x10, 0xa2, 0x51, 0x98, 0xe9, 0x57, 0xae, 0x10, 0x49, 0x0d, 0xcc, 0x6e, 
	0x9f, 0xa5, 0x5f, 0x51, 0xf8, 0x40, 0xbf, 0x52, 0x92, 0xb0, 0x66, 0xfa, 0xb5, 0x8a, 0xb7, 0xfc, 
	0xd2, 0x6b, 0x3a, 0xa9, 0x82, 0x58, 0xe6, 0xd9, 0xcc, 0xa4, 0x06, 0xe6, 0xf9, 0x55, 0x6a, 0x7d, 
	0x81, 0xeb, 0x77, 0xab, 0x47, 0xf5, 0xf5, 0xfb, 0x5e, 0x7b, 0xd7, 0x6f, 0x72, 0x4a, 0x89, 0x65, 
	0xb6, 0x39, 0xeb, 0x4e, 0xd6, 0xc4, 0x69, 0x7e, 0x2f, 0x72, 0xff, 0xe5, 0xd5, 0xab, 0xb9, 0x7e, 
	0x4d, 0xbf, 0xc9, 0x5f, 0xb5, 0x52, 0xba, 0x44, 0xeb, 0x4a, 0x38, 0xcc, 0xc4, 0xf1, 0x0d, 0x7a, 
	0x95, 0xcc, 0xe9, 0x3f, 0xbb, 0x87, 0xa7, 0xd9, 0xaf, 0x99, 0x8f, 0xfd, 0x4d, 0xaf, 0x5f, 0xc3, 
	0xaf, 0x75, 0x11, 0xb4, 0x31, 0xd8, 0x6f, 0x2d, 0x53, 0xc7, 0x37, 0xb4, 0xe0, 0xe2, 0xfe, 0xf3, 
	0x2a, 0xed, 0xec, 0xd9, 0xd8, 0xfd, 0x47, 0x69, 0xeb, 0xc5, 0x72, 0xd2, 0x3e, 0x8b, 0x96, 0xba, 
	0x89, 0xa8, 0x7e, 0xc1, 0x07, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xbc, 0x1f, 0x8c, 0xcd, 0x23, 
	0xde, 0xef, 0x3f, 0x98, 0x21, 0x7e, 0x1b, 0x19, 0xb3, 0xa7, 0x79, 0xcc, 0xe7, 0x56, 0x2d, 0x54, 
	0xeb, 0x68, 0x67, 0x32, 0x16, 0xf5, 0xcd, 0xd5, 0x80, 0xe3, 0xe3, 0x94, 0xdf, 0xb8, 0x68, 0x39, 
	0xe2, 0xfa, 0x2d, 0x18, 0x14, 0xe1, 0x91, 0x65, 0x6b, 0xeb, 0x4a, 0x3f, 0x52, 0xb2, 0x03, 0xfc, 
	0x52, 0xd2, 0x01, 0x17, 0x27, 0xb0, 0x74, 0x2d, 0x4f, 0xbd, 0xb9, 0xdf, 0x09, 0xf3, 0x53, 0x46, 
	0x52, 0xfa, 0x3e, 0xce, 0x18, 0xbc, 0x96, 0xc3, 0x73, 0xd6, 0xe8, 0x33, 0x1f, 0xc8, 0x62, 0x6d, 
	0x7d, 0xb2, 0x2c, 0xf3, 0x56, 0x52, 0xab, 0xf7, 0xfc, 0xf9, 0x65, 0x43, 0x49, 0x0f, 0xa4, 0xf1, 
	0x7e, 0x41, 0x7b, 0x25, 0x21, 0x56, 0xc8, 0x73, 0x85, 0x8a, 0xe3, 0x9f, 0xa4, 0xdd, 0xd0, 0x07, 
	0x3d, 0x1b, 0x06, 0xb2, 0x2a, 0xf5, 0x9e, 0x3f, 0x3f, 0x74, 0x28, 0x85, 0x07, 0x52, 0x5e, 0x8b, 
	0x86, 0x5f, 0x25, 0xdf, 0x6e, 0x51, 0x2c, 0x8e, 0xf2, 0x5b, 0x4b, 0x68, 0xbf, 0x4a, 0xfb, 0x6c, 
	0x5c, 0xbf, 0x7c, 0x51, 0x69, 0x70, 0xcd, 0xae, 0xf0, 0xeb, 0x13, 0x7e, 0xa7, 0x73, 0xa4, 0x7f, 
	0xa5, 0x5f, 0xbf, 0x22, 0x28, 0x49, 0xe5, 0x6d, 0x35, 0xfc, 0x4e, 0xe1, 0xd0, 0xf3, 0x51, 0x71, 
	0xfb, 0x0c, 0xbf, 0x27, 0xc3, 0x7b, 0x3f, 0x99, 0x50, 0xfe, 0x7a, 0x6f, 0xb7, 0xf6, 0x4a, 0x54, 
	0xca, 0x61, 0xcd, 0x3c, 0x5b, 0x60, 0x7e, 0xfb, 0xf6, 0x9f, 0xab, 0x89, 0xeb, 0x77, 0x2a, 0x13, 
	0x8d, 0xd5, 0x01, 0xbf, 0x3d, 0xb8, 0xac, 0x5e, 0xf8, 0xed, 0xc0, 0xf1, 0xf1, 0xe4, 0xf1, 0xc0, 
	0x6f, 0x6c, 0xe0, 0x37, 0x36, 0x39, 0xbf, 0x7f, 0x36, 0x72, 0xa8, 0x52, 0xf6, 0x10, 0x22, 0x5d, 
	0xdb, 0xb1, 0x55, 0x2c, 0x7a, 0xd7, 0x47, 0xc3, 0x8f, 0xa7, 0x36, 0xf2, 0xad, 0x89, 0x1e, 0x9f, 
	0xf1, 0xdb, 0xaa, 0xf7, 0x98, 0x60, 0xe3, 0x29, 0x51, 0x7d, 0x02, 0xed, 0x41, 0xed, 0x53, 0xe9, 
	0x79, 0x7e, 0x6d, 0xbd, 0x86, 0x60, 0xdf, 0x6f, 0xbb, 0xde, 0x43, 0x82, 0xcb, 0xfc, 0xf6, 0xe3, 
	0x36, 0x7e, 0x3d, 0xbd, 0xba, 0xe0, 0x1b, 0xfa, 0x15, 0x03, 0x0e, 0x0b, 0x1d, 0x37, 0xe0, 0x8b, 
	0xe4, 0x6f, 0xc1, 0xf6, 0x5e, 0xcb, 0x4e, 0x69, 0xf9, 0xf8, 0xb5, 0x62, 0x58, 0xb4, 0x9e, 0xa7, 
	0xf8, 0x95, 0x51, 0xf6, 0xa2, 0xf6, 0x56, 0xaf, 0xe6, 0xfd, 0x42, 0x32, 0xa8, 0x65, 0xc6, 0x53, 
	0xb7, 0xa3, 0x2e, 0xe1, 0x21, 0x7e, 0x8f, 0x57, 0xe7, 0xb8, 0x5f, 0xf2, 0x3e, 0x56, 0xbe, 0x67, 
	0x15, 0x03, 0x8f, 0x59, 0xbf, 0x45, 0xdb, 0xd3, 0xbe, 0xab, 0x6a, 0x65, 0xbc, 0x12, 0x54, 0xd5, 
	0x55, 0xab, 0xc3, 0xd4, 0x78, 0x37, 0xbf, 0xfb, 0x67, 0xb2, 0xba, 0xd0, 0xaf, 0xf1, 0x56, 0x2f, 
	0x77, 0xfd, 0xae, 0xf4, 0xd4, 0xe2, 0xc5, 0xa9, 0xf1, 0xba, 0xdf, 0x8a, 0x7d, 0xad, 0x82, 0x6a, 
	0x64, 0x75, 0x7a, 0x9e, 0x5f, 0x9e, 0xa7, 0x78, 0x7b, 0x7a, 0x71, 0xa2, 0xa4, 0x8b, 0x5c, 0xbf, 
	0x4f, 0xf7, 0x5b, 0xd9, 0x3e, 0xdb, 0x7e, 0xaf, 0x75, 0xff, 0x25, 0xdb, 0xee, 0xe5, 0x57, 0x7d, 
	0xfe, 0x4f, 0xd6, 0x24, 0x11, 0x33, 0xfc, 0xd2, 0xba, 0xa9, 0xfd, 0xe7, 0xb2, 0x0d, 0x2a, 0x65, 
	0x78, 0xfd, 0x67, 0x11, 0x95, 0x6c, 0x72, 0x90, 0xe0, 0x71, 0x7e, 0x57, 0xfb, 0x78, 0x9b, 0xdf, 
	0x5b, 0x2f, 0xff, 0x72, 0xf4, 0x6b, 0xab, 0x5f, 0xa1, 0x57, 0x61, 0xa8, 0xdf, 0xac, 0xcf, 0x53, 
	0xfc, 0xda, 0x37, 0xcc, 0x2e, 0x25, 0x5f, 0x8b, 0x29, 0x7e, 0x79, 0x07, 0x93, 0xb6, 0x4b, 0xb2, 
	0xc5, 0x9a, 0x72, 0xfd, 0xb2, 0x07, 0xa8, 0x9e, 0x5d, 0x9b, 0x87, 0xfa, 0xcd, 0x74, 0x43, 0xe8, 
	0xe2, 0xb4, 0xf6, 0xf9, 0x29, 0xc0, 0xef, 0x19, 0xcc, 0xbb, 0xd0, 0xe7, 0xf8, 0xe5, 0x7d, 0x53, 
	0xfb, 0xfb, 0x71, 0xbf, 0xe9, 0x11, 0xdb, 0xc6, 0x25, 0x06, 0xf4, 0xa4, 0xd4, 0x82, 0x8c, 0x3e, 
	0xbc, 0x9d, 0x5f, 0x7d, 0xc6, 0x28, 0xdc, 0x54, 0xe9, 0x9e, 0x4c, 0xbb, 0x7e, 0xd7, 0x92, 0xef, 
	0x3d, 0xfd, 0x2a, 0x6b, 0xaf, 0xe2, 0x57, 0x3f, 0x38, 0x15, 0x9b, 0x2a, 0xdf, 0x93, 0x19, 0xcf, 
	0x47, 0x33, 0xda, 0xe7, 0xc6, 0xc3, 0xd0, 0x63, 0x6b, 0x0f, 0xf3, 0x4b, 0xda, 0x1e, 0xab, 0xff, 
	0xfc, 0xda, 0x60, 0x87, 0xfe, 0xb3, 0x7b, 0x18, 0xc4, 0xd0, 0x45, 0x6e, 0x7c, 0xa3, 0xae, 0xd1, 
	0xe4, 0x0f, 0x03, 0xf2, 0x91, 0x40, 0x2b, 0x95, 0x9e, 0xf6, 0x74, 0x0d, 0xbb, 0x5b, 0xb1, 0x1e, 
	0x7e, 0xd2, 0xdb, 0x97, 0xcf, 0x1d, 0x26, 0x41, 0xc6, 0x27, 0xb3, 0x7e, 0xc9, 0x57, 0xbd, 0xe5, 
	0xd8, 0x16, 0xe5, 0x21, 0x4b, 0x6f, 0xe3, 0xa9, 0x1a, 0x59, 0x4e, 0x52, 0x1a, 0x3d, 0xbd, 0x56, 
	0xaa, 0x8b, 0xae, 0xd9, 0x3f, 0x5f, 0xff, 0xe5, 0x6b, 0x9b, 0xbb, 0x92, 0xe3, 0xf9, 0xe5, 0x27, 
	0x3c, 0x4b, 0x2c, 0xf4, 0x5b, 0xb3, 0xb5, 0xbc, 0x5f, 0x99, 0x41, 0x5e, 0xfc, 0xdb, 0x3a, 0xb1, 
	0x58, 0xe8, 0x37, 0x43, 0x3c, 0xbf, 0xca, 0xda, 0x32, 0xbf, 0xcb, 0xab, 0x85, 0x95, 0x65, 0x64, 
	0xae, 0x5f, 0xf9, 0x30, 0xa0, 0x96, 0x96, 0x9e, 0x74, 0xac, 0xa8, 0x43, 0x7e, 0x6b, 0xdb, 0x67, 
	0x16, 0xfe, 0x3c, 0xbf, 0x6e, 0x49, 0xe6, 0xd6, 0x68, 0xc3, 0x21, 0x3f, 0x45, 0x69, 0x6a, 0xd2, 
	0x7e, 0x0b, 0x21, 0x95, 0x2c, 0xf4, 0x5b, 0x50, 0xdd, 0x20, 0xef, 0xf7, 0x3b, 0xf9, 0x1d, 0xdb, 
	0x3e, 0xf7, 0xf6, 0x5b, 0xd2, 0x48, 0xc7, 0xf1, 0x9b, 0x34, 0xa2, 0xab, 0xe1, 0x77, 0xcd, 0xf5, 
	0x9f, 0xeb, 0xb6, 0xc6, 0x4a, 0xa0, 0x9f, 0xac, 0x34, 0x12, 0x2e, 0x4a, 0xe1, 0x55, 0x55, 0xfc, 
	0x76, 0xec, 0x3f, 0x97, 0x24, 0x14, 0xf8, 0x6d, 0xc4, 0xaf, 0x71, 0x1f, 0xd4, 0x16, 0x76, 0xf2, 
	0x86, 0x8b, 0xd6, 0x37, 0xf2, 0xad, 0x8b, 0x96, 0xe3, 0xf6, 0x7e, 0xf5, 0x16, 0xef, 0x64, 0x46, 
	0x55, 0xe2, 0x81, 0x7e, 0x57, 0xb5, 0xc5, 0x3b, 0x95, 0x71, 0x95, 0xe8, 0xed, 0xf7, 0xa4, 0xf9, 
	0x29, 0xc0, 0xa2, 0x56, 0xef, 0x35, 0xe7, 0x97, 0x01, 0x93, 0x4a, 0xbd, 0x98, 0x1f, 0x1a, 0x1c, 
	0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 
	0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x4d, 0xce, 0xef, 0x1f, 0x8d, 0x9c, 0xb5, 
	0x5f, 0x51, 0xf9, 0xce, 0x44, 0x8f, 0xcf, 0xf8, 0x6d, 0xd5, 0x0b, 0xc1, 0x7d, 0xb1, 0xf5, 0x1a, 
	0x82, 0x7d, 0xbf, 0xed, 0x7a, 0x21, 0xb8, 0x27, 0x9e, 0x5e, 0x5d, 0x30, 0xfc, 0xde, 0x09, 0xf8, 
	0x8d, 0xcd, 0x10, 0xbf, 0xc7, 0xab, 0x03, 0xbf, 0x9d, 0x31, 0x35, 0xc2, 0x6f, 0x08, 0x76, 0x8d, 
	0xe2, 0x37, 0x40, 0xf0, 0x1b, 0x82, 0x71, 0x7e, 0xb5, 0xdf, 0x23, 0x67, 0x81, 0xdf, 0xce, 0x10, 
	0x8d, 0xdc, 0x46, 0xab, 0xdf, 0xe4, 0xd7, 0xdc, 0x45, 0xc0, 0x6f, 0x67, 0xe0, 0x37, 0x36, 0x54, 
	0x23, 0x13, 0xdc, 0xc7, 0xef, 0x56, 0xb0, 0x9c, 0x05, 0xa2, 0x2f, 0xc1, 0x6f, 0x6f, 0x86, 0xf9, 
	0x25, 0x33, 0xa6, 0xe4, 0x6c, 0x28, 0xf3, 0x03, 0x7e, 0xbb, 0xc3, 0x34, 0x52, 0xc1, 0x3d, 0xfa, 
	0xcf, 0x6c, 0x36, 0x94, 0x98, 0xd2, 0xa8, 0x7f, 0x85, 0xdf, 0xce, 0x0c, 0xf5, 0xab, 0x4e, 0x6c, 
	0x4c, 0xa6, 0xe9, 0xd1, 0x99, 0x7f, 0xf0, 0xdb, 0x19, 0xae, 0x91, 0x08, 0xee, 0xd9, 0xbf, 0x72, 
	0x1a, 0x64, 0xb6, 0x04, 0xbf, 0xdd, 0x39, 0xd7, 0x2f, 0xee, 0xbf, 0xa3, 0x11, 0x1a, 0x77, 0xc1, 
	0x3d, 0xc7, 0x37, 0xd4, 0x45, 0xf4, 0x9f, 0x67, 0x30, 0xce, 0x2f, 0xa1, 0xfc, 0x29, 0x18, 0x7e, 
	0x3b, 0x23, 0x35, 0x6e, 0x82, 0xe1, 0x37, 0x04, 0xf0, 0x1b, 0x1b, 0xbc, 0x1f, 0x8c, 0x0d, 0xfc, 
	0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x19, 0xe2, 0xb7, 0x91, 0x31, 0x7b, 0xfa, 0x4c, 0xbe, 
	0x73, 0xd1, 0x72, 0xc0, 0xef, 0x9d, 0x80, 0xdf, 0xd8, 0xf4, 0xf6, 0x8b, 0xf9, 0x29, 0x17, 0xa3, 
	0x56, 0x2f, 0xe6, 0x97, 0xdd, 0x8c, 0x4a, 0xbd, 0x98, 0x1f, 0x1a, 0x1c, 0xf8, 0x8d, 0x0d, 0xfc, 
	0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 
	0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x4d, 0xce, 0xef, 0xef, 0x26, 0xbc, 0x9c, 0xdf, 0x4c, 0x78, 0xdc, 
	0xaf, 0x26, 0x3c, 0xee, 0x17, 0x13, 0x1e, 0xf7, 0xb3, 0x09, 0x8f, 0xfb, 0xc9, 0x84, 0xc7, 0xfd, 
	0x68, 0xc2, 0xe3, 0x7e, 0x30, 0xe1, 0x71, 0xdf, 0x9b, 0xf0, 0xb8, 0xff, 0x9a, 0xf0, 0xb8, 0xff, 
	0x98, 0xac, 0x2a, 0x19, 0xbf, 0xb6, 0x5e, 0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 0x7a, 0xb9, 0x60, 
	0x5b, 0x2f, 0x17, 0x6c, 0xeb, 0xe5, 0x82, 0x6d, 0xbd, 0x5c, 0xb0, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 
	0x72, 0xc1, 0xb6, 0x5e, 0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 0x7a, 0x0d, 0xc1, 0xbe, 0x5f, 0x4f, 
	0x2f, 0x15, 0xec, 0xe9, 0xa5, 0x82, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 0xf6, 0xf4, 0x52, 
	0xc1, 0x9e, 0x5e, 0x2a, 0xd8, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 0x60, 0x4f, 0x2f, 0x15, 0xec, 
	0xe9, 0xa5, 0x82, 0x3d, 0xbd, 0xba, 0x60, 0xf8, 0x85, 0x5f, 0xf8, 0x0d, 0xed, 0x57, 0xcb, 0xa6, 
	0xf9, 0xd5, 0xe2, 0x34, 0xbf, 0x5a, 0x9c, 0xe6, 0x57, 0x8b, 0xd3, 0xfc, 0x6a, 0x71, 0x9a, 0x5f, 
	0x2d, 0x4e, 0xf3, 0xab, 0xc5, 0x69, 0x7e, 0xb5, 0x38, 0xcd, 0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 
	0x34, 0xbf, 0x5a, 0x1c, 0xfc, 0xc2, 0x2f, 0xfc, 0xa6, 0x7e, 0x5f, 0x13, 0x7c, 0x66, 0xfa, 0xa5, 
	0xf3, 0xf2, 0xe1, 0xb7, 0xde, 0x2f, 0x9d, 0x3f, 0x75, 0x6b, 0xbf, 0x24, 0x10, 0x7e, 0x37, 0x8d, 
	0x6c, 0x7a, 0x5c, 0xc6, 0xef, 0x76, 0x04, 0xa7, 0xb6, 0xcf, 0xf0, 0xfb, 0xe2, 0x98, 0xdf, 0xf2, 
	0xeb, 0xf7, 0x14, 0xbf, 0xb4, 0x7e, 0x68, 0x9f, 0x47, 0xfa, 0xdd, 0x43, 0xd1, 0xbf, 0xba, 0x8d, 
	0x5f, 0x06, 0xfc, 0x3e, 0xd8, 0x2f, 0xb9, 0xd2, 0xe1, 0x17, 0x7e, 0x95, 0x04, 0xf8, 0xd5, 0x13, 
	0x2e, 0xe1, 0x97, 0xde, 0xa8, 0x2f, 0xe9, 0x17, 0xfd, 0xe7, 0x17, 0xf0, 0x0b, 0xbf, 0xff, 0x40, 
	0x35, 0xb2, 0x7e, 0xf6, 0x25, 0xfd, 0xae, 0xf0, 0xfb, 0xce, 0x35, 0xfc, 0x92, 0x12, 0x3b, 0x5d, 
	0xbf, 0x46, 0x02, 0x01, 0x7e, 0x0d, 0xbf, 0xfc, 0xdf, 0x47, 0xbf, 0xa4, 0xdf, 0xb5, 0x20, 0x01, 
	0x7e, 0x3b, 0xf8, 0xdd, 0x63, 0xfd, 0xf6, 0x19, 0x7e, 0xdf, 0xb9, 0x80, 0x5f, 0x4e, 0x17, 0xbf, 
	0xe4, 0x8c, 0x81, 0xdf, 0x3b, 0xf9, 0x35, 0x13, 0xf0, 0xfc, 0xab, 0x27, 0xc0, 0xaf, 0x9e, 0x00, 
	0xbf, 0x7a, 0x02, 0xfc, 0x3a, 0x7e, 0x4d, 0xf6, 0xb8, 0xdf, 0x5c, 0xf6, 0xb8, 0x5f, 0x5d, 0xf6, 
	0xb8, 0x5f, 0x5c, 0xf6, 0xb8, 0x9f, 0x5d, 0xf6, 0xb8, 0x9f, 0x5c, 0xf6, 0xb8, 0x1f, 0x5d, 0xf6, 
	0xb8, 0x1f, 0x5c, 0xf6, 0xb8, 0xef, 0x5d, 0x84, 0x46, 0x13, 0xa1, 0xd1, 0x04, 0x7e, 0xe1, 0x17, 
	0x7e, 0x9f, 0xe4, 0x17, 0xf3, 0x53, 0x54, 0xbd, 0x61, 0xe6, 0xa7, 0x60, 0x7e, 0x99, 0xae, 0x37, 
	0xcc, 0xfc, 0x32, 0x70, 0x73, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xcd, 0x2f, 0x04, 0x87, 0x41, 
	0xd5, 0x0b, 0xbf, 0x61, 0xd0, 0xfd, 0x42, 0x70, 0x10, 0x0c, 0xbd, 0xf0, 0x1b, 0x04, 0xcb, 0x2f, 
	0x04, 0x87, 0xc0, 0xd4, 0x0b, 0xc3, 0x01, 0xf0, 0xec, 0xc2, 0xf0, 0xdd, 0xc9, 0xd9, 0x05, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xf0, 0x37, 0x6c, 
	0x6c, 0x3d, 0x8c 
};

#endif

--- NEW FILE: kbd_ss_c.cpp ---
#ifndef __keyboard_symbols_shift_compressed__
#define __keyboard_symbols_shift_compressed__

unsigned int size_keyboard_symbols_shift_compressed = 3263;
unsigned char keyboard_symbols_shift_compressed[] __attribute__((aligned(16))) = {
	0x78, 0x9c, 0xed, 0x9d, 0xe9, 0xb6, 0xac, 0xb8, 0x0d, 0x46, 0x49, 0x0f, 0x49, 0x77, 0x7a, 0x4a, 
	0x7a, 0x1e, 0x92, 0xbc, 0xff, 0x13, 0xd2, 0x7f, 0xd3, 0xe7, 0x9c, 0x02, 0x4b, 0xb2, 0x24, 0x1b, 
	0x6c, 0x33, 0x88, 0x6f, 0xaf, 0x75, 0xab, 0x28, 0x90, 0x8d, 0x8b, 0x5d, 0x36, 0xc6, 0xe0, 0x73, 
	0xff, 0xfc, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1b, 0x31, 
	0x83, 0x1b, 0x03, 0xbb, 0xd1, 0x81, 0xdd, 0xe8, 0x40, 0x6f, 0x70, 0xe0, 0x37, 0x36, 0xd0, 0x1b, 
	0x1c, 0xf8, 0x8d, 0x0d, 0xf4, 0x06, 0x07, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x29, 0xf9, 0xfd, 0x9b, 
	0x09, 0xcf, 0xe7, 0x13, 0x13, 0x1e, 0xf7, 0xa9, 0x09, 0x8f, 0xfb, 0xcc, 0x84, 0xc7, 0x7d, 0x6e, 
	0xc2, 0xe3, 0xfe, 0x6e, 0xc2, 0xe3, 0xfe, 0x61, 0xc2, 0xe3, 0xbe, 0x30, 0xe1, 0x71, 0x5f, 0x9a, 
	0xf0, 0xb8, 0x7f, 0x9a, 0xf0, 0xb8, 0xaf, 0x4c, 0x66, 0x95, 0x82, 0x5f, 0x5b, 0x2f, 0x17, 0x6c, 
	0xeb, 0xe5, 0x82, 0x6d, 0xbd, 0x5c, 0xb0, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 0x72, 0xc1, 0xb6, 0x5e, 
	0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 0x7a, 0xb9, 0x60, 0x5b, 0x2f, 0x17, 0x6c, 0xeb, 0xe5, 0x82, 
	0x6d, 0xbd, 0x86, 0x60, 0xdf, 0xaf, 0xa7, 0x97, 0x0a, 0xf6, 0xf4, 0x52, 0xc1, 0x9e, 0x5e, 0x2a, 
	0xd8, 0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 0x60, 0x4f, 0x2f, 0x15, 0xec, 0xe9, 0xa5, 0x82, 0x3d, 
	0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 0xf6, 0xf4, 0x52, 0xc1, 0x9e, 0x5e, 0x5d, 0x30, 0xfc, 0xc2, 
	0xef, 0xb3, 0xfc, 0x6a, 0x47, 0x29, 0xb4, 0x5f, 0x2d, 0x99, 0xe6, 0x57, 0x8b, 0xd3, 0xfc, 0x6a, 
	0x71, 0x9a, 0x5f, 0x2d, 0x4e, 0xf3, 0xab, 0xc5, 0x69, 0x7e, 0xb5, 0xb8, 0x4a, 0xbf, 0xb3, 0xe6, 
	0x57, 0x8b, 0xd3, 0xfc, 0x6a, 0x71, 0x9a, 0x5f, 0x2d, 0x4e, 0xf3, 0xab, 0xc5, 0x05, 0xf6, 0xab, 
	0x85, 0x5d, 0xd2, 0xef, 0x34, 0x4d, 0xfa, 0x06, 0xa1, 0x91, 0xc6, 0x1d, 0xe9, 0x97, 0xee, 0xf7, 
	0x50, 0xbf, 0x64, 0xc7, 0x07, 0xfa, 0x9d, 0xe8, 0xf7, 0x75, 0xfd, 0x92, 0x38, 0xc7, 0x2f, 0xcd, 
	0xce, 0xaf, 0xbf, 0x24, 0xf2, 0x82, 0x7e, 0xa7, 0x0f, 0xf2, 0x0d, 0xb3, 0xd0, 0xf8, 0x57, 0xcc, 
	0x9a, 0xa3, 0xe7, 0x97, 0x64, 0x67, 0xfb, 0x65, 0x36, 0x5c, 0xbf, 0x2c, 0xd2, 0xf6, 0x4b, 0xbf, 
	0x85, 0xeb, 0x97, 0x05, 0xda, 0x7e, 0x79, 0xf9, 0xfc, 0xf6, 0x39, 0xc5, 0x5e, 0xce, 0xef, 0x12, 
	0xf4, 0x7a, 0x6f, 0xf7, 0x3b, 0x4d, 0xf4, 0x07, 0x63, 0xf9, 0x4d, 0x21, 0x1f, 0x6f, 0xb6, 0x5f, 
	0xee, 0xcd, 0xf4, 0xfb, 0x1e, 0x93, 0x02, 0xe1, 0xf7, 0x43, 0x63, 0x8a, 0xf9, 0x58, 0x6a, 0xf6, 
	0x3b, 0xbd, 0x47, 0x4d, 0x4b, 0xc6, 0x86, 0xdf, 0x14, 0xf1, 0x8a, 0x33, 0xfd, 0x0a, 0x6f, 0x1d, 
	0xfc, 0xb2, 0x06, 0xc1, 0xf4, 0xcb, 0xf5, 0x96, 0xfa, 0x57, 0x6b, 0xf4, 0xc5, 0xfc, 0x2e, 0x47, 
	0x65, 0x3d, 0xde, 0xb6, 0x5f, 0x56, 0x2d, 0xbb, 0xf9, 0x5d, 0x32, 0xb4, 0xfc, 0xb2, 0x4a, 0x3e, 
	0x17, 0xfc, 0xf6, 0x6c, 0x9f, 0xe3, 0xf8, 0x65, 0x46, 0x7a, 0xf8, 0xa5, 0xf5, 0xa3, 0xe0, 0x77, 
	0x8d, 0x6c, 0xef, 0x5f, 0xb1, 0xdd, 0xc2, 0xef, 0xbb, 0x46, 0x56, 0x8d, 0x0a, 0x7e, 0x59, 0xf3, 
	0x5c, 0x3c, 0xff, 0x2a, 0x1b, 0xde, 0x20, 0x7e, 0x79, 0x85, 0x6b, 0xf6, 0xcb, 0xf5, 0xb6, 0xf7, 
	0x9f, 0xe1, 0xb7, 0xa9, 0xff, 0x2c, 0xf4, 0x36, 0xfb, 0x95, 0x0d, 0x7e, 0xf3, 0xf5, 0x6f, 0x28, 
	0xbf, 0xe9, 0xc8, 0xf4, 0xf0, 0x4b, 0xab, 0xb0, 0x77, 0xfd, 0xfb, 0xda, 0xb3, 0xdf, 0xbf, 0x12, 
	0x18, 0x7e, 0xd3, 0x17, 0x80, 0xdf, 0x37, 0x14, 0xbf, 0x85, 0xfe, 0x33, 0x3f, 0xfd, 0xd6, 0xf8, 
	0xf5, 0xfa, 0x57, 0x4b, 0xf1, 0xd6, 0xc0, 0x1e, 0x7e, 0xe9, 0xef, 0x0a, 0x7e, 0x17, 0xbf, 0xfc, 
	0x82, 0xb5, 0x97, 0xdf, 0x42, 0xff, 0x79, 0x16, 0x6d, 0x47, 0x1f, 0xbf, 0xf3, 0xb3, 0xfc, 0x52, 
	0xbc, 0xeb, 0x23, 0x8a, 0xd7, 0x7f, 0xa6, 0xfd, 0x92, 0xc6, 0xeb, 0x23, 0xd2, 0x98, 0xf6, 0xf6, 
	0x9b, 0x36, 0xc0, 0x2f, 0x29, 0x58, 0xa9, 0xfe, 0x76, 0xf6, 0xbb, 0x36, 0xa8, 0x7d, 0xfc, 0xb2, 
	0x0b, 0xf9, 0x65, 0x43, 0xdb, 0xfd, 0x05, 0x2e, 0xf8, 0xae, 0xe3, 0x57, 0xb2, 0xe1, 0x6d, 0xf6, 
	0xcb, 0x9b, 0x7b, 0xef, 0xfa, 0x77, 0xa6, 0x42, 0xfa, 0x5c, 0x1f, 0x75, 0xec, 0x5f, 0xf5, 0xf6, 
	0x3b, 0xf1, 0xe3, 0x72, 0xbd, 0xfb, 0x47, 0xb5, 0x7e, 0xeb, 0xae, 0x8f, 0x48, 0xe8, 0xba, 0xe1, 
	0x62, 0xf7, 0x07, 0x99, 0xe0, 0x2b, 0xde, 0x3f, 0xa2, 0x3c, 0xe0, 0xfe, 0x20, 0xe3, 0x09, 0xf7, 
	0x7f, 0x29, 0xf0, 0x8b, 0xe7, 0x37, 0x94, 0x0d, 0x77, 0x78, 0x3e, 0xc7, 0x7e, 0x00, 0x2b, 0x7d, 
	0x0c, 0xe5, 0xd7, 0x24, 0xc5, 0x7d, 0xe2, 0x92, 0xe2, 0x3e, 0x75, 0x49, 0x71, 0x9f, 0xb9, 0xa4, 
	0x38, 0xef, 0xe9, 0x3a, 0x3c, 0x3f, 0x09, 0xbf, 0xf0, 0x0b, 0xbf, 0x91, 0xfd, 0x62, 0x7e, 0x8a, 
	0xaa, 0x37, 0xcc, 0xfc, 0x14, 0xcc, 0x2f, 0xd3, 0xf5, 0x86, 0x99, 0x5f, 0x06, 0x6e, 0x0e, 0xfc, 
	0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 
	0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 0xc6, 0xa6, 0xe4, 0xf7, 0x7f, 0x8d, 0x9c, 0xf5, 0xbd, 
	0xa2, 0xf2, 0xb5, 0x89, 0x1e, 0x5f, 0xf0, 0xdb, 0xaa, 0x17, 0x82, 0xfb, 0x62, 0xeb, 0x35, 0x04, 
	0xfb, 0x7e, 0xdb, 0xf5, 0x42, 0x70, 0x4f, 0x3c, 0xbd, 0xba, 0x60, 0xf8, 0xbd, 0x13, 0xf0, 0x1b, 
	0x9b, 0x21, 0x7e, 0xf7, 0x17, 0x07, 0x7e, 0x3b, 0x63, 0x6a, 0x84, 0xdf, 0x10, 0xc0, 0x6f, 0x6c, 
	0xe0, 0x37, 0x36, 0x43, 0xfd, 0x8a, 0x29, 0xbb, 0xeb, 0x5a, 0xbb, 0x38, 0xf0, 0xdb, 0x19, 0xa6, 
	0x91, 0xaa, 0xe8, 0xe3, 0x57, 0xcb, 0x00, 0x7e, 0x0f, 0x04, 0x7e, 0x63, 0x73, 0x94, 0xdf, 0xd4, 
	0x50, 0xd3, 0xf7, 0x69, 0xe6, 0x93, 0x39, 0xe1, 0xb7, 0x37, 0x83, 0xfd, 0x12, 0xab, 0xcb, 0xcb, 
	0x2c, 0x56, 0xb0, 0xf3, 0x33, 0xfc, 0x76, 0xe6, 0xb8, 0xfa, 0x3b, 0x9b, 0x7e, 0x67, 0x23, 0x39, 
	0x68, 0x67, 0xd1, 0x38, 0x51, 0xe8, 0x86, 0x8c, 0x6e, 0x7e, 0xd7, 0xbf, 0x67, 0x30, 0x1b, 0xc9, 
	0x41, 0x3b, 0x27, 0xfa, 0xcd, 0x83, 0xe0, 0xb7, 0x3b, 0x68, 0x9f, 0x63, 0x73, 0x44, 0xff, 0x6a, 
	0x55, 0xfb, 0xca, 0x9e, 0xf7, 0x9b, 0xe1, 0x77, 0x24, 0x43, 0xfd, 0x6e, 0x07, 0x7e, 0x3b, 0x03, 
	0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xe0, 0xfe, 0x51, 0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x9b, 0x21, 
	0x7e, 0x1b, 0x19, 0xf3, 0x4d, 0x9f, 0xc9, 0xd7, 0x2e, 0x5a, 0x0a, 0xf8, 0xbd, 0x13, 0xf0, 0x1b, 
	0x9b, 0xde, 0x7e, 0x31, 0x3f, 0xe5, 0x62, 0x6c, 0xd5, 0x8b, 0xf9, 0x65, 0x37, 0x63, 0xa3, 0x5e, 
	0xcc, 0x0f, 0x0d, 0x0e, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0x5c, 
	0xc0, 0xaf, 0xf7, 0x04, 0x75, 0xfe, 0x3f, 0x66, 0xd9, 0x31, 0x79, 0x64, 0x45, 0xda, 0x35, 0x07, 
	0x65, 0x62, 0x86, 0x95, 0x9a, 0x6f, 0xd0, 0xd2, 0x16, 0x92, 0x14, 0xf7, 0xd0, 0x8f, 0xab, 0xfb, 
	0xad, 0x71, 0xd4, 0xec, 0x57, 0x4f, 0x5f, 0xe7, 0xd7, 0xda, 0x77, 0x4d, 0x5e, 0x8f, 0xf0, 0x5b, 
	0xf8, 0xf5, 0xd7, 0xf9, 0xcd, 0x1e, 0x0d, 0xaa, 0x4d, 0x4b, 0xe2, 0xe0, 0x77, 0x08, 0xc9, 0x2f, 
	0x69, 0xe9, 0xe8, 0x92, 0x58, 0x91, 0x37, 0x88, 0xaf, 0xff, 0x2a, 0x8b, 0x26, 0x90, 0xff, 0x9f, 
	0x59, 0xa9, 0x08, 0xa2, 0x3c, 0xd4, 0x19, 0x9b, 0xaa, 0xb1, 0x3c, 0x6a, 0xa6, 0xa6, 0x55, 0x1e, 
	0x18, 0xd6, 0xca, 0x9c, 0x7d, 0xb7, 0x91, 0x9c, 0xee, 0x57, 0x35, 0x63, 0x3f, 0x9f, 0xc9, 0x9f, 
	0xed, 0x5b, 0xb3, 0xb0, 0xfc, 0xca, 0x50, 0x79, 0xdc, 0xc9, 0x5a, 0x52, 0x1e, 0x35, 0x8f, 0xec, 
	0xc1, 0xc2, 0x2c, 0xad, 0x2c, 0x70, 0xb1, 0x50, 0x17, 0xf0, 0xfb, 0xdf, 0x46, 0x8a, 0x05, 0xd0, 
	0x0f, 0xc2, 0xfa, 0xb1, 0xd2, 0xef, 0xe2, 0xb8, 0x14, 0xea, 0x95, 0x43, 0xfd, 0x91, 0x09, 0xbf, 
	0xa4, 0x60, 0x46, 0x5a, 0xb1, 0xd8, 0xdb, 0xef, 0x37, 0x26, 0x7a, 0x7c, 0xc1, 0x6f, 0xab, 0xde, 
	0xb2, 0xe0, 0x49, 0x34, 0x57, 0xb2, 0x65, 0xad, 0xf4, 0x3b, 0xeb, 0xb9, 0xc8, 0x50, 0xa3, 0xfe, 
	0xa6, 0x84, 0x73, 0xda, 0x2c, 0x3e, 0x3b, 0x7e, 0x65, 0xa5, 0x25, 0x8b, 0x9d, 0xfd, 0xda, 0x7a, 
	0x0d, 0xc1, 0xbe, 0xdf, 0x76, 0xbd, 0x25, 0xc1, 0xba, 0xc4, 0xcd, 0xed, 0x73, 0xb5, 0xdf, 0xba, 
	0x42, 0x64, 0x6b, 0x95, 0x0d, 0x5a, 0x14, 0x6f, 0xab, 0xfb, 0xfb, 0xf5, 0xf4, 0xea, 0x82, 0xc3, 
	0xf8, 0x55, 0x1a, 0xd8, 0xfd, 0x7e, 0xcd, 0xf6, 0xd9, 0xde, 0xf9, 0xeb, 0x03, 0xfc, 0x72, 0x4c, 
	0x89, 0x56, 0x2f, 0x96, 0xb5, 0xe8, 0x3c, 0x8f, 0x6c, 0x7b, 0x6d, 0xff, 0x99, 0x05, 0x16, 0xfb, 
	0xcf, 0x64, 0x57, 0xd9, 0x4e, 0xd8, 0x02, 0xf3, 0xdb, 0xa5, 0xff, 0x3c, 0xc4, 0xef, 0xc6, 0x32, 
	0x10, 0x1a, 0x93, 0x3b, 0x6c, 0x3f, 0x73, 0x1d, 0xc3, 0xe0, 0x72, 0x99, 0x1a, 0x03, 0xf9, 0xad, 
	0x6d, 0x74, 0xcf, 0x60, 0x74, 0xb1, 0xa8, 0x46, 0xd6, 0x34, 0x05, 0xf2, 0x3b, 0xd7, 0x36, 0xba, 
	0x87, 0x33, 0xbe, 0x58, 0x44, 0x23, 0xdf, 0x59, 0x24, 0xbf, 0x0f, 0x66, 0xb0, 0x5f, 0xf3, 0xd2, 
	0xf1, 0xb5, 0x55, 0xae, 0x81, 0xdf, 0xce, 0x0c, 0xf7, 0x9b, 0x5e, 0x73, 0x06, 0xfa, 0x2d, 0x77, 
	0x84, 0xed, 0x9f, 0x5e, 0xd5, 0xf5, 0xd1, 0x24, 0x16, 0x3a, 0x95, 0xaa, 0x37, 0x71, 0xfd, 0x3a, 
	0xfb, 0x2d, 0x14, 0x6d, 0x98, 0xdf, 0x9d, 0xd7, 0xb0, 0x2d, 0x1c, 0xe8, 0x97, 0x5d, 0x0d, 0xf2, 
	0x41, 0x00, 0x2b, 0xf9, 0x7e, 0xca, 0x87, 0xb2, 0xd5, 0xef, 0x44, 0xdf, 0x7b, 0x15, 0xaa, 0x3b, 
	0xc7, 0x9d, 0x7f, 0x95, 0xb1, 0xa6, 0x69, 0x92, 0x5f, 0xf6, 0x1c, 0xbf, 0xde, 0x50, 0x88, 0x95, 
	0x58, 0xf8, 0xe5, 0x43, 0x10, 0xf9, 0x10, 0x0b, 0xd9, 0x25, 0x59, 0x66, 0x7b, 0xcf, 0x7f, 0xff, 
	0x1d, 0x3a, 0xfe, 0xcc, 0xaf, 0xb1, 0x81, 0xd3, 0xd4, 0x3e, 0xf3, 0x66, 0x33, 0x2f, 0xfd, 0x29, 
	0x7e, 0xf5, 0xa1, 0xc0, 0x14, 0xa7, 0x9c, 0xa9, 0xa7, 0xf5, 0x06, 0xa3, 0x3a, 0x84, 0x68, 0x64, 
	0x66, 0xfa, 0x95, 0x2b, 0xc4, 0xa6, 0x06, 0x56, 0x8d, 0x32, 0xab, 0x41, 0xed, 0xb3, 0xf4, 0x2b, 
	0x32, 0x1f, 0xe8, 0x57, 0x4a, 0x12, 0xd6, 0x4c, 0xbf, 0x56, 0xf6, 0x96, 0x5f, 0x5a, 0xa7, 0xb3, 
	0x22, 0x88, 0x65, 0x9e, 0xcc, 0xdc, 0xd4, 0xc0, 0x71, 0xf5, 0x57, 0x29, 0xf5, 0x05, 0xea, 0xef, 
	0x5a, 0x8e, 0xcd, 0xf5, 0xf7, 0x55, 0x7a, 0xd7, 0x6f, 0xf6, 0x93, 0x12, 0xcb, 0x6c, 0x77, 0xd6, 
	0x99, 0xac, 0x89, 0xe3, 0xfa, 0x57, 0xd7, 0x3c, 0xff, 0xf2, 0xe2, 0x6d, 0xa9, 0xbf, 0xa6, 0xdf, 
	0xec, 0x5d, 0x2d, 0x94, 0x2e, 0xd1, 0xaa, 0x09, 0xbb, 0x39, 0x70, 0x7c, 0x83, 0xd6, 0x92, 0x63, 
	0xfa, 0xcf, 0xee, 0xe1, 0x69, 0xf6, 0x6b, 0xa6, 0x63, 0xef, 0x79, 0xfd, 0x35, 0xfc, 0x5a, 0x95, 
	0xa0, 0x8d, 0xa8, 0xe3, 0x93, 0xe5, 0x7e, 0xb0, 0xda, 0x3e, 0x57, 0xa4, 0x4b, 0x89, 0x65, 0xa3, 
	0x3c, 0xd1, 0x8d, 0x72, 0x65, 0x96, 0x7b, 0xd6, 0x1d, 0x51, 0xfb, 0xcf, 0xc5, 0x92, 0x14, 0x88, 
	0xea, 0x17, 0x7c, 0x00, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0x3c, 0xe2, 0xfe, 0xef, 0x83, 0x79, 0xc2, 
	0xf3, 0x1b, 0x4f, 0x66, 0x88, 0xdf, 0x46, 0xc6, 0x7c, 0xd3, 0x32, 0xe6, 0x75, 0xab, 0x16, 0xaa, 
	0x75, 0xb4, 0x0b, 0x09, 0xab, 0xfa, 0xe6, 0x6a, 0xc0, 0xfe, 0x71, 0xca, 0x6f, 0x5c, 0xb4, 0x14, 
	0x71, 0xfd, 0x56, 0x0c, 0x8a, 0xf0, 0xc8, 0xba, 0xb5, 0xdb, 0x72, 0xdf, 0x93, 0xb3, 0x03, 0xfc, 
	0x52, 0xf2, 0x01, 0x17, 0x27, 0xb0, 0x76, 0x2d, 0xdf, 0x7a, 0x73, 0xbf, 0x07, 0xcc, 0x4f, 0x19, 
	0x49, 0xed, 0xfd, 0x38, 0x63, 0xf0, 0x5a, 0x0e, 0xcf, 0x59, 0xa3, 0xcf, 0x7c, 0x20, 0x8b, 0xb5, 
	0xf5, 0xd9, 0xb2, 0x4c, 0xbb, 0x91, 0xad, 0x7a, 0xcf, 0x9f, 0x5f, 0x36, 0x94, 0xfc, 0x40, 0x1a, 
	0xf7, 0x17, 0xb4, 0x5b, 0x12, 0x62, 0x85, 0xfc, 0xad, 0x50, 0x71, 0xfc, 0x95, 0xb4, 0x1b, 0xfa, 
	0xa0, 0x67, 0xc3, 0x40, 0xd6, 0x46, 0xbd, 0xe7, 0xcf, 0x0f, 0x1d, 0x4a, 0xe5, 0x81, 0x94, 0x75, 
	0xd1, 0xf0, 0xab, 0xa4, 0x4b, 0x16, 0xc5, 0xe2, 0x28, 0xbf, 0x5b, 0x09, 0xed, 0x57, 0x69, 0x9f, 
	0x8d, 0xfa, 0xcb, 0x17, 0x95, 0x06, 0xd7, 0xec, 0x0a, 0x2f, 0xaf, 0xf0, 0x7b, 0x38, 0x7b, 0xfa, 
	0x57, 0x7a, 0xfd, 0x15, 0x41, 0xd9, 0x56, 0xde, 0x56, 0xc3, 0xef, 0x21, 0xec, 0xba, 0x3e, 0xaa, 
	0x6e, 0x9f, 0xe1, 0xf7, 0x64, 0x78, 0xef, 0xa7, 0x10, 0xca, 0x6f, 0xef, 0x25, 0x6b, 0xcb, 0x46, 
	0x25, 0x1f, 0xd6, 0xcc, 0xb3, 0x05, 0xe6, 0xb7, 0x6f, 0xff, 0x79, 0x33, 0x71, 0xfd, 0x1e, 0xca, 
	0x81, 0xc6, 0xb6, 0x01, 0xbf, 0x3d, 0xb8, 0xac, 0x5e, 0xf8, 0xed, 0xc0, 0xfe, 0xf1, 0xe4, 0xf1, 
	0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 0x25, 0xbf, 0xff, 0x69, 0x64, 0x57, 0xa1, 0xec, 0x21, 0x44, 
	0xba, 0xb6, 0x63, 0xab, 0x58, 0x75, 0xaf, 0x8f, 0x86, 0xef, 0xdf, 0xda, 0xc8, 0xb7, 0x26, 0x7a, 
	0x7c, 0xc1, 0x6f, 0xab, 0xde, 0x7d, 0x82, 0x8d, 0xab, 0x44, 0xf5, 0x0a, 0xb4, 0x07, 0x5b, 0xaf, 
	0x4a, 0xcf, 0xf3, 0x6b, 0xeb, 0x35, 0x04, 0xfb, 0x7e, 0xdb, 0xf5, 0xee, 0x12, 0x5c, 0xe7, 0xb7, 
	0x1f, 0xb7, 0xf1, 0xeb, 0xe9, 0xd5, 0x05, 0xdf, 0xd0, 0xaf, 0x18, 0x70, 0x98, 0xe8, 0xb8, 0x01, 
	0x5f, 0x24, 0xef, 0x15, 0xfb, 0x5b, 0x96, 0x9d, 0xdc, 0xca, 0xf1, 0xf3, 0x86, 0x61, 0xd1, 0xed, 
	0x3c, 0xc5, 0xaf, 0x8c, 0xb2, 0x17, 0xb5, 0xbb, 0x7a, 0x5b, 0xee, 0x2f, 0x64, 0x83, 0x5a, 0x66, 
	0x3c, 0x75, 0x3b, 0xaa, 0x0a, 0x0f, 0xf1, 0xbb, 0xbf, 0x38, 0xfb, 0xfd, 0x92, 0xfb, 0xb1, 0xf2, 
	0x3e, 0xab, 0x18, 0x78, 0x2c, 0xfa, 0xad, 0xda, 0x9f, 0xf6, 0x59, 0x55, 0x2b, 0xe3, 0x95, 0xa0, 
	0x4d, 0x5d, 0xb5, 0x6d, 0x98, 0x1a, 0xef, 0xe6, 0x37, 0xbd, 0x66, 0xab, 0x2b, 0xfd, 0x1a, 0x77, 
	0xf5, 0x4a, 0xf5, 0x77, 0xa6, 0x3f, 0x2d, 0x9e, 0x9d, 0x1a, 0xaf, 0xfb, 0xdd, 0xf0, 0x5d, 0x37, 
	0x01, 0xbf, 0x32, 0xed, 0x86, 0xfa, 0x2b, 0x55, 0x89, 0xaa, 0x5b, 0xd5, 0x3e, 0x7f, 0xac, 0x3a, 
	0xa4, 0xfe, 0xb2, 0xdd, 0x3c, 0xd2, 0xef, 0xc6, 0xf6, 0xd9, 0xf6, 0x7b, 0xad, 0xf3, 0x2f, 0xd9, 
	0xf7, 0xa4, 0x6f, 0x20, 0xd4, 0xf9, 0x55, 0xaf, 0xff, 0xb3, 0x35, 0x59, 0xc4, 0x11, 0x7e, 0x69, 
	0xd9, 0xd4, 0xfe, 0x73, 0xdd, 0x0e, 0x95, 0x3c, 0xbc, 0xfe, 0xb3, 0x88, 0xca, 0x76, 0x39, 0x48, 
	0xf0, 0x38, 0xbf, 0xb3, 0x7d, 0xbc, 0xcd, 0xcf, 0xad, 0xd5, 0xbf, 0x1e, 0xbd, 0x6e, 0xf5, 0xcb, 
	0xf4, 0x2a, 0x0c, 0xf5, 0x5b, 0xf4, 0x79, 0x8a, 0x5f, 0xfb, 0x84, 0xd9, 0x25, 0xe7, 0x6b, 0x71, 
	0x88, 0x5f, 0xde, 0xc1, 0xa4, 0xed, 0x92, 0x6c, 0xb1, 0x0e, 0xa9, 0xbf, 0xec, 0x02, 0xaa, 0x67, 
	0xd7, 0xe6, 0xa1, 0x7e, 0x0b, 0xdd, 0x10, 0xba, 0x78, 0x58, 0xfb, 0xfc, 0x14, 0xe0, 0xf7, 0x0c, 
	0x8e, 0xab, 0xe8, 0x42, 0xe3, 0x20, 0xbf, 0xbc, 0x6f, 0x6a, 0x7f, 0xde, 0xef, 0x37, 0x3f, 0x62, 
	0xeb, 0xb8, 0xc4, 0x80, 0x9e, 0x94, 0x9a, 0x91, 0xd1, 0x87, 0xb7, 0xd3, 0xab, 0xd7, 0x18, 0x95, 
	0xbb, 0xaa, 0xfd, 0x26, 0x52, 0xe3, 0x9a, 0xb0, 0x77, 0xfd, 0x9d, 0x6b, 0x3e, 0xf7, 0xf4, 0xab, 
	0xac, 0xbd, 0x8a, 0x5f, 0xfd, 0xe0, 0x6c, 0xd8, 0x55, 0xfd, 0x37, 0x19, 0x5a, 0x7f, 0xe9, 0xe5, 
	0xe7, 0xe0, 0xf6, 0xb9, 0xf1, 0x30, 0xf4, 0xd8, 0xdb, 0x0d, 0xfc, 0x0e, 0x1a, 0xdf, 0xb0, 0xfa, 
	0xcf, 0xcb, 0x0e, 0x3b, 0xf4, 0x9f, 0xdd, 0xc3, 0x20, 0x86, 0x2e, 0x4a, 0xe3, 0x1b, 0xdb, 0x1a, 
	0x4d, 0x7e, 0x31, 0x20, 0x2f, 0x09, 0xb4, 0x5c, 0xe9, 0xcf, 0x9e, 0xae, 0x61, 0x67, 0x2b, 0xd6, 
	0xc3, 0xcf, 0x7a, 0xfb, 0xf2, 0xba, 0xc3, 0x64, 0x94, 0xdf, 0x9d, 0x0c, 0xf3, 0x4b, 0x3e, 0xea, 
	0x2d, 0xc7, 0xba, 0x28, 0x0f, 0x59, 0x7e, 0x1a, 0xcf, 0xd5, 0xc8, 0x7c, 0xb2, 0xdc, 0xe8, 0xcf, 
	0x6b, 0xa6, 0xba, 0xe8, 0x9a, 0xf4, 0xba, 0xfc, 0x2b, 0x97, 0xb6, 0x54, 0x93, 0xe3, 0xf9, 0xe5, 
	0x3f, 0x78, 0xb6, 0xb1, 0xd2, 0xef, 0x96, 0xbd, 0x95, 0xfd, 0xca, 0x04, 0xb2, 0xf2, 0xaf, 0xeb, 
	0xc4, 0x62, 0xa5, 0xdf, 0x02, 0xf1, 0xfc, 0x2a, 0x6b, 0xeb, 0xfc, 0x4e, 0x4b, 0x0b, 0x2b, 0xf3, 
	0x28, 0xd4, 0x5f, 0x79, 0x31, 0xa0, 0xe6, 0x96, 0xff, 0xe8, 0x58, 0x56, 0xbb, 0xfc, 0xa2, 0x7d, 
	0xde, 0x5a, 0x7f, 0xed, 0x9c, 0xcc, 0xbd, 0xd1, 0x86, 0x43, 0xbe, 0x8a, 0xdc, 0xd4, 0x4d, 0xe9, 
	0x14, 0x42, 0x0a, 0x59, 0xe9, 0xb7, 0xa2, 0xb8, 0xf0, 0x7b, 0x5c, 0xfb, 0xdc, 0xdb, 0x6f, 0x4d, 
	0x23, 0x1d, 0xe4, 0xfe, 0xef, 0xac, 0x34, 0xa2, 0xb3, 0xe1, 0x77, 0x2e, 0xf5, 0x9f, 0xb7, 0xed, 
	0x8d, 0xe5, 0x40, 0x5f, 0x59, 0x6e, 0x24, 0x5c, 0xe4, 0xc2, 0x8b, 0xaa, 0xf8, 0xed, 0xd8, 0x7f, 
	0xae, 0xd9, 0x50, 0xe1, 0xb7, 0x11, 0xbf, 0xc4, 0x7d, 0x50, 0x5b, 0xd8, 0x83, 0x77, 0x5c, 0xb5, 
	0xbe, 0x91, 0x6f, 0x5d, 0xb4, 0x14, 0xb7, 0xf7, 0xab, 0xb7, 0x78, 0x27, 0x33, 0xaa, 0x10, 0x0f, 
	0xf4, 0x3b, 0xab, 0x2d, 0xde, 0xa9, 0x8c, 0x2b, 0x44, 0x6f, 0xbf, 0x27, 0xcd, 0x4f, 0x01, 0x16, 
	0x5b, 0xf5, 0x5e, 0x73, 0x7e, 0x19, 0x30, 0xd9, 0xa8, 0x17, 0xf3, 0x43, 0x83, 0x03, 0xbf, 0xb1, 
	0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 
	0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x29, 0xf9, 0xfd, 0xa3, 0x91, 0xb3, 0xbe, 0x57, 0x54, 
	0xbe, 0x33, 0xd1, 0xe3, 0x0b, 0x7e, 0x5b, 0xf5, 0x42, 0x70, 0x5f, 0x6c, 0xbd, 0x86, 0x60, 0xdf, 
	0x6f, 0xbb, 0x5e, 0x08, 0xee, 0x89, 0xa7, 0x57, 0x17, 0x0c, 0xbf, 0x77, 0x02, 0x7e, 0x63, 0x33, 
	0xc4, 0xef, 0xfe, 0xe2, 0xc0, 0x6f, 0x67, 0x4c, 0x8d, 0xf0, 0x1b, 0x02, 0xa6, 0x91, 0x3e, 0x06, 
	0x04, 0xbf, 0x21, 0x18, 0xe7, 0x57, 0x7b, 0x1e, 0xb9, 0x08, 0xfc, 0x76, 0x66, 0x98, 0xdf, 0xec, 
	0x69, 0xee, 0x2a, 0xe0, 0xb7, 0x33, 0xf0, 0x1b, 0x9b, 0xc1, 0x7e, 0xd7, 0x7c, 0xe5, 0x2c, 0x10, 
	0x7d, 0x09, 0x7e, 0x7b, 0x33, 0xf6, 0xfc, 0xbb, 0xe6, 0x5b, 0xf7, 0x02, 0xbf, 0xdd, 0x19, 0xda, 
	0x7f, 0x66, 0xb3, 0xa1, 0xc4, 0x94, 0x46, 0xfd, 0x23, 0xfc, 0x76, 0x66, 0xf0, 0xf5, 0x91, 0x32, 
	0xb1, 0x31, 0x9b, 0xa6, 0x47, 0x67, 0xfe, 0xc1, 0x6f, 0x67, 0x0e, 0xe9, 0x5f, 0x39, 0x0d, 0x32, 
	0x5b, 0x82, 0xdf, 0xee, 0x9c, 0xeb, 0x17, 0xe7, 0xdf, 0xd1, 0x1c, 0x32, 0xbe, 0xa1, 0x2e, 0xa2, 
	0xff, 0x7c, 0x04, 0x87, 0x8c, 0x4f, 0xd6, 0x5f, 0x05, 0xc3, 0x6f, 0x67, 0xe0, 0x37, 0x36, 0xf0, 
	0x1b, 0x1b, 0xdc, 0x3f, 0x8a, 0x0d, 0xfc, 0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x19, 0xe2, 
	0xb7, 0x91, 0x81, 0x5f, 0xf7, 0x71, 0x7c, 0xe7, 0xa2, 0xa5, 0x80, 0xdf, 0x3b, 0x01, 0xbf, 0xb1, 
	0xe9, 0xed, 0x17, 0xf3, 0x53, 0x2e, 0xc6, 0x56, 0xbd, 0x98, 0x5f, 0x76, 0x33, 0x36, 0xea, 0xc5, 
	0xfc, 0xd0, 0xe0, 0xc0, 0x6f, 0x6c, 0xe0, 0x37, 0x36, 0xf0, 0x1b, 0x1b, 0xf8, 0x8d, 0x0d, 0xfc, 
	0xc6, 0x06, 0x7e, 0x63, 0x03, 0xbf, 0xb1, 0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0x4a, 0x7e, 0x7f, 
	0x37, 0xe1, 0xf9, 0xfc, 0x66, 0xc2, 0xe3, 0x7e, 0x35, 0xe1, 0x71, 0xbf, 0x98, 0xf0, 0xb8, 0x9f, 
	0x4d, 0x78, 0xdc, 0x4f, 0x26, 0x3c, 0xee, 0x47, 0x13, 0x1e, 0xf7, 0x83, 0x09, 0x8f, 0xfb, 0xde, 
	0x84, 0xc7, 0xfd, 0xdb, 0x84, 0xc7, 0xfd, 0xcb, 0x64, 0x56, 0x29, 0xf8, 0xb5, 0xf5, 0x72, 0xc1, 
	0xb6, 0x5e, 0x2e, 0xd8, 0xd6, 0xcb, 0x05, 0xdb, 0x7a, 0xb9, 0x60, 0x5b, 0x2f, 0x17, 0x6c, 0xeb, 
	0xe5, 0x82, 0x6d, 0xbd, 0x5c, 0xb0, 0xad, 0x97, 0x0b, 0xb6, 0xf5, 0x72, 0xc1, 0xb6, 0x5e, 0x2e, 
	0xd8, 0xd6, 0x6b, 0x08, 0xf6, 0xfd, 0x7a, 0x7a, 0xa9, 0x60, 0x4f, 0x2f, 0x15, 0xec, 0xe9, 0xa5, 
	0x82, 0x3d, 0xbd, 0x54, 0xb0, 0xa7, 0x97, 0x0a, 0xf6, 0xf4, 0x52, 0xc1, 0x9e, 0x5e, 0x2a, 0xd8, 
	0xd3, 0x4b, 0x05, 0x7b, 0x7a, 0xa9, 0x60, 0x4f, 0x2f, 0x15, 0xec, 0xe9, 0xd5, 0x05, 0xc3, 0x2f, 
	0xfc, 0xc2, 0x6f, 0x68, 0xbf, 0x5a, 0x32, 0xcd, 0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 0x34, 0xbf, 
	0x5a, 0x9c, 0xe6, 0x57, 0x8b, 0xd3, 0xfc, 0x6a, 0x71, 0x9a, 0x5f, 0x2d, 0x4e, 0xf3, 0xab, 0xc5, 
	0x69, 0x7e, 0xb5, 0x38, 0xcd, 0xaf, 0x16, 0xa7, 0xf9, 0xd5, 0xe2, 0xe0, 0x17, 0x7e, 0xe1, 0x97, 
	0x69, 0x64, 0x7f, 0x10, 0xca, 0xf6, 0xcb, 0xff, 0x6a, 0x54, 0xc1, 0xef, 0x1a, 0x0c, 0xbf, 0x67, 
	0xfb, 0x7d, 0x53, 0x91, 0xdc, 0x39, 0xf5, 0x97, 0x09, 0xf6, 0xfd, 0xa6, 0x50, 0xcf, 0x2f, 0xfd, 
	0x53, 0x63, 0xf0, 0x3b, 0xc8, 0x2f, 0xfd, 0xdf, 0x9d, 0x67, 0xbf, 0x7d, 0xa6, 0x82, 0x5d, 0xbf, 
	0x24, 0x10, 0x7e, 0x87, 0xf8, 0xcd, 0xfe, 0x8f, 0xed, 0x1e, 0x7e, 0xa9, 0x37, 0xcf, 0x2f, 0xfd, 
	0x1d, 0xb8, 0xed, 0xf3, 0x7b, 0xcb, 0xa1, 0x6d, 0x10, 0x1a, 0x49, 0x86, 0xf0, 0xfb, 0x97, 0xc6, 
	0x69, 0xe5, 0x6d, 0xdd, 0xd4, 0xcd, 0x2f, 0x39, 0xd0, 0x8e, 0x5f, 0xd6, 0x8e, 0xfb, 0xf5, 0x37, 
	0x4d, 0xc1, 0x85, 0xdf, 0x6d, 0x7e, 0xdf, 0x3e, 0x50, 0xcd, 0x7e, 0xff, 0xb9, 0xea, 0xfc, 0xcb, 
	0x02, 0x6d, 0xbf, 0xbc, 0x1f, 0x86, 0xfe, 0xd5, 0x10, 0xbf, 0xaf, 0x8f, 0xa9, 0x12, 0xbb, 0x7e, 
	0xab, 0xfa, 0xcf, 0x3c, 0xd4, 0xf4, 0x2b, 0xfe, 0x38, 0x2b, 0xfc, 0x9e, 0xdd, 0x7f, 0x9e, 0x37, 
	0xf9, 0x5d, 0x62, 0x2d, 0xbf, 0xf2, 0x6f, 0xef, 0xc2, 0xef, 0xf9, 0x7e, 0xa9, 0x13, 0xf8, 0x7d, 
	0xb6, 0x5f, 0xb4, 0xcf, 0xef, 0x44, 0xf5, 0x8b, 0xfe, 0xd5, 0x07, 0xb7, 0xf2, 0x4b, 0x39, 0xf2, 
	0xfa, 0x88, 0x82, 0xeb, 0xa3, 0x0b, 0xf8, 0xed, 0x3d, 0xbe, 0x31, 0x9b, 0x1b, 0xe0, 0x57, 0xdf, 
	0x30, 0xb4, 0x7d, 0xee, 0x3d, 0x3e, 0x49, 0x41, 0xfb, 0x7c, 0xba, 0xdf, 0xee, 0xf7, 0x17, 0x28, 
	0xf0, 0x7b, 0x76, 0xfb, 0x8c, 0xfb, 0x83, 0xb1, 0xfd, 0x72, 0x70, 0x7f, 0x1f, 0x7e, 0x95, 0x0d, 
	0xa7, 0xfa, 0x35, 0x49, 0x71, 0xbf, 0xb9, 0xa4, 0xb8, 0x5f, 0x5d, 0x52, 0xdc, 0x2f, 0x2e, 0x29, 
	0xee, 0x67, 0x97, 0x14, 0xf7, 0x93, 0x4b, 0x8a, 0xfb, 0xd1, 0x25, 0xc5, 0xfd, 0xe0, 0x92, 0xe2, 
	0xbe, 0x77, 0x11, 0x1a, 0x4d, 0x84, 0x46, 0x13, 0xf8, 0x85, 0x5f, 0xf8, 0x7d, 0x92, 0x5f, 0xcc, 
	0x4f, 0x51, 0xf5, 0x86, 0x99, 0x9f, 0x82, 0xf9, 0x65, 0xba, 0xde, 0x30, 0xf3, 0xcb, 0xc0, 0xcd, 
	0x81, 0xdf, 0xd8, 0xc0, 0x6f, 0x6c, 0x34, 0xbf, 0x10, 0x1c, 0x06, 0x55, 0x2f, 0xfc, 0x86, 0x41, 
	0xf7, 0x0b, 0xc1, 0x41, 0x30, 0xf4, 0xc2, 0x6f, 0x10, 0x2c, 0xbf, 0x10, 0x1c, 0x02, 0x53, 0x2f, 
	0x0c, 0x07, 0xc0, 0xb3, 0x0b, 0xc3, 0x77, 0xa7, 0x64, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xc2, 0xff, 0x01, 0x7c, 0x20, 0xed, 0x46 
};

#endif

--- NEW FILE: osys_psp.cpp ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/psp/osys_psp.cpp,v 1.1 2005/08/16 17:15:36 joostp Exp $
 *
 */

#include "common/stdafx.h"
#include "common/scummsys.h"

#include "common/rect.h"
#include "backends/psp/osys_psp.h"

#include "common/config-manager.h"

#include <pspgu.h>

#include "./trace.h"

#define	SCREEN_WIDTH	480
#define	SCREEN_HEIGHT	272

extern bool g_quit;

unsigned short *DrawBuffer = (unsigned short *)0x44044000;
unsigned short *DisplayBuffer = (unsigned short *)0x44000000;

unsigned long RGBToColour(unsigned long r, unsigned long g, unsigned long b) {
	return (((b >> 3) << 10) | ((g >> 3) << 5) | ((r >> 3) << 0)) | 0x8000;
}

void putPixel(uint16 x, uint16 y, unsigned long colour) {
	*(unsigned short *)(DrawBuffer + (y << 9) + x ) = colour;
}

const OSystem::GraphicsMode OSystem_PSP::s_supportedGraphicsModes[] = {
	{ "320x200 (centered)", "320x200 16-bit centered", CENTERED_320X200 },
	{ "353x272 (best-fit, centered)", "353x272 16-bit centered", CENTERED_435X272 },
	{ "480x272 (full screen)", "480x272 16-bit stretched", STRETCHED_480X272 },
	{ "362x272 (4:3, centered)", "362x272 16-bit centered", CENTERED_362X272 },
	{0, 0, 0}
};


OSystem_PSP::OSystem_PSP() : _screenWidth(0), _screenHeight(0), _offscreen(0), _overlayBuffer(0), _overlayVisible(false), _shakePos(0), _mouseBuf(0), _prevButtons(0), _lastPadCheck(0), _padAccel(0) {

	memset(_palette, 0, sizeof(_palette));

	_samplesPerSec = 0;

	//init SDL
	uint32	sdlFlags = SDL_INIT_AUDIO | SDL_INIT_TIMER;
	SDL_Init(sdlFlags);

	sceDisplaySetMode(0, SCREEN_WIDTH, SCREEN_HEIGHT);
	sceDisplaySetFrameBuf((char *)DisplayBuffer, 512, 1, 1);
	sceDisplayWaitVblankStart();
}

OSystem_PSP::~OSystem_PSP() {
	if (_offscreen) free(_offscreen);
	if (_overlayBuffer) free(_overlayBuffer);
	if (_mouseBuf)	free(_mouseBuf);
}

bool OSystem_PSP::hasFeature(Feature f)
{
	return false;
}

void OSystem_PSP::setFeatureState(Feature f, bool enable)
{
}

bool OSystem_PSP::getFeatureState(Feature f)
{
	return false;
}

const OSystem::GraphicsMode* OSystem_PSP::getSupportedGraphicsModes() const
{
	return s_supportedGraphicsModes;
}


int OSystem_PSP::getDefaultGraphicsMode() const
{
	return -1;
}

bool OSystem_PSP::setGraphicsMode(int mode)
{
	return true;
}

bool OSystem_PSP::setGraphicsMode(const char *name)
{
	return true;
}

int OSystem_PSP::getGraphicsMode() const
{
	return -1;
}

void OSystem_PSP::initSize(uint width, uint height, int overlayScale) {
	_screenWidth = width;
	_screenHeight = height;
	_offscreen = (byte *)malloc(width * height);

	if(overlayScale == -1)
		overlayScale = 1;
	
	_overlayScale = overlayScale;
	_overlayBuffer = (OverlayColor *)malloc(width * overlayScale * height * overlayScale * sizeof(OverlayColor));
	bzero(_offscreen, width * height);
	bzero(_overlayBuffer, width * overlayScale * height * overlayScale);

	_mouseVisible = false;
}

int16 OSystem_PSP::getHeight() {
	return _screenHeight;
}

int16 OSystem_PSP::getWidth() {
	return _screenWidth;
}

void OSystem_PSP::setPalette(const byte *colors, uint start, uint num) {
	const byte *b = colors;

	for (uint i = 0; i < num; ++i) {
		_palette[start + i] = RGBToColour(b[0], b[1], b[2]);
		b += 4;
	}
}

void OSystem_PSP::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) {
	//Clip the coordinates
	if (x < 0) {
		w += x;
		buf -= x;
		x = 0;
	}

	if (y < 0) {
		h += y;
		buf -= y * pitch;
		y = 0;
	}

	if (w > _screenWidth - x) {
		w = _screenWidth - x;
	}

	if (h > _screenHeight - y) {
		h = _screenHeight - y;
	}

	if (w <= 0 || h <= 0)
		return;
	
	
	byte *dst = _offscreen + y * _screenWidth + x;
	if (_screenWidth == pitch && pitch == w) {
		memcpy(dst, buf, h * w);
	} else {
		do {
			memcpy(dst, buf, w);
			buf += pitch;
			dst += _screenWidth;
		} while (--h);
	}
}

void OSystem_PSP::updateScreen() {
	unsigned short *temp;

	uint xStart = (SCREEN_WIDTH >> 1) - (_screenWidth >> 1);
	uint yStart = (SCREEN_HEIGHT >> 1) - (_screenHeight >> 1);
	
	for (int i = 0; i < _screenHeight; ++i) {
		for (int j = 0; j < _screenWidth; ++j) {
			putPixel(xStart + j, yStart + i, _palette[_offscreen[i * _screenWidth +j]]);
		}
	}

	if(_overlayVisible) {
		for (int i = 0; i < _screenHeight * _overlayScale; ++i) {
			for (int j = 0; j < _screenWidth * _overlayScale; ++j) {

				OverlayColor pixel = _overlayBuffer[(i * _screenWidth +j)];

				if(pixel & 0x8000)
					putPixel(xStart + j, yStart + i, pixel);
			}
		}
	}

	//draw mouse on top
	if (_mouseVisible) {
		for (int y = 0; y < _mouseHeight; ++y) {
			for (int x = 0; x < _mouseWidth; ++x) {
				if (_mouseBuf[y * _mouseHeight + x] != _mouseKeyColour) {
					int my = _mouseY + y; // + _mouseHotspotY;
					int mx = _mouseX + x; // + _mouseHotspotX;

					if (mx >= 0 && mx < _screenWidth && my >= 0 && my < _screenHeight)
						putPixel(xStart + mx, yStart + my, _palette[_mouseBuf[y * _mouseHeight + x]]);
				}
			}
		}
	}


	// switch buffers
	temp = DrawBuffer;
	DrawBuffer = DisplayBuffer;
	DisplayBuffer = temp;
	sceDisplayWaitVblankStart();
	sceDisplaySetFrameBuf((char *)DisplayBuffer, 512, 1, 1);

}

void OSystem_PSP::setShakePos(int shakeOffset) {
	_shakePos = shakeOffset;
}

void OSystem_PSP::showOverlay ()
{
	_overlayVisible = true;
}

void OSystem_PSP::hideOverlay ()
{
	PSPDebugTrace("OSystem_PSP::hideOverlay called\n");
	_overlayVisible = false;
}

void OSystem_PSP::clearOverlay ()
{
	PSPDebugTrace("clearOverlay\n");
	bzero(_overlayBuffer, _screenWidth * _overlayScale * _screenHeight * _overlayScale * sizeof(OverlayColor));
}

void OSystem_PSP::grabOverlay (OverlayColor *buf, int pitch)
{
}

void OSystem_PSP::copyRectToOverlay (const OverlayColor *buf, int pitch, int x, int y, int w, int h)
{
	PSPDebugTrace("copyRectToOverlay\n");
	
	//Clip the coordinates
	if (x < 0) {
		w += x;
		buf -= x;
		x = 0;
	}

	if (y < 0) {
		h += y;
		buf -= y * pitch;
		y = 0;
	}

	if (w > _screenWidth*_overlayScale - x) {
		w = _screenWidth*_overlayScale - x;
	}

	if (h > _screenHeight*_overlayScale - y) {
		h = _screenHeight*_overlayScale - y;
	}

	if (w <= 0 || h <= 0)
		return;

	
	OverlayColor *dst = _overlayBuffer +( y * _screenWidth * _overlayScale + x);
	if (_screenWidth == pitch && pitch == w) {
		memcpy(dst, buf, h * _overlayScale * w * _overlayScale * sizeof(OverlayColor));
	} else {
		do {
			memcpy(dst, buf, w * _overlayScale * sizeof(OverlayColor));
			buf += pitch;
			dst += _screenWidth * _overlayScale;
		} while (--h);
	}
}

int16 OSystem_PSP::getOverlayHeight()
{
	return getHeight() * _overlayScale;
}

int16 OSystem_PSP::getOverlayWidth()
{
	return getWidth() * _overlayScale;
}

OverlayColor OSystem_PSP::RGBToColor(uint8 r, uint8 g, uint8 b)
{
	return (((r >> 3) & 0x1F) | (((g >> 3) & 0x1F) << 5) | (((b >> 3) & 0x1F) << 10 ) ) | 0x8000;
}

void OSystem_PSP::colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b)
{
		r = ((color & 0x1F) << 3);
		g = (((color >> 5) & 0x1F) << 3);
		b = (((color >> 10) & 0x1F) << 3);
}
	
OverlayColor OSystem_PSP::ARGBToColor(uint8 a, uint8 r, uint8 g, uint8 b) 
{
	OverlayColor color = RGBToColor(r, g, b);

	if(a == 255)
		color |= 0x8000;

	return color;
}

void OSystem_PSP::colorToARGB(OverlayColor color, uint8 &a, uint8 &r, uint8 &g, uint8 &b) 
{
		colorToRGB(color, r, g, b);
		if(color & 0x8000)
			a = 255;
		else
			a = 0;
}

void OSystem_PSP::grabPalette(byte *colors, uint start, uint num)
{
	uint i;
	uint16 color;

	for(i=start; i < start+num; i++)
	{
		color = _palette[i];
		*colors++ = ((color & 0x1F) << 3);
		*colors++ = (((color >> 5) & 0x1F) << 3);
		*colors++ = (((color >> 10) & 0x1F) << 3);
		*colors++ = (color & 0x8000 ? 255 : 0); 
	}
}

bool OSystem_PSP::showMouse(bool visible) { 
	bool last = _mouseVisible;
	_mouseVisible = visible;
	return last;
}

void OSystem_PSP::warpMouse(int x, int y) {
	//assert(x > 0 && x < _screenWidth);
	//assert(y > 0 && y < _screenHeight);
	_mouseX = x;
	_mouseY = y;
}

void OSystem_PSP::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int cursorTargetScale) {
	//TODO: handle cursorTargetScale
	_mouseWidth = w;
	_mouseHeight = h;

	_mouseHotspotX = hotspotX;
	_mouseHotspotY = hotspotY;

	_mouseKeyColour = keycolor;

	if (_mouseBuf)
		free(_mouseBuf);

	_mouseBuf = (byte *)malloc(w * h);
	memcpy(_mouseBuf, buf, w * h);
}

#define PAD_CHECK_TIME	40
#define PAD_DIR_MASK	(PSP_CTRL_UP | PSP_CTRL_DOWN | PSP_CTRL_LEFT | PSP_CTRL_RIGHT)

bool OSystem_PSP::pollEvent(Event &event) {
	s8 analogStepAmountX = 0;
	s8 analogStepAmountY = 0;
/*	
	SceCtrlData pad;

	sceCtrlSetSamplingCycle(0);
	sceCtrlSetSamplingMode(1);
	sceCtrlReadBufferPositive(&pad, 1);
*/
	uint32 buttonsChanged = pad.Buttons ^ _prevButtons;

	/* check if user exited using the Home button */
	if (g_quit) {
		g_quit = false; //set g_quit back to false or else pollEvent keeps looping..

		warning("g_quit signal caught, sending EVENT_QUIT to VM engine");
		event.type = OSystem::EVENT_QUIT;
		return true;
	}
	
	if (buttonsChanged & (PSP_CTRL_CROSS | PSP_CTRL_CIRCLE | PSP_CTRL_LTRIGGER | PSP_CTRL_RTRIGGER | PSP_CTRL_START | PSP_CTRL_SELECT | PSP_CTRL_SQUARE)) {
		if (buttonsChanged & PSP_CTRL_CROSS) {
			event.type = (pad.Buttons & PSP_CTRL_CROSS) ? OSystem::EVENT_LBUTTONDOWN : OSystem::EVENT_LBUTTONUP;
		}
		else if (buttonsChanged & PSP_CTRL_CIRCLE) {
			event.type = (pad.Buttons & PSP_CTRL_CIRCLE) ? OSystem::EVENT_RBUTTONDOWN : OSystem::EVENT_RBUTTONUP;
		}
		else {
			//any of the other buttons.
			event.type = buttonsChanged & pad.Buttons ? OSystem::EVENT_KEYDOWN : OSystem::EVENT_KEYUP;
			event.kbd.flags = 0;
			
			if (buttonsChanged & PSP_CTRL_LTRIGGER) {
				event.kbd.keycode = SDLK_ESCAPE;
				event.kbd.ascii = 27;
			} else if (buttonsChanged & PSP_CTRL_RTRIGGER) {
				event.kbd.keycode = SDLK_RETURN;
				event.kbd.ascii = 13;
			} else if (buttonsChanged & PSP_CTRL_START) {
				event.kbd.keycode = SDLK_F5;
				event.kbd.ascii = 319;
/*			} else if (buttonsChanged & PSP_CTRL_SELECT) {
				event.kbd.keycode = SDLK_0;
				event.kbd.ascii = '0';
*/			} else if (buttonsChanged & PSP_CTRL_SQUARE) {
				event.kbd.keycode = SDLK_PERIOD;
				event.kbd.ascii = '.';
			}
			
		}
			
		event.mouse.x = _mouseX;
		event.mouse.y = _mouseY;
		_prevButtons = pad.Buttons;
		return true;
	}
	
	uint32 time = getMillis();
	if (time - _lastPadCheck > PAD_CHECK_TIME) {
		_lastPadCheck = time;
		int16 newX = _mouseX;
		int16 newY = _mouseY;
	
		if (pad.Lx < 100) {
			analogStepAmountX = pad.Lx - 100;
		}
		else if (pad.Lx > 155) {
			analogStepAmountX = pad.Lx - 155;
		}
		
		if (pad.Ly < 100) {
			analogStepAmountY = pad.Ly - 100;
		}
		else if (pad.Ly > 155) {
			analogStepAmountY = pad.Ly - 155;
		}
	
		if (pad.Buttons & PAD_DIR_MASK ||
		    analogStepAmountX != 0 || analogStepAmountY != 0) {
			if (_prevButtons & PAD_DIR_MASK) {
				if (_padAccel < 16) _padAccel++;
			} else _padAccel = 0;

			_prevButtons = pad.Buttons;

			if (pad.Buttons & PSP_CTRL_LEFT)
				newX -= _padAccel >> 2;
			if (pad.Buttons & PSP_CTRL_RIGHT)
				newX += _padAccel >> 2;
			if (pad.Buttons & PSP_CTRL_UP)
				newY -= _padAccel >> 2;
			if (pad.Buttons & PSP_CTRL_DOWN)
				newY += _padAccel >> 2;

			// If no movement then this has no effect	
			if (pad.Buttons & PSP_CTRL_TRIANGLE) {
				// Fine control mode for analog
					if (analogStepAmountX != 0)
						if (analogStepAmountX > 0)
							newX += analogStepAmountX - (analogStepAmountX - 1);
						else
							newX -= -analogStepAmountX - (-analogStepAmountX - 1);
						
					if (analogStepAmountY != 0)
						if (analogStepAmountY > 0)
							newY += analogStepAmountY - (analogStepAmountY - 1);
						else
							newY -= -analogStepAmountY - (-analogStepAmountY - 1);
			}
			else {
				newX += analogStepAmountX >> ((_screenWidth == 640 || (_overlayVisible && _overlayScale > 1)) ? 2 : 3);
				newY += analogStepAmountY >> ((_screenWidth == 640 || (_overlayVisible && _overlayScale > 1)) ? 2 : 3);
			}

			if (newX < 0) newX = 0;
			if (newY < 0) newY = 0;
			if(_overlayVisible)
			{
				if (newX >= _screenWidth*_overlayScale) newX = _screenWidth*_overlayScale - 1;
				if (newY >= _screenHeight*_overlayScale) newY = _screenHeight*_overlayScale - 1;		
			}
			else
			{
				if (newX >= _screenWidth) newX = _screenWidth - 1;
				if (newY >= _screenHeight) newY = _screenHeight - 1;		
			}
			
			if ((_mouseX != newX) || (_mouseY != newY)) {
				event.type = OSystem::EVENT_MOUSEMOVE;
				event.mouse.x = _mouseX = newX;
				event.mouse.y = _mouseY = newY;
				return true;
			}
		} else { 
			//reset pad acceleration
			_padAccel = 0;
		}
	}

	return false;
}

uint32 OSystem_PSP::getMillis() {
	return SDL_GetTicks();
}

void OSystem_PSP::delayMillis(uint msecs) {	
	sceKernelDelayThread(1);        // Sleep thread for 1 millionth of a second to allow callback threads to run
	SDL_Delay(msecs);
}

void OSystem_PSP::setTimerCallback(TimerProc callback, int interval) {
	SDL_SetTimer(interval, (SDL_TimerCallback)callback);
}

OSystem::MutexRef OSystem_PSP::createMutex(void) {
	return (MutexRef)SDL_CreateMutex();
}

void OSystem_PSP::lockMutex(MutexRef mutex) {
	SDL_mutexP((SDL_mutex *)mutex);
}

void OSystem_PSP::unlockMutex(MutexRef mutex) {
	SDL_mutexV((SDL_mutex *)mutex);
}

void OSystem_PSP::deleteMutex(MutexRef mutex) {
	SDL_DestroyMutex((SDL_mutex *)mutex);
}

bool OSystem_PSP::setSoundCallback(SoundProc proc, void *param) {
	SDL_AudioSpec desired;
	SDL_AudioSpec obtained;

	memset(&desired, 0, sizeof(desired));

	if (ConfMan.hasKey("output_rate"))
		_samplesPerSec = ConfMan.getInt("output_rate");
	else
		_samplesPerSec = SAMPLES_PER_SEC;

	// Originally, we always used 2048 samples. This loop will produce the
	// same result at 22050 Hz, and should hopefully produce something
	// sensible for other frequencies. Note that it must be a power of two.

	uint16 samples = 0x8000;

	for (;;) {
		if (samples / (_samplesPerSec / 1000) < 100)
			break;
		samples >>= 1;
	}

	desired.freq = _samplesPerSec;
	desired.format = AUDIO_S16SYS;
	desired.channels = 2;
	desired.samples = samples;
	desired.callback = proc;
	desired.userdata = param;
	if (SDL_OpenAudio(&desired, &obtained) != 0) {
		return false;
	}
	// Note: This should be the obtained output rate, but it seems that at
	// least on some platforms SDL will lie and claim it did get the rate
	// even if it didn't. Probably only happens for "weird" rates, though.
	_samplesPerSec = obtained.freq;
	SDL_PauseAudio(0);
	return true;
}

void OSystem_PSP::clearSoundCallback() {
	SDL_CloseAudio();
}

int OSystem_PSP::getOutputSampleRate() const {
	return _samplesPerSec; 
}

bool OSystem_PSP::openCD(int drive) {
	return false;
}

bool OSystem_PSP::pollCD() {
	return false;
}

void OSystem_PSP::playCD(int track, int num_loops, int start_frame, int duration) {
}

void OSystem_PSP::stopCD() {
}

void OSystem_PSP::updateCD() {
}

void OSystem_PSP::quit() {
	clearSoundCallback();
	SDL_Quit();
	sceGuTerm();
	sceKernelExitGame();
}

void OSystem_PSP::setWindowCaption(const char *caption) {
}

void OSystem_PSP::displayMessageOnOSD(const char *msg) {
}


/* moved to psp-gu.cpp */
/*
OSystem *OSystem_PSP_create() {
	return new OSystem_PSP();
}
*/
// Correct pixel format ABBBBBGGGGGRRRRR
int gBitFormat = 1555;


--- NEW FILE: osys_psp.h ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/psp/osys_psp.h,v 1.1 2005/08/16 17:15:36 joostp Exp $
 *
 */

#include "common/stdafx.h"
#include "common/scummsys.h"
#include "common/system.h"
#include "backends/intern.h"

#include <SDL.h>

enum GraphicModeID {
	CENTERED_320X200,
	CENTERED_435X272,
	STRETCHED_480X272,
	CENTERED_362X272
};

class OSystem_PSP : public OSystem {
public:
	static const OSystem::GraphicsMode s_supportedGraphicsModes[];
	static OSystem *instance();

protected:
	uint16	_screenWidth;
	uint16	_screenHeight;
	uint16	_overlayScale;
	byte	*_offscreen;
	OverlayColor  *_overlayBuffer;
	uint16  _palette[256];
	bool	_overlayVisible;
	uint32	_shakePos;
	
	
	bool	_mouseVisible;
	int	_mouseX, _mouseY;
	int	_mouseWidth, _mouseHeight;
	int	_mouseHotspotX, _mouseHotspotY;
	byte	_mouseKeyColour;
	byte	*_mouseBuf;

	uint32	_prevButtons;
	uint32	_lastPadCheck;
	uint32	_padAccel;
	
	uint32		_samplesPerSec;
	SceCtrlData pad;
	
public:

	OSystem_PSP();
	virtual ~OSystem_PSP();

	virtual bool hasFeature(Feature f);
	virtual void setFeatureState(Feature f, bool enable);
	virtual bool getFeatureState(Feature f);
	virtual const GraphicsMode *getSupportedGraphicsModes() const;
	virtual int getDefaultGraphicsMode() const;
	virtual bool setGraphicsMode(int mode);
	bool setGraphicsMode(const char *name);
	virtual int getGraphicsMode() const;
	virtual void initSize(uint width, uint height, int overlayScale);
	virtual int16 getHeight();
	virtual int16 getWidth();
	virtual void setPalette(const byte *colors, uint start, uint num);
	virtual void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h);
	virtual void updateScreen();
	virtual void setShakePos(int shakeOffset);

	virtual void showOverlay();
	virtual void hideOverlay();
	virtual void clearOverlay();
	virtual void grabOverlay(OverlayColor *buf, int pitch);
	virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h);
	virtual int16 getOverlayHeight();
	virtual int16 getOverlayWidth();
	virtual OverlayColor RGBToColor(uint8 r, uint8 g, uint8 b);
	virtual void colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b);
	virtual OverlayColor ARGBToColor(uint8 a, uint8 r, uint8 g, uint8 b);
	virtual void colorToARGB(OverlayColor color, uint8 &a, uint8 &r, uint8 &g, uint8 &b);
	virtual void grabPalette(byte *colors, uint start, uint num);
	
	virtual bool showMouse(bool visible);

	virtual void warpMouse(int x, int y);
	virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor = 255, int cursorTargetScale = 1);

	virtual bool pollEvent(Event &event);
	virtual uint32 getMillis();
	virtual void delayMillis(uint msecs);

	virtual void setTimerCallback(TimerProc callback, int interval);

	virtual MutexRef createMutex(void);
	virtual void lockMutex(MutexRef mutex);
	virtual void unlockMutex(MutexRef mutex);
	virtual void deleteMutex(MutexRef mutex);

	virtual bool setSoundCallback(SoundProc proc, void *param);
	virtual void clearSoundCallback();
	virtual int getOutputSampleRate() const;

	virtual bool openCD(int drive);
	virtual bool pollCD();

	virtual void playCD(int track, int num_loops, int start_frame, int duration);
	virtual void stopCD();
	virtual void updateCD();

	virtual void quit();

	virtual void setWindowCaption(const char *caption);

	virtual void displayMessageOnOSD(const char *msg);

};


--- NEW FILE: osys_psp_gu.cpp ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/psp/osys_psp_gu.cpp,v 1.1 2005/08/16 17:15:36 joostp Exp $
 */

#include <zlib.h>
#include "osys_psp_gu.h"
#include "./trace.h"

#define PIXEL_SIZE (4)
#define BUF_WIDTH (512)
#define	PSP_SCREEN_WIDTH	480
#define	PSP_SCREEN_HEIGHT	272
#define PSP_FRAME_SIZE (BUF_WIDTH * PSP_SCREEN_HEIGHT * PIXEL_SIZE)
#define MOUSE_SIZE	128	
#define	KBD_DATA_SIZE	130560

unsigned int __attribute__((aligned(16))) list[262144];
unsigned short __attribute__((aligned(16))) clut256[256];
unsigned short __attribute__((aligned(16))) mouseClut[256];
unsigned short __attribute__((aligned(16))) kbClut[256];
//unsigned int __attribute__((aligned(16))) offscreen256[640*480];
//unsigned int __attribute__((aligned(16))) overlayBuffer256[640*480*2];
unsigned int __attribute__((aligned(16))) mouseBuf256[MOUSE_SIZE*MOUSE_SIZE];

extern unsigned long RGBToColour(unsigned long r, unsigned long g, unsigned long b);

extern unsigned int  size_keyboard_symbols_compressed;
extern unsigned char keyboard_symbols_compressed[];
extern unsigned int  size_keyboard_symbols_shift_compressed;
extern unsigned char keyboard_symbols_shift_compressed[];
extern unsigned int  size_keyboard_letters_compressed;
extern unsigned char keyboard_letters_compressed[];
extern unsigned int  size_keyboard_letters_shift_compressed;
extern unsigned char keyboard_letters_shift_compressed[];
unsigned char *keyboard_symbols;
unsigned char *keyboard_symbols_shift;
unsigned char *keyboard_letters;
unsigned char *keyboard_letters_shift;

unsigned char kbd_ascii[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '[', ']', '\\', ';', '\'', ',', '.', '/', '`'};
unsigned int  kbd_code[] = {SDLK_1, SDLK_2, SDLK_3, SDLK_4, SDLK_5, SDLK_6, SDLK_7, SDLK_8, SDLK_9, SDLK_0, SDLK_MINUS, SDLK_EQUALS, SDLK_LEFTBRACKET, SDLK_RIGHTBRACKET,
							SDLK_BACKSLASH, SDLK_SEMICOLON, SDLK_QUOTE, SDLK_COMMA, SDLK_PERIOD, SDLK_SLASH, SDLK_BACKQUOTE};
unsigned char kbd_ascii_cl[] = {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '{', '}', '|', ':', '"', '<', '>', '?', '~'};
unsigned int  kbd_code_cl[]  = {SDLK_EXCLAIM, SDLK_AT, SDLK_HASH, SDLK_DOLLAR, 37, SDLK_CARET, SDLK_AMPERSAND, SDLK_ASTERISK, SDLK_LEFTPAREN, SDLK_RIGHTPAREN, SDLK_UNDERSCORE,
								SDLK_PLUS, 123, 125, 124, SDLK_COLON, SDLK_QUOTEDBL, SDLK_LESS, SDLK_GREATER, SDLK_QUESTION, 126};
#define CAPS_LOCK	(1 << 0)
#define SYMBOLS 	(1 << 1)

extern bool g_quit;

OSystem_PSP_GU::OSystem_PSP_GU() {
	//sceKernelDcacheWritebackAll();

	// setup
	sceGuInit();
	sceGuStart(0, list);
	sceGuDrawBuffer(GU_PSM_8888, (void *)0, BUF_WIDTH);
	sceGuDispBuffer(PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT, (void*)PSP_FRAME_SIZE, BUF_WIDTH);
	sceGuDepthBuffer((void*)(PSP_FRAME_SIZE * 2), BUF_WIDTH);
	sceGuOffset(2048 - (PSP_SCREEN_WIDTH/2), 2048 - (PSP_SCREEN_HEIGHT/2));
	sceGuViewport(2048, 2048, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
	sceGuDepthRange(0xc350, 0x2710);
	sceGuScissor(0, 0, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
	sceGuEnable(GU_SCISSOR_TEST);
	sceGuFrontFace(GU_CW);
	sceGuEnable(GU_TEXTURE_2D);
	sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT);
	sceGuFinish();
	sceGuSync(0,0);

	sceDisplayWaitVblankStart();
	sceGuDisplay(1); 

	//decompress keyboard data
	uLongf kbdSize = KBD_DATA_SIZE;
	keyboard_letters = (unsigned char *)memalign(16, KBD_DATA_SIZE);
	assert(Z_OK == uncompress((Bytef *)keyboard_letters, &kbdSize, (const Bytef *)keyboard_letters_compressed, size_keyboard_letters_compressed));
	 uncompress((Bytef *)keyboard_letters, &kbdSize, (const Bytef *)keyboard_letters_compressed, size_keyboard_letters_compressed);
	
	 kbdSize = KBD_DATA_SIZE;
	keyboard_letters_shift = (unsigned char *)memalign(16, KBD_DATA_SIZE);
	assert(Z_OK == uncompress((Bytef *)keyboard_letters_shift, &kbdSize, (const Bytef *)keyboard_letters_shift_compressed, size_keyboard_letters_shift_compressed));
	
	kbdSize = KBD_DATA_SIZE;
	keyboard_symbols = (unsigned char *)memalign(16, KBD_DATA_SIZE);
	assert(Z_OK == uncompress((Bytef *)keyboard_symbols, &kbdSize, (const Bytef *)keyboard_symbols_compressed, size_keyboard_symbols_compressed));

	kbdSize = KBD_DATA_SIZE;
	keyboard_symbols_shift = (unsigned char *)memalign(16, KBD_DATA_SIZE);
	assert(Z_OK == uncompress((Bytef *)keyboard_symbols_shift, &kbdSize, (const Bytef *)keyboard_symbols_shift_compressed, size_keyboard_symbols_shift_compressed));
	
	_keyboardVisible = false;
	_clut = (unsigned short*)(((unsigned int)clut256)|0x40000000);
	_kbdClut = (unsigned short*)(((unsigned int)kbClut)|0x40000000);
	_mouseBuf = (byte *)mouseBuf256;
	_graphicMode = STRETCHED_480X272;
	_keySelected = 1;
	_keyboardMode = 0;
	//_graphicMode = CENTERED_435X272;
	//_graphicMode = CENTERED_320X200;
	//_graphicMode = CENTERED_362X272;
}

OSystem_PSP_GU::~OSystem_PSP_GU()
{
	free(keyboard_symbols_shift);
	free(keyboard_symbols);
	free(keyboard_letters_shift);
	free(keyboard_letters);
	
	_offscreen = 0;
	_overlayBuffer = 0;
	_mouseBuf = 0;
	 sceGuTerm();
}

void OSystem_PSP_GU::initSize(uint width, uint height, int overlayScale) {
	PSPDebugTrace("initSize\n");
	_screenWidth = width;
	_screenHeight = height;
//	_offscreen = (byte *)offscreen256;
	_overlayBuffer = (OverlayColor *)0x44000000 + PSP_FRAME_SIZE;

	if(overlayScale == -1 || width == 640)
		overlayScale = 1;
	
	_overlayScale = overlayScale;
	_offscreen = (unsigned byte *)_overlayBuffer+_screenWidth*_screenHeight*_overlayScale*_overlayScale*sizeof(OverlayColor);
	bzero(_offscreen, width * height);
	bzero(_overlayBuffer, width * overlayScale * height * overlayScale);
	_kbdClut[0] = 0xffff;
	_kbdClut[246] = 0x4ccc;
	_kbdClut[247] = 0x0000;
	for(int i=1;i<31;i++)
		_kbdClut[i] = 0xf888;
	_mouseVisible = false;
	sceKernelDcacheWritebackAll();
}

int OSystem_PSP_GU::getDefaultGraphicsMode() const
{
	return STRETCHED_480X272;
}

bool OSystem_PSP_GU::setGraphicsMode(int mode)
{
	_graphicMode = mode;
	return true;
}

bool OSystem_PSP_GU::setGraphicsMode(const char *name)
{
	int i = 0;

	while(s_supportedGraphicsModes[i].name)
	{
		if(!strcmpi(s_supportedGraphicsModes[i].name, name))
		{
			_graphicMode = s_supportedGraphicsModes[i].id;
			return true;
		}
		i++;
	}

	return false;
}

int OSystem_PSP_GU::getGraphicsMode() const
{
	return _graphicMode;
}

void OSystem_PSP_GU::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int cursorTargetScale) {
	//TODO: handle cursorTargetScale
	_mouseWidth = w;
	_mouseHeight = h;

	_mouseHotspotX = hotspotX;
	_mouseHotspotY = hotspotY;

	_mouseKeyColour = keycolor;

	memcpy(mouseClut, _palette, 256*sizeof(unsigned short));
	mouseClut[_mouseKeyColour] = 0;
	sceKernelDcacheWritebackAll();
	
	for(unsigned int i=0;i<h;i++)
		memcpy(_mouseBuf+i*MOUSE_SIZE, buf+i*w, w);
}

void OSystem_PSP_GU::setPalette(const byte *colors, uint start, uint num) {
	const byte *b = colors;

	for (uint i = 0; i < num; ++i) {
		_palette[start + i] = RGBToColour(b[0], b[1], b[2]);
		b += 4;
	}

	//copy to CLUT
	memcpy(_clut, _palette, 256*sizeof(unsigned short));
	
	//force update of mouse CLUT as well, as it may have been set up before this palette was set
	memcpy(mouseClut, _palette, 256*sizeof(unsigned short));
	mouseClut[_mouseKeyColour] = 0;
		
	sceKernelDcacheWritebackAll();
}


void OSystem_PSP_GU::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) 
{
	byte *dst = _offscreen + y * _screenWidth + x;

	if (_screenWidth == pitch && pitch == w) 
	{
		memcpy(dst, buf, h * w);
/*
		sceGuStart(0,list);
		sceGuCopyImage( 3, 0, 0, w/2, h, w/2, (void *)buf, x/2, y, _screenWidth /2, _offscreen);
		sceGuFinish();
		sceGuSync(0,0);
*/
	}
	 else 
	{
		do 
		{
			memcpy(dst, buf, w);
			buf += pitch;
			dst += _screenWidth;
		} while (--h);
	}
}

void
OSystem_PSP_GU::updateScreen()
{
	float scale;

	sceGuStart(0,list);
	
	sceGuClearColor(0xff000000);
	sceGuClear(GU_COLOR_BUFFER_BIT);

	sceGuClutMode(GU_PSM_5551, 0, 0xff, 0);
	sceGuClutLoad(32, clut256); // upload 32*8 entries (256)
	sceGuTexMode(GU_PSM_T8, 0, 0, 0); // 8-bit image
	if(_screenWidth == 320)
	    	sceGuTexImage(0, 512, 256, _screenWidth, _offscreen);
	else
	    	sceGuTexImage(0, 512, 512, _screenWidth, _offscreen);
	sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGB); 
	sceGuTexFilter(GU_LINEAR, GU_LINEAR);
	sceGuTexOffset(0,0);
	sceGuAmbientColor(0xffffffff);
	sceGuColor(0xffffffff);

	struct Vertex* vertices = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
	vertices[0].u = 0.5; vertices[0].v = 0.5;
	vertices[1].u = _screenWidth-0.5; vertices[1].v = _screenHeight-0.5;
	switch(_graphicMode)
	{
		case CENTERED_320X200:
			vertices[0].x = (PSP_SCREEN_WIDTH-320)/2; vertices[0].y = (PSP_SCREEN_HEIGHT-200)/2; vertices[0].z = 0;
			vertices[1].x = PSP_SCREEN_WIDTH-(PSP_SCREEN_WIDTH-320)/2; vertices[1].y = PSP_SCREEN_HEIGHT-(PSP_SCREEN_HEIGHT-200)/2; vertices[1].z = 0;
		break;
		case CENTERED_435X272:
			vertices[0].x = (PSP_SCREEN_WIDTH-435)/2; vertices[0].y = 0; vertices[0].z = 0;
			vertices[1].x = PSP_SCREEN_WIDTH-(PSP_SCREEN_WIDTH-435)/2; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
		break;
		case STRETCHED_480X272:
			vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
			vertices[1].x = PSP_SCREEN_WIDTH; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
		break;
		case CENTERED_362X272:
			vertices[0].x = (PSP_SCREEN_WIDTH-362)/2; vertices[0].y = 0; vertices[0].z = 0;
			vertices[1].x = PSP_SCREEN_WIDTH-(PSP_SCREEN_WIDTH-362)/2; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
		break;
	}

	if (_shakePos) {
		vertices[0].y += _shakePos;
		vertices[1].y += _shakePos;
	}

	sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
	if(_screenWidth==640)
	{
		sceGuTexImage(0, 512, 512, _screenWidth, _offscreen+512);
		vertices[0].u = 512 + 0.5; vertices[1].v = _screenHeight  - 0.5;
		vertices[0].x += (vertices[1].x-vertices[0].x)*511/640; vertices[0].y = 0; vertices[0].z = 0;
		sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
	}
			
	
	// draw overlay
	if(_overlayVisible)
	{
		vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
		vertices[1].x = PSP_SCREEN_WIDTH; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
		vertices[0].u = 0.5; vertices[0].v = 0.5;
		vertices[1].u = _screenWidth*_overlayScale-0.5; vertices[1].v = _screenHeight*_overlayScale-0.5;
		sceGuTexMode(GU_PSM_5551, 0, 0, 0); // 16-bit image
		sceGuAlphaFunc(GU_GREATER,0,0xff);
		sceGuEnable(GU_ALPHA_TEST);
		if(_overlayScale==2 || _screenWidth == 640)
			sceGuTexImage(0, 512, 512, _screenWidth*_overlayScale, _overlayBuffer);
		else
			sceGuTexImage(0, 512, 256, _screenWidth*_overlayScale, _overlayBuffer);
		sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA); 
		sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
		// need to render twice for textures > 512
		if(_overlayScale==2 || _screenWidth == 640)
		{
			sceGuTexImage(0, 512, 512, _screenWidth*_overlayScale, _overlayBuffer+512);
			vertices[0].u = 512 + 0.5; vertices[1].v = _screenHeight * _overlayScale - 0.5;
			vertices[0].x = PSP_SCREEN_WIDTH*512/640; vertices[0].y = 0; vertices[0].z = 0;
			sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
		}
			
	}
	
	// draw mouse
   	if (_mouseVisible) 
	{
		sceGuTexMode(GU_PSM_T8, 0, 0, 0); // 8-bit image
		sceGuClutMode(GU_PSM_5551, 0, 0xff, 0);
		sceGuClutLoad(32, mouseClut); // upload 32*8 entries (256)
		sceGuAlphaFunc(GU_GREATER,0,0xff);
		sceGuEnable(GU_ALPHA_TEST);
		sceGuTexImage(0, MOUSE_SIZE, MOUSE_SIZE, MOUSE_SIZE, _mouseBuf);
		sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA); 
		
		vertices[0].u = 0.5; vertices[0].v = 0.5;
		vertices[1].u = _mouseWidth-0.5; vertices[1].v = _mouseHeight-0.5;

		//adjust cursor position
		int mX = _mouseX - _mouseHotspotX;
		int mY = _mouseY - _mouseHotspotY;
		
		if(_overlayVisible)
		{
			float scalex, scaley;

			scalex = (float)PSP_SCREEN_WIDTH/(_screenWidth*_overlayScale);
			scaley = (float)PSP_SCREEN_HEIGHT/(_screenHeight*_overlayScale);

			vertices[0].x = mX*scalex; vertices[0].y = mY*scaley; vertices[0].z = 0;
			vertices[1].x = vertices[0].x+_mouseWidth*scalex; vertices[1].y = vertices[0].y + _mouseHeight*scaley; vertices[0].z = 0;
		}
		else
		switch(_graphicMode)
		{
			case CENTERED_320X200:
				vertices[0].x = (PSP_SCREEN_WIDTH-320)/2+mX; vertices[0].y = (PSP_SCREEN_HEIGHT-200)/2+mY; vertices[0].z = 0;
				vertices[1].x = vertices[0].x+_mouseWidth; vertices[1].y = vertices[0].y + _mouseHeight; vertices[1].z = 0;
			break;
			case CENTERED_435X272:
			{
				scale = 435.0f/_screenWidth;
				vertices[0].x = (PSP_SCREEN_WIDTH-435)/2 +mX*scale; vertices[0].y = mY*scale; vertices[0].z = 0;
				vertices[1].x = vertices[0].x+_mouseWidth*scale; vertices[1].y = vertices[0].y + _mouseHeight*scale; vertices[0].z = 0;
			}
			break;
			case CENTERED_362X272:
			{
				float scalex, scaley;
				
				scalex = 362.0f/_screenWidth;
				scaley = 272.0f/_screenHeight;

				vertices[0].x = (PSP_SCREEN_WIDTH-362)/2 +mX*scalex; vertices[0].y = mY*scaley; vertices[0].z = 0;
				vertices[1].x = vertices[0].x+_mouseWidth*scalex; vertices[1].y = vertices[0].y + _mouseHeight*scaley; vertices[0].z = 0;
			}
			break;
			case STRETCHED_480X272:
			{
				float scalex, scaley;

				scalex = (float)PSP_SCREEN_WIDTH/_screenWidth;
				scaley = (float)PSP_SCREEN_HEIGHT/_screenHeight;
				
				vertices[0].x = mX*scalex; vertices[0].y = mY*scaley; vertices[0].z = 0;
				vertices[1].x = vertices[0].x+_mouseWidth*scalex; vertices[1].y = vertices[0].y + _mouseHeight*scaley; vertices[0].z = 0;
			}
			break;
		}
		sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
	}

	if(_keyboardVisible)
	{
		sceGuTexMode(GU_PSM_T8, 0, 0, 0); // 8-bit image
		sceGuClutMode(GU_PSM_4444, 0, 0xff, 0);
		sceGuClutLoad(32, kbClut); // upload 32*8 entries (256)
		sceGuDisable(GU_ALPHA_TEST);
		sceGuEnable(GU_BLEND);
		sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
		switch(_keyboardMode)
		{
			case 0:
				sceGuTexImage(0, 512, 512, 480, keyboard_letters);
				break;
			case CAPS_LOCK:
				sceGuTexImage(0, 512, 512, 480, keyboard_letters_shift);
				break;
			case SYMBOLS:
				sceGuTexImage(0, 512, 512, 480, keyboard_symbols);
				break;
			case (CAPS_LOCK | SYMBOLS):
				sceGuTexImage(0, 512, 512, 480, keyboard_symbols_shift);
				break;
		}
		sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA); 
		
		vertices[0].u = 0.5; vertices[0].v = 0.5;
		vertices[1].u = PSP_SCREEN_WIDTH-0.5; vertices[1].v = PSP_SCREEN_HEIGHT-0.5;
		vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
		vertices[1].x = PSP_SCREEN_WIDTH; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[0].z = 0;
		sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
		sceGuDisable(GU_BLEND);
	}
	sceKernelDcacheWritebackAll();
	
	sceGuFinish();
	sceGuSync(0,0);

	sceDisplayWaitVblankStart();
	sceGuSwapBuffers();

	//sceKernelDcacheWritebackAll();
}

bool OSystem_PSP_GU::pollEvent(Event &event) {
	float nub_angle = -1;
	int x, y;

	sceCtrlSetSamplingCycle(0);
	sceCtrlSetSamplingMode(1);
	sceCtrlReadBufferPositive(&pad, 1);

	uint32 buttonsChanged = pad.Buttons ^ _prevButtons;

	/* check if user exited using the Home button */
	if (g_quit) {
		g_quit = false; //set g_quit back to false or else pollEvent keeps looping..

		warning("g_quit signal caught, sending EVENT_QUIT to VM engine");
		event.type = OSystem::EVENT_QUIT;
		return true;
	}
	
	if  ((buttonsChanged & PSP_CTRL_SELECT) || (pad.Buttons & PSP_CTRL_SELECT)) 
	{
		if( !(pad.Buttons & PSP_CTRL_SELECT) )
			_keyboardVisible = !_keyboardVisible;
		_prevButtons = pad.Buttons;
		return false;
	}

	if(!_keyboardVisible)
		return OSystem_PSP::pollEvent(event);

	if ( (buttonsChanged & PSP_CTRL_RTRIGGER) && !(pad.Buttons & PSP_CTRL_RTRIGGER))
		_keyboardMode ^= CAPS_LOCK;

	if ( (buttonsChanged & PSP_CTRL_LTRIGGER) && !(pad.Buttons & PSP_CTRL_LTRIGGER))
		_keyboardMode ^= SYMBOLS;

	if ( (buttonsChanged & PSP_CTRL_LEFT) && !(pad.Buttons & PSP_CTRL_LEFT))
	{
		event.kbd.flags = 0;
		event.kbd.ascii = 0;
		event.kbd.keycode = SDLK_LEFT;
		_prevButtons = pad.Buttons;
		return true;
	}
	
	if ( (buttonsChanged & PSP_CTRL_RIGHT) && !(pad.Buttons & PSP_CTRL_RIGHT))
	{
		event.kbd.flags = 0;
		event.kbd.ascii = 0;
		event.kbd.keycode = SDLK_RIGHT;
		_prevButtons = pad.Buttons;
		return true;
	}
	
	if ( (buttonsChanged & PSP_CTRL_UP) && !(pad.Buttons & PSP_CTRL_UP))
	{
		event.kbd.flags = 0;
		event.kbd.ascii = 0;
		event.kbd.keycode = SDLK_UP;
		_prevButtons = pad.Buttons;
		return true;
	}
	
	if ( (buttonsChanged & PSP_CTRL_DOWN) && !(pad.Buttons & PSP_CTRL_DOWN))
	{
		event.kbd.flags = 0;
		event.kbd.ascii = 0;
		event.kbd.keycode = SDLK_DOWN;
		_prevButtons = pad.Buttons;
		return true;
	}
	
	// compute nub direction
	//
	x = pad.Lx-128;
	y = pad.Ly-128;
	_kbdClut[_keySelected] = 0xf888;
	if(x*x + y*y > 10000)
	{
		nub_angle = atan2(y, x);
		_keySelected = (int)(1+(M_PI+nub_angle)*30/(2*M_PI));
		_keySelected -= 2;
		if(_keySelected < 1)
			_keySelected += 30;
		_kbdClut[_keySelected] = 0xffff;
	
		if  (buttonsChanged & PSP_CTRL_CROSS) 
		{
			event.type = (pad.Buttons & PSP_CTRL_CROSS) ? OSystem::EVENT_KEYDOWN : OSystem::EVENT_KEYUP;
			if(_keySelected >26)
			{
				event.kbd.flags = 0;
				switch(_keySelected)
				{
					case 27:
					event.kbd.ascii = ' ';
					event.kbd.keycode = SDLK_SPACE;
					break;
					case 28:
					event.kbd.ascii = 127;
					event.kbd.keycode = SDLK_DELETE;
					break;
					case 29:
					event.kbd.ascii = 8;
					event.kbd.keycode = SDLK_BACKSPACE;
					break;
					case 30:
					event.kbd.ascii = 13;
					event.kbd.keycode = SDLK_RETURN;
					break;
				}
			}
			else
			{			
				switch( _keyboardMode)
				{
					case 0:
						event.kbd.flags = 0;
						event.kbd.ascii = 'a'+_keySelected-1;
						event.kbd.keycode = SDLK_a + _keySelected-1;
						break;
					case CAPS_LOCK:
						event.kbd.ascii = 'A'+_keySelected-1;
						event.kbd.keycode = SDLK_a + _keySelected-1;
						event.kbd.flags = KBD_SHIFT;
						break;
					case SYMBOLS:
						if(_keySelected < 21)
						{
							event.kbd.flags = 0;
							event.kbd.ascii = kbd_ascii[_keySelected-1];
							event.kbd.keycode = kbd_code[ _keySelected-1];
						}
						break;
					case (SYMBOLS|CAPS_LOCK):
						if(_keySelected < 21)
						{
							event.kbd.flags = 0;
							event.kbd.ascii = kbd_ascii_cl[_keySelected-1];
							event.kbd.keycode = kbd_code_cl[ _keySelected-1];
						}
						break;
				}
			}
			_prevButtons = pad.Buttons;
			return true;
		}
	}

	_prevButtons = pad.Buttons;
	return false;
}

OSystem *OSystem_PSP_create() {
	return new OSystem_PSP_GU();
}


--- NEW FILE: osys_psp_gu.h ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 *
 *
 */

#include <pspgu.h>
#include "common/stdafx.h"
#include "common/scummsys.h"

#include "common/rect.h"
#include "osys_psp.h"

#define min(a,b) (a > b ? b : a)

class OSystem_PSP_GU : public OSystem_PSP
{
public:
	struct Vertex
	{
		float u,v;
		float x,y,z;
	};

	OSystem_PSP_GU();
	~OSystem_PSP_GU();
	void updateScreen();
	void initSize(uint width, uint height, int overlayScale);
	int getDefaultGraphicsMode() const;
	bool setGraphicsMode(int mode);
	bool setGraphicsMode(const char *name);
	int getGraphicsMode() const;
	void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int cursorTargetScale);
	void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) ;
	void setPalette(const byte *colors, uint start, uint num);
	bool pollEvent(Event &event);
	int _graphicMode;
	struct Vertex *_vertices;
	unsigned short* _clut;
	unsigned short* _kbdClut;
	bool _keyboardVisible;
	int _keySelected;
	int _keyboardMode;
};


--- NEW FILE: portdefs.h ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/psp/portdefs.h,v 1.1 2005/08/16 17:15:36 joostp Exp $
 *
 */

#ifndef PORTDEFS_H
#define PORTDEFS_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <malloc.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <assert.h>

#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>

#include "trace.h"

#define	SCUMMVM_SAVEPATH	"ms0:/scummvm_savegames"

#define	BREAKPOINT	asm("break\n")


//#define printf  pspDebugScreenPrintf
#define exit(x) printf("exit() called\n"); sceKernelSleepThread();

#undef main

#ifndef REAL_MAIN
#define main scummvm_main
#endif

#endif /* PORTDEFS_H */



--- NEW FILE: psp_fs.cpp ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/psp/psp_fs.cpp,v 1.1 2005/08/16 17:15:36 joostp Exp $
 */

#ifdef __PSP__
#include "base/engine.h"

#include "backends/fs/fs.h"
#include <stdio.h>
#include <stdlib.h>

/*
 * Implementation of the ScummVM file system API based on PSPSDK API.
 */

class PSPFilesystemNode : public AbstractFilesystemNode {
protected:
	String _displayName;
	bool _isDirectory;
	bool _isValid;
	bool _isPseudoRoot;
	String _path;
	
public:
	PSPFilesystemNode();
	PSPFilesystemNode(const String &path);
	PSPFilesystemNode(const PSPFilesystemNode *node);

	virtual String displayName() const { return _displayName; }
	virtual bool isValid() const { return _isValid; }
	virtual bool isDirectory() const { return _isDirectory; }
	virtual String path() const { return _path; }

	virtual FSList listDir(ListMode) const;
	virtual AbstractFilesystemNode *parent() const;
};

AbstractFilesystemNode *FilesystemNode::getRoot() {
	return new PSPFilesystemNode();
}

PSPFilesystemNode::PSPFilesystemNode() {
	_isDirectory = true;
	_displayName = "Root";
	_isValid = true;
	_path = "ms0:/";
	_isPseudoRoot = true;
}

PSPFilesystemNode::PSPFilesystemNode(const Common::String &p)
{
	_displayName = p;
	_isValid = true;
	_isDirectory = true;
	_path = p;
}


PSPFilesystemNode::PSPFilesystemNode(const PSPFilesystemNode *node) {
	_displayName = node->_displayName;
	_isDirectory = node->_isDirectory;
	_isValid = node->_isValid;
	_isPseudoRoot = node->_isPseudoRoot;
	_path = node->_path;
}

AbstractFilesystemNode *FilesystemNode::getNodeForPath(const String &path) 
{
	return new PSPFilesystemNode(path);
}


FSList PSPFilesystemNode::listDir(ListMode mode) const {
	assert(_isDirectory);

	int dfd;
	FSList myList;
	
    dfd = sceIoDopen(_path.c_str());
	if (dfd > 0) {
        SceIoDirent dir;	   
        memset(&dir, 0, sizeof(dir));
	   
        while (sceIoDread(dfd, &dir) > 0) {
            // Skip 'invisible files
            if (dir.d_name[0] == '.') 
                continue;
               
            PSPFilesystemNode entry;
            
            entry._isValid = true;
            entry._isPseudoRoot = false;
            entry._displayName = dir.d_name;
            entry._path = _path;
            entry._path += dir.d_name;
            entry._isDirectory = dir.d_stat.st_attr & FIO_SO_IFDIR;
            if (entry._isDirectory)
                entry._path += "/";
            
            // Honor the chosen mode
            if ((mode == kListFilesOnly && entry._isDirectory) ||
                (mode == kListDirectoriesOnly && !entry._isDirectory))
                    continue;
            
            myList.push_back(wrap(new PSPFilesystemNode(&entry)));
        }
        sceIoDclose(dfd);   
	}

	return myList;
}

const char *lastPathComponent(const Common::String &str) {
	const char *start = str.c_str();
	const char *cur = start + str.size() - 2;

	while (cur > start && *cur != '/') {
		--cur;
	}

	return cur + 1;
}

AbstractFilesystemNode *PSPFilesystemNode::parent() const {
	assert(_isValid || _isPseudoRoot);
	if (_isPseudoRoot)
		return 0;
	PSPFilesystemNode *p = new PSPFilesystemNode();
	if (_path.size() > 5) {
		const char *start = _path.c_str();
		const char *end = lastPathComponent(_path);

		p = new PSPFilesystemNode();
		p->_path = String(start, end - start);
		p->_isValid = true;
		p->_isDirectory = true;
		p->_displayName = lastPathComponent(p->_path);
		p->_isPseudoRoot = false;
	}
	return p;
}

#endif // PSP

--- NEW FILE: psp_main.cpp ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/psp/psp_main.cpp,v 1.1 2005/08/16 17:15:36 joostp Exp $
 *
 */
 
#include <pspkernel.h>
#include <pspdebug.h>
#include <stdlib.h>
#include <string.h>

#define	REAL_MAIN
#include <common/stdafx.h>
#include <common/scummsys.h>
#include <base/engine.h>
#include <base/gameDetector.h>
#include <base/plugins.h>

#include <pspgu.h>
#include "./trace.h"

PSP_MODULE_INFO("SCUMMVM-PSP", 0x1000, 1, 1);

/* Define the main thread's attribute value (optional) */
PSP_MAIN_THREAD_ATTR(/*THREAD_ATTR_USER | THREAD_ATTR_VFPU*/ 0);

/* global quit flag, this is used to let the VM engine shutdown properly */
bool g_quit = false;

void MyExceptionHandler(PspDebugRegBlock *regs) {
	/* Do normal initial dump, setup screen etc */

	pspDebugScreenInit();

	pspDebugScreenSetBackColor(0x00FF0000);
	pspDebugScreenSetTextColor(0xFFFFFFFF);
	pspDebugScreenClear();

	pspDebugScreenPrintf("Exception Details:\n");
	pspDebugDumpException(regs);

	while (1) ;
}


/* Exit callback */
SceKernelCallbackFunction exit_callback(int /*arg1*/, int /*arg2*/, void * /*common*/) {
	g_quit = true; //Set g_quit so our backend can shutdown the VM
	sceKernelDelayThread(1000);
	return 0;
}

/* Callback thread */
int CallbackThread(SceSize /*size*/, void *arg) {
	int cbid;

	cbid = sceKernelCreateCallback("Exit Callback", (SceKernelCallbackFunction)exit_callback, NULL);
	sceKernelRegisterExitCallback(cbid);

	sceKernelSleepThreadCB();
	return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
	int thid = 0;

	thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, THREAD_ATTR_USER, 0);
	if(thid >= 0)
	{
		sceKernelStartThread(thid, 0, 0);
	}

	return thid;
}


extern "C" int scummvm_main(int argc, char *argv[]);

int main(void)
{
	//PSPDebugTrace("Init debug screen\n");
	pspDebugScreenInit();

	//PSPDebugTrace("Setup callbacks\n");
	SetupCallbacks();

	//install exception handler
	pspDebugInstallErrorHandler(MyExceptionHandler);

	//check if the save directory exists
	SceUID fd = sceIoDopen(SCUMMVM_SAVEPATH);
	if (fd < 0) {
		//No? then let's create it.
		sceIoMkdir(SCUMMVM_SAVEPATH, 0777); 
	} else {
		//it exists, so close it again.
		sceIoDclose(fd);
	}

	static char *argv[] = { "scummvm", "--force-1x-overlay", NULL };
	static int argc = sizeof(argv)/sizeof(char *)-1;

	scummvm_main(argc, argv);
	
	sceKernelSleepThread();

	return 0;
}


--- NEW FILE: trace.cpp ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/psp/trace.cpp,v 1.1 2005/08/16 17:15:36 joostp Exp $
 *
 */


#include "./trace.h"


//#define __DEBUG__

void PSPDebugTrace (const char *format, ...) {
#ifdef __DEBUG__
	va_list	opt;
	char		buff[2048];
	int			bufsz, fd;
   
	va_start(opt, format);
	bufsz = vsnprintf( buff, (size_t) sizeof(buff), format, opt);
	va_end(opt);

	fd = sceIoOpen("MS0:/DTRACE.TXT", PSP_O_RDWR | PSP_O_CREAT | PSP_O_APPEND, 0777);

	if(fd <= 0)
	{
		return;
	}
	
	sceIoWrite(fd, (const void*)buff, bufsz);
	sceIoClose(fd);
#endif
}

void PSPDebugTrace (const char * filename, const char *format, ...) {
#ifdef __DEBUG__
	va_list	opt;
	char		buff[2048];
	int			bufsz, fd;
   
	va_start(opt, format);
	bufsz = vsnprintf( buff, (size_t) sizeof(buff), format, opt);
	va_end(opt);

	fd = sceIoOpen(filename, PSP_O_RDWR | PSP_O_CREAT | PSP_O_APPEND, 0777);

	if(fd <= 0)
	{
		return;
	}
	
	sceIoWrite(fd, (const void*)buff, bufsz);
	sceIoClose(fd);
#endif
}


--- NEW FILE: trace.h ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2005 The ScummVM project
 * Copyright (C) 2005 Joost Peters PSP Backend
 * Copyright (C) 2005 Thomas Mayer PSP Backend
 * Copyright (C) 2005 Paolo Costabel PSP Backend
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/psp/trace.h,v 1.1 2005/08/16 17:15:36 joostp Exp $
 *
 */


#ifndef TRACE_H
#define TRACE_H

#include <stdio.h>
#include <psptypes.h>
#include <pspkernel.h>
#include <stdarg.h>
#include <pspdebug.h>

void PSPDebugTrace (const char *filename, const char *format, ...);
void PSPDebugTrace (const char *format, ...);

#endif // TRACE_H






More information about the Scummvm-git-logs mailing list