[xiph-cvs] cvs commit: snatch libsnatch.c snatch.pl snatchppm.h x11.c
Monty
xiphmont at xiph.org
Fri Nov 2 15:10:30 PST 2001
xiphmont 01/11/02 15:10:29
Added: . libsnatch.c snatch.pl snatchppm.h x11.c
Log:
Actual functionality not currently turned on. Builds and runs tho.
Monty
Revision Changes Path
1.1 snatch/libsnatch.c
Index: libsnatch.c
===================================================================
/* top layer of subversion library to intercept RealPlayer socket and
device I/O. --Monty 20011101 */
#define _GNU_SOURCE
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/uio.h>
#include <string.h>
#include <dlfcn.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <stdarg.h>
#include <linux/soundcard.h>
#include <pthread.h>
tatic int (*libc_open)(const char *,int,mode_t);
static int (*libc_connect)(int sockfd, const struct sockaddr *serv_addr,
socklen_t addrlen);
static int (*libc_close)(int);
static size_t (*libc_read)(int,void *,size_t);
static size_t (*libc_write)(int,const void *,size_t);
static int (*libc_readv)(int,const struct iovec *,int);
static int (*libc_writev)(int,const struct iovec *,int);
static int (*libc_ioctl)(int,int,void *);
static pid_t (*libc_fork)(void);
/* of the members of the poll family, RP only uses select */
static int (*libc_select)(int,fd_set *,fd_set *,fd_set *,
struct timeval *timeout);
tatic int debug;
static char *outpath;
static char *audioname;
static char *Xname;
static unsigned long Xinet_port;
static char *Xunix_socket;
tatic FILE *backchannel_fd=NULL;
tatic int audio_fd=-1;
static int audio_channels=-1;
static int audio_rate=-1;
static int audio_format=-1;
tatic int X_fd=-1;
tatic pthread_t snatch_backchannel_thread;
#include "x11.c" /* yeah, ugly, but I don't want to leak symbols.
Oh and I'm lazy. */
tatic char *audio_fmts[]={"unknown format",
"8 bit mu-law",
"8 bit A-law",
"ADPCM",
"unsigned, 8 bit",
"signed, 16 bit, little endian",
"signed, 16 bit, big endian",
"signed, 8 bit",
"unsigned, 16 bit, little endian",
"unsigned, 16 bit, big endian",
"MPEG 2",
"Dolby Digial AC3"};
tatic char *formatname(int format){
int i;
for(i=0;i<12;i++)
if(format==((1<<i)>>1))return(audio_fmts[i]);
return(audio_fmts[0]);
}
/* although RealPlayer is both multiprocess and multithreaded, we
don't lock because we assume only one thread/process will be mucking
with a specific X drawable or audio device at a time */
void *get_me_symbol(char *symbol){
void *ret=dlsym(RTLD_NEXT,symbol);
if(ret==NULL){
char *dlerr=dlerror();
fprintf(stderr,
"**ERROR: libsnatch.so could not find the function '%s()'\n"
" in libc. This shouldn't happen and I'm not going to\n"
" make any wild guesses as to what caused it. The\n"
" error returned by dlsym() was:\n %s",
symbol,(dlerr?dlerr:"no such symbol"));
fprintf (stderr,"\n\nCannot continue. exit(1)ing...\n\n");
exit(1);
}else
if(debug)
fprintf(stderr," ...: symbol '%s()' found and subverted.\n",symbol);
return(ret);
}
void *backchannel_and_timer(void *dummy){
if(debug)
fprintf(stderr," ...: Backchannel thread %lx reporting for duty!\n",
(unsigned long)pthread_self());
while(1){
char length;
size_t bytes=fread(&length,1,1,backchannel_fd);
if(bytes<=0){
fprintf(stderr,"**ERROR: Backchannel lost! exit(1)ing...\n");
exit(1);
}
if(debug)
fprintf(stderr," ...: Backchannel request\n");
}
}
void initialize(void){
if(!libc_open){
/* be chatty? */
if(getenv("SNATCH_DEBUG"))debug=1;
if(debug)fprintf(stderr,
"----env: SNATCH_DEBUG\n"
" set\n");
/* get handles to the libc symbols we're subverting */
libc_open=get_me_symbol("open");
libc_close=get_me_symbol("close");
libc_read=get_me_symbol("read");
libc_readv=get_me_symbol("readv");
libc_write=get_me_symbol("write");
libc_writev=get_me_symbol("writev");
libc_connect=get_me_symbol("connect");
libc_ioctl=get_me_symbol("ioctl");
libc_fork=get_me_symbol("fork");
libc_select=get_me_symbol("select");
/* output path? */
outpath=getenv("SNATCH_OUTPUT_PATH");
if(!outpath){
if(debug)
fprintf(stderr,
"----env: SNATCH_OUTPUT_PATH\n"
" not set. Using current working directory.\n");
outpath=".";
}else{
if(debug)
fprintf(stderr,
"----env: SNATCH_OUTPUT_PATH\n"
" set (%s)\n",outpath);
}
/* audio device? */
audioname=getenv("SNATCH_AUDIO_DEVICE");
if(!audioname){
if(debug)
fprintf(stderr,
"----env: SNATCH_AUDIO_DEVICE\n"
" not set. Using default (/dev/dsp*).\n");
audioname="/dev/dsp*";
}else{
if(debug)
fprintf(stderr,
"----env: SNATCH_AUDIO_DEVICE\n"
" set (%s)\n",audioname);
}
if(debug)
fprintf(stderr," ...: Now watching for RealPlayer audio output.\n");
/* X socket? */
Xname=getenv("SNATCH_X_PORT");
if(!Xname){
char *display=getenv("DISPLAY");
if(!display){
fprintf(stderr,
"**ERROR: DISPLAY environment variable not set, and no explicit\n"
" socket/host/port set via SNATCH_X_PORT. exit(1)ing...\n\n");
exit(1);
}
Xname=display;
if(debug)
fprintf(stderr,
"----env: SNATCH_X_PORT\n"
" not set. Using DISPLAY value (%s).\n",display);
}else{
if(debug)
fprintf(stderr,
"----env: SNATCH_X_PORT\n"
" set (%s)\n",Xname);
}
if(Xname[0]==':'){
/* local display */
Xunix_socket=strdup("/tmp/.X11-unix/X ");
sprintf(Xunix_socket+16,"%d",atoi(Xname+1));
if(debug)
fprintf(stderr,
" ...: Now watching for RealPlayer X connection on\n"
" local AF_UNIX socket %s\n",Xunix_socket);
}else if(Xname[0]=='/'){
Xunix_socket=strdup(Xname);
if(debug)
fprintf(stderr,
" ...: Now watching for RealPlayer X connection on\n"
" local AF_UNIX socket %s\n",Xunix_socket);
}else{
/* named host/port. We only pay attention to port. */
char *colonpos=strchr(Xname,':');
if(!colonpos)
Xinet_port=6000;
else
Xinet_port=atoi(colonpos)+6000;
if(debug)
fprintf(stderr,
" ...: Now watching for RealPlayer X connection on\n"
" AF_INET socket *.*.*.*:%ld\n",Xinet_port);
}
{
int ret;
struct sockaddr_un addr;
char backchannel_socket[sizeof(addr.sun_path)];
int temp_fd;
memset(backchannel_socket,0,sizeof(backchannel_socket));
if(getenv("SNATCH_COMM_SOCKET"))
strncpy(backchannel_socket,getenv("SNATCH_COMM_SOCKET"),
sizeof(addr.sun_path)-1);
if(backchannel_socket[0]){
if(debug)
fprintf(stderr,
"----env: SNATCH_COMM_SOCKET\n"
" set to %s; trying to connect...\n",
backchannel_socket);
temp_fd=socket(AF_UNIX,SOCK_STREAM,0);
if(temp_fd<0){
fprintf(stderr,
"**ERROR: socket() call for backchannel failed.\n"
" returned error %d:%s\n"
" exit(1)ing...\n\n",errno,strerror(errno));
exit(1);
}
addr.sun_family=AF_UNIX;
strcpy(addr.sun_path,backchannel_socket);
if((*libc_connect)(temp_fd,(struct sockaddr *)&addr,sizeof(addr))<0){
fprintf(stderr,
"**ERROR: connect() call for backchannel failed.\n"
" returned error %d: %s\n"
" exit(1)ing...\n\n",errno,strerror(errno));
exit(1);
}
if(debug)
fprintf(stderr,
" ...: connected to backchannel\n");
backchannel_fd=fdopen(temp_fd,"w+");
if(backchannel_fd==NULL){
fprintf(stderr,
"**ERROR: fdopen() failed on backchannel fd. error returned:\n"
" %s\n exit(1)ing...\n\n",strerror(errno));
exit(1);
}
if(debug)
fprintf(stderr,
" ...: starting backchannel/fake event thread...\n");
if((ret=pthread_create(&snatch_backchannel_thread,NULL,
backchannel_and_timer,NULL))){
fprintf(stderr,
"**ERROR: could not create backchannel worker thread.\n"
" Error code returned: %d\n"
" exit(1)ing...\n\n",ret);
exit(1);
}else
if(debug)
fprintf(stderr,
" ...done.\n");
}else
if(debug)
fprintf(stderr,
"----env: SNATCH_COMM_SOCKET\n"
" not set \n");
}
StartClientConnection();
StartServerConnection();
}
}
pid_t fork(void){
initialize();
return((*libc_fork)());
}
/* The audio device is subverted through open() */
int open(const char *pathname,int flags,mode_t mode){
int ret;
initialize();
ret=(*libc_open)(pathname,flags,mode);
if(ret>-1){
/* open needs only watch for the audio device. */
if( (audioname[strlen(audioname)-1]=='*' &&
!strncmp(pathname,audioname,strlen(audioname)-1)) ||
(audioname[strlen(audioname)-1]!='*' &&
!strcmp(pathname,audioname))){
/* a match! */
if(audio_fd>-1){
/* umm... an audio fd is already open. report the problem and
continue */
fprintf(stderr,
"\n"
"WARNING: RealPlayer is attempting to open more than one\n"
" audio device (in this case, %s).\n"
" This behavior is unexpected; ignoring this open()\n"
" request.\n",pathname);
}else{
audio_fd=ret;
audio_channels=-1;
audio_rate=-1;
audio_format=-1;
if(debug)
fprintf(stderr,
" ...: Caught RealPlayer opening audio device "
"%s (fd %d).\n",
pathname,ret);
}
}
}
return(ret);
}
/* The X channel is subverted through connect */
int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen){
int ret;
initialize();
ret=(*libc_connect)(sockfd,serv_addr,addrlen);
if(ret>-1){
if(serv_addr->sa_family==AF_UNIX){
struct sockaddr_un *addr=(struct sockaddr_un *)serv_addr;
if(!strcmp(Xunix_socket,addr->sun_path)){
X_fd=sockfd;
if(debug)
fprintf(stderr,
" ...: Caught RealPlayer connecting to X server\n"
" local socket %s (fd %d).\n",
Xunix_socket,ret);
}
}
if(Xinet_port && serv_addr->sa_family==AF_INET){
struct sockaddr_in *addr=(struct sockaddr_in *)serv_addr;
unsigned int port=ntohs(addr->sin_port);
unsigned long host=ntohl(addr->sin_addr.s_addr);
if(Xinet_port==port){
X_fd=sockfd;
if(debug)
fprintf(stderr,
" ...: Caught RealPlayer connecting to X server\n"
" on host %ld.%ld.%ld.%ld port %d (fd %d).\n",
(host>>24)&0xff,(host>>16)&0xff,(host>>8)&0xff, host&0xff,
port,ret);
}
}
}
return(ret);
}
int close(int fd){
int ret;
initialize();
ret=(*libc_close)(fd);
if(fd==audio_fd){
audio_fd=-1;
if(debug)
fprintf(stderr,
" ...: RealPlayer closed audio playback fd %d\n",fd);
}
if(fd==X_fd){
X_fd=-1;
if(debug)
fprintf(stderr,
" ...: RealPlayer shut down X socket fd %d\n",fd);
StopClientConnection();
StopServerConnection();
}
return(ret);
}
ize_t write(int fd, const void *buf,size_t count){
initialize();
if(fd==X_fd){
ProcessBuffer(&clientCS,(void *)buf,count,DataToServer);
return(count);
}
return((*libc_write)(fd,buf,count));
}
ize_t read(int fd, void *buf,size_t count){
int ret;
initialize();
ret=(*libc_read)(fd,buf,count);
if(ret>0)
if(fd==X_fd)
ProcessBuffer(&serverCS,buf,ret,NULL);
return(ret);
}
int readv(int fd,const struct iovec *v,int n){
if(fd==audio_fd || fd==X_fd){
int i,ret,count=0;
for(i=0;i<n;i++){
ret=read(fd,v[i].iov_base,v[i].iov_len);
if(ret<0 && count==0)return(ret);
if(ret<0)return(count);
count+=ret;
if(ret<v[i].iov_len)return(count);
}
return(count);
}else
return((*libc_readv)(fd,v,n));
}
int writev(int fd,const struct iovec *v,int n){
if(fd==audio_fd || fd==X_fd){
int i,ret,count=0;
for(i=0;i<n;i++){
ret=write(fd,v[i].iov_base,v[i].iov_len);
if(ret<0 && count==0)return(ret);
if(ret<0)return(count);
count+=ret;
if(ret<v[i].iov_len)return(count);
}
return(count);
}else
return((*libc_writev)(fd,v,n));
}
/* watch audio ioctl()s to track playback rate/channels/depth */
/* stdargs are here only to force the clean compile */
int ioctl(int fd,unsigned long int rq, ...){
va_list optional;
void *arg;
int ret;
initialize();
va_start(optional,rq);
arg=va_arg(optional,void *);
va_end(optional);
if(fd==audio_fd){
if(rq==SNDCTL_DSP_SPEED ||
rq==SNDCTL_DSP_CHANNELS ||
rq==SNDCTL_DSP_SETFMT){
ret=(*libc_ioctl)(fd,rq,arg);
if(ret==0){
switch(rq){
case SNDCTL_DSP_SPEED:
audio_rate=*(int *)arg;
if(debug)
fprintf(stderr,
" ...: Audio output sampling rate set to %dHz.\n",
audio_rate);
break;
case SNDCTL_DSP_CHANNELS:
audio_channels=*(int *)arg;
if(debug)
fprintf(stderr,
" ...: Audio output set to %d channels.\n",
audio_channels);
break;
case SNDCTL_DSP_SETFMT:
audio_format=*(int *)arg;
if(debug)
fprintf(stderr,
" ...: Audio output format set to %s.\n",
formatname(audio_format));
break;
}
}
return(ret);
}
}
return((*libc_ioctl)(fd,rq,arg));
}
int select(int n, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout){
int ret;
ret=(*libc_select)(n,readfds,writefds,exceptfds,timeout);
/* it turns out that RealPlayer busywaits using select [jeez], so we
don't need to do any extra work to wake it up to send our own
events. However, just in case, if we're called with a large
timeout, shave it down a bit. */
/* do we have a pending synthetic event? */
/* is one of the read fds our X socket? */
return (*libc_select)(n,readfds,writefds,exceptfds,timeout);
}
1.1 snatch/snatch.pl
Index: snatch.pl
===================================================================
#!/usr/bin/perl
use Socket;
use Sys::Hostname;
use Tk;
use Tk qw(exit);
my $backchannel_socket="/tmp/snatch";
my $uaddr=sockaddr_un($backchannel_socket);
my $proto=getprotobyname('tcp');
die $! unless socket(LISTEN_SOCK, PF_UNIX, SOCK_STREAM,0);
unlink($backchannel_socket);
die $! unless bind(LISTEN_SOCK,$uaddr);
die $! unless listen(LISTEN_SOCK,SOMAXCONN);
die $! unless accept(COMM_SOCK,LISTEN_SOCK);
while(1){
$char=getc STDIN;
syswrite COMM_SOCK,$char,1;
}
1.1 snatch/snatchppm.h
Index: snatchppm.h
===================================================================
static long snatchwidth=91;
static long snatchheight=68;
static unsigned char snatchppm[]={
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,125, 48, 55, 60, 22, 21, 30, 9, 4,
30, 10, 4, 30, 10, 4, 23, 7, 0, 30, 9, 4, 30, 10, 4,
30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4,
30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4,
30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4,
30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4,
30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4,
30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4,
30, 9, 4, 60, 23, 21, 60, 23, 21, 30, 9, 4, 30, 9, 4,
60, 23, 21, 60, 23, 21, 30, 9, 4, 30, 9, 4, 60, 23, 21,
60, 23, 21, 30, 9, 4, 30, 9, 4, 60, 23, 21, 60, 23, 21,
30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4,
30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4,
30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4,
30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4,
30, 10, 4, 24, 8, 0, 30, 10, 4, 30, 10, 4, 30, 9, 4,
60, 22, 21,125, 48, 55,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64, 28, 4, 0, 74, 40, 37, 82, 38, 35,
84, 34, 33, 85, 36, 34, 84, 36, 35, 86, 37, 38, 84, 35, 36,
85, 36, 34, 83, 35, 34, 85, 36, 37, 84, 35, 36, 85, 36, 34,
84, 36, 35, 85, 36, 37, 84, 35, 36, 84, 36, 35, 84, 36, 35,
84, 35, 36, 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37,
84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36,
85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34,
84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35,
85, 36, 37, 84, 35, 36, 84, 36, 35, 84, 36, 35, 84, 35, 36,
84, 35, 36, 84, 36, 35, 84, 36, 35, 84, 35, 36, 84, 35, 36,
84, 36, 35, 84, 36, 35, 84, 35, 36, 84, 35, 36, 84, 36, 35,
84, 36, 35, 84, 35, 36, 84, 35, 36, 85, 36, 34, 84, 36, 35,
85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37,
84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36,
85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34,
84, 36, 35, 85, 36, 34, 84, 36, 35, 84, 34, 33, 85, 36, 34,
85, 36, 34, 82, 38, 35, 75, 39, 34, 30, 4, 0, 92, 35, 38,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64, 28, 4, 0, 91, 35, 34,108, 31, 33,
99, 10, 8,105, 4, 4,155, 56, 58,153, 54, 58,154, 53, 60,
153, 52, 59,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,154, 53, 60,153, 52, 59,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,154, 53, 60,
155, 54, 59,106, 5, 5,101, 12, 8,109, 32, 33, 94, 36, 33,
76, 39, 33, 24, 7, 0,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64, 28, 4, 0, 84, 35, 36, 87, 8, 8,
158, 57, 59,164, 53, 56,165, 54, 57,157, 54, 58,155, 54, 59,
156, 53, 61,154, 53, 60,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,155, 54, 59,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,154, 53, 60,
153, 52, 59,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
153, 52, 59,156, 53, 60,164, 53, 58,166, 53, 58,159, 54, 59,
96, 5, 5, 99, 34, 32, 78, 40, 33, 92, 35, 38,142, 55, 64,
142, 55, 64,142, 55, 64, 28, 4, 0, 89, 35, 34, 87, 8, 8,
155, 46, 64,158, 43, 64,168, 71, 81, 84, 7, 9, 92, 37, 35,
85, 36, 34, 85, 36, 37, 85, 36, 37, 85, 36, 34, 84, 36, 35,
85, 36, 37, 84, 36, 35, 85, 36, 34, 84, 36, 35, 84, 36, 35,
84, 35, 36, 84, 35, 36, 84, 35, 36, 85, 36, 37, 84, 35, 36,
84, 36, 35, 84, 36, 35, 84, 35, 36, 84, 36, 35, 85, 36, 34,
84, 36, 35, 85, 36, 34, 84, 35, 36, 84, 36, 35, 84, 36, 35,
84, 35, 36, 84, 36, 35, 85, 36, 34, 84, 36, 35, 85, 36, 34,
84, 35, 36, 85, 36, 37, 84, 35, 36, 85, 36, 37, 84, 35, 36,
85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34,
84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35,
85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37,
84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36,
85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34,
84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35,
85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37,
84, 35, 36, 84, 36, 35, 91, 34, 35,134, 53, 64,176, 69, 89,
166, 39, 63,169, 42, 60,102, 5, 7,104, 33, 31, 30, 2, 0,
142, 55, 64,142, 55, 64,125, 48, 55, 74, 40, 37,108, 31, 33,
157, 54, 61,162, 39, 65,178, 65, 91, 99, 24, 35, 48, 2, 0,
44, 1, 0, 42, 2, 0, 44, 1, 0, 46, 1, 0, 42, 0, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 2, 0, 44, 2, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 2, 0, 44, 2, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 2, 0, 44, 2, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 2, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 2, 0, 44, 1, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0, 44, 1, 0,
44, 1, 0, 42, 0, 0, 42, 3, 0, 42, 0, 0, 46, 0, 2,
101, 16, 38,201, 66,101,180, 33, 64,171, 50, 58, 94, 13, 9,
76, 38, 35,125, 48, 55,142, 55, 64, 60, 23, 21, 82, 38, 35,
97, 6, 6,167, 46, 58,182, 55, 85, 92, 0, 17, 40, 0, 1,
33, 0, 1, 54, 2, 0, 68, 3, 0, 74, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 76, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 76, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0, 78, 3, 0,
78, 3, 0, 78, 3, 0, 76, 3, 0, 70, 3, 0, 56, 0, 1,
33, 0, 1, 44, 0, 3,160, 31, 68,215, 64,100,175, 46, 58,
101, 6, 6, 82, 38, 35, 60, 23, 21,142, 55, 64, 30, 10, 4,
84, 36, 35,155, 54, 59,169, 42, 60,195, 70,102, 70, 0, 4,
34, 0, 2, 36, 2, 0, 96, 10, 7,183, 64, 67,187, 62, 65,
189, 60, 63,190, 61, 64,190, 61, 64,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,191, 60, 63,191, 60, 63,191, 60, 63,
191, 60, 63,191, 60, 63,191, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
190, 61, 64,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,190, 61, 64,189, 60, 63,
189, 58, 64,189, 58, 64,189, 58, 64,189, 58, 64,190, 61, 64,
189, 60, 63,189, 60, 63,188, 59, 62,188, 59, 62,189, 60, 63,
189, 58, 64,189, 58, 64,190, 61, 64,189, 60, 63,189, 60, 63,
188, 59, 62,188, 59, 62,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,190, 61, 64,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,187, 62, 65,165, 49, 46,
96, 7, 10, 34, 3, 0, 34, 0, 2,124, 5, 41,212, 61,104,
175, 40, 62,153, 54, 58, 85, 36, 34, 24, 7, 0,142, 55, 64,
30, 9, 4, 84, 35, 36,152, 51, 60,166, 39, 63,190, 65,106,
70, 0, 6, 44, 2, 0, 80, 22, 15,198, 61, 61,230, 51, 60,
231, 52, 60,233, 52, 56,233, 52, 56,233, 52, 56,233, 52, 56,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
231, 50, 59,231, 50, 59,233, 50, 59,233, 48, 57,233, 48, 57,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 48, 57,233, 48, 57,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
232, 49, 58,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,231, 52, 60,
231, 52, 57,196, 61, 61, 52, 1, 0, 38, 0, 0,120, 7, 39,
204, 63,103,186, 55, 82,150, 49, 61, 89, 34, 34, 28, 7, 0,
142, 55, 64, 30, 9, 4, 84, 36, 35,150, 49, 63,180, 55, 84,
186, 63,106, 70, 0, 6, 48, 0, 1, 92, 20, 13,219, 58, 58,
254, 45, 55,254, 47, 52,254, 47, 52,254, 47, 52,254, 47, 52,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,253, 44, 54,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,247, 48, 53,
247, 48, 53,247, 48, 53,246, 51, 56,242, 51, 56,242, 51, 56,
240, 53, 58,240, 53, 58,242, 51, 56,246, 51, 56,247, 48, 53,
247, 48, 53,246, 47, 52,247, 48, 53,249, 48, 53,253, 48, 58,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,213, 54, 58, 78, 17, 17, 38, 0, 0,
117, 8, 39,201, 62,105,185, 54, 85,150, 47, 64, 92, 37, 35,
69, 44, 34,142, 55, 64, 30, 10, 4, 81, 35, 34,148, 47, 63,
179, 54, 86,186, 63,106, 70, 0, 6, 48, 0, 1, 92, 20, 13,
219, 58, 58,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 44, 54,230, 40, 49,230, 40, 49,230, 40, 49,
230, 40, 49,230, 40, 49,230, 40, 49,230, 40, 49,229, 39, 48,
230, 40, 49,230, 40, 49,230, 40, 49,212, 61, 65,212, 61, 65,
212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,
212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,
212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,
212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,
215, 60, 64,212, 61, 65,212, 61, 65,217, 60, 64,226, 57, 57,
231, 54, 54,231, 54, 54,231, 54, 54,233, 56, 56,238, 55, 55,
249, 48, 53,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,214, 55, 59, 52, 2, 0,
32, 0, 3,115, 8, 41,201, 62,105,185, 54, 85,152, 47, 64,
96, 34, 33, 73, 43, 34,125, 48, 55, 30, 10, 4, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 68, 0, 7, 42, 0, 0,
87, 20, 14,217, 58, 58,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
196, 34, 42,196, 34, 42,196, 34, 42,195, 35, 43,150, 28, 33,
146, 28, 30,141, 30, 33,138, 30, 32,135, 30, 33,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,114, 16, 11,114, 16, 11,119, 13, 10,
123, 11, 6,127, 2, 2,127, 7, 4,151, 38, 40,151, 38, 40,
151, 38, 40,167, 42, 45,167, 42, 45,167, 42, 45,175, 42, 45,
181, 41, 45,183, 40, 47,214, 45, 49,222, 44, 52,249, 48, 53,
253, 48, 58,254, 45, 55,254, 45, 55,254, 45, 55,212, 55, 63,
50, 2, 0, 30, 0, 4,115, 8, 41,201, 62,105,185, 54, 85,
152, 47, 64, 98, 34, 33, 75, 42, 32,125, 48, 55, 30, 10, 4,
82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 64, 0, 9,
32, 0, 3, 56, 2, 0,214, 55, 59,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,223, 39, 48,172, 30, 36,145, 24, 31,
102, 17, 21, 52, 8, 11, 46, 8, 9, 42, 7, 9, 42, 8, 9,
41, 8, 9, 38, 8, 9, 33, 9, 9, 19, 6, 6, 5, 1, 1,
1, 0, 0, 1, 0, 0, 2, 0, 0, 8, 0, 0, 1, 0, 0,
15, 0, 0, 30, 1, 0, 36, 2, 0, 36, 2, 0, 36, 2, 0,
36, 2, 0, 36, 2, 0, 36, 2, 0, 36, 2, 0, 36, 2, 0,
36, 2, 0, 36, 2, 0, 36, 2, 0, 36, 2, 0, 36, 2, 0,
36, 2, 0, 36, 2, 0, 36, 2, 0, 36, 2, 0, 42, 0, 0,
40, 1, 0, 38, 1, 0, 32, 1, 0, 25, 2, 0, 22, 1, 0,
20, 1, 0, 21, 0, 0, 21, 0, 0, 21, 0, 0, 24, 0, 0,
27, 0, 0, 26, 1, 0, 11, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 23, 4, 5, 23, 4, 5, 63, 10, 13,
100, 16, 20,131, 22, 27,192, 35, 42,243, 44, 54,254, 45, 55,
212, 55, 63, 50, 2, 0, 30, 0, 4,114, 7, 40,201, 62,105,
185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55,
30, 10, 4, 82, 36, 35,146, 47, 63,178, 53, 88,186, 63,106,
62, 0, 10, 26, 0, 4, 48, 2, 0,212, 55, 59,254, 45, 55,
254, 45, 55,254, 47, 57,253, 44, 54,254, 45, 55,254, 45, 55,
254, 45, 55,217, 38, 47,129, 22, 27, 63, 11, 13, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 22, 3, 1, 11, 5, 2, 6, 5, 3, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 6, 5, 3, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 6, 1, 5, 3, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 12, 14,137, 28, 31,
230, 48, 53,205, 58, 62, 48, 2, 0, 32, 0, 3,115, 8, 41,
202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 24, 7, 0, 84, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62, 0, 10, 26, 0, 6, 48, 2, 0,212, 55, 59,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,186, 33, 40, 90, 15, 19, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 8, 3, 5, 7, 2, 6, 7, 2, 6,
5, 1, 4, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73, 13, 15,116, 27, 28,194, 59, 62, 44, 2, 0, 32, 0, 3,
114, 7, 40,202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35,
75, 42, 32,125, 48, 55, 24, 7, 0, 84, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62, 0, 10, 26, 0, 4, 48, 2, 0,
208, 55, 62,253, 48, 58,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,217, 38, 47, 86, 14, 18, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3, 1, 2, 5, 1, 4, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 8, 3, 5, 7, 2, 6,
5, 1, 4, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,113,113,113,
207,207,207,226,226,226,179,179,179, 28, 28, 28, 0, 0, 0,
0, 0, 0, 0, 0, 0, 84, 9, 10, 99, 6, 6, 32, 0, 0,
32, 0, 3,115, 8, 41,202, 63,102,185, 54, 85,152, 47, 64,
98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10, 26, 0, 4,
48, 2, 0,206, 59, 63,247, 50, 55,253, 46, 56,254, 45, 55,
254, 45, 55,254, 45, 55,128, 22, 27, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 4, 1, 4,
6, 1, 5, 7, 2, 6, 7, 2, 6, 8, 3, 5, 7, 2, 6,
7, 2, 6, 3, 0, 2, 0, 0, 0, 85, 85, 85,141,141,141,
122,122,122, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
198,198,198,255,255,255,255,255,255,255,255,255, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 53, 4, 6,
15, 5, 2, 30, 0, 4,113, 8, 40,201, 62,105,183, 54, 84,
152, 47, 64, 98, 33, 35, 75, 42, 32,142, 55, 64, 22, 7, 0,
82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10,
26, 0, 4, 46, 2, 0,171, 34, 34,242, 53, 58,251, 48, 58,
253, 44, 54,254, 45, 55,236, 41, 51, 64, 11, 14, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 1, 5, 1, 4, 6, 1, 5, 8, 3, 7,
7, 2, 6, 7, 2, 6, 2, 0, 1, 85, 85, 85,255,255,255,
255,255,255,255,255,255,113,113,113, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,255,255,255,255,255,255,255,255,255,198,198,198,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 7, 2, 6, 30, 0, 4,115, 8, 41,201, 62,105,
183, 54, 84,152, 47, 64, 98, 33, 35, 75, 42, 32,142, 55, 64,
20, 7, 0, 80, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
62, 0, 10, 26, 0, 4, 44, 0, 1,166, 43, 37,237, 56, 56,
249, 48, 53,254, 45, 55,254, 45, 55,172, 30, 37, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 5, 1, 4,
6, 1, 5, 7, 2, 6, 7, 2, 6, 2, 0, 2,141,141,141,
255,255,255,255,255,255,255,255,255, 56, 56, 56, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 56, 56, 56,255,255,255,255,255,255,255,255,255,
141,141,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 7, 2, 6, 30, 0, 4,113, 8, 40,
201, 62,105,183, 54, 84,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 20, 7, 0, 80, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62, 0, 10, 26, 0, 4, 44, 0, 1,163, 42, 36,
235, 62, 58,247, 50, 55,254, 45, 55,254, 45, 55, 95, 17, 21,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 28, 28, 28,179,179,179,255,255,255,255,255,255,
255,255,255,255,255,255,223,223,223,113,113,113, 0, 0, 0,
0, 0, 0, 85, 85, 85,198,198,198,226,226,226,188,188,188,
144,144,144,238,238,238,255,255,255,255,255,255,255,255,255,
141,141,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28,
179,179,179,245,245,245,255,255,255,255,255,255,255,255,255,
242,242,242,155,153,155, 34, 29, 33, 61, 57, 60,189,188,188,
245,245,245,255,255,255,255,255,255,255,255,255,207,207,207,
113,113,113, 0, 0, 0, 28, 28, 28,153,153,153,242,242,242,
255,255,255,255,255,255,255,255,255,217,217,217, 85, 85, 85,
0, 0, 0, 0, 0, 0,113,113,113,255,255,255,255,255,255,
255,255,255,160,160,160,223,223,223,255,255,255,255,255,255,
255,255,255,141,141,141, 0, 0, 0, 8, 3, 7, 30, 0, 4,
114, 7, 40,201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35,
75, 42, 32,125, 48, 55, 22, 7, 0, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62, 0, 10, 26, 0, 4, 44, 0, 1,
163, 42, 36,233, 56, 56,247, 48, 53,253, 44, 54,242, 42, 52,
65, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 85, 85, 85,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
142,141,142, 3, 0, 2,170,170,170,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,113,113,113, 0, 0, 0, 56, 56, 56,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,199,198,199, 89, 86, 89,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255, 87, 85, 86, 89, 85, 88,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255, 85, 85, 85, 0, 0, 0,170,170,170,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,113,113,113, 7, 2, 6,
30, 0, 4,115, 8, 41,201, 62,105,185, 54, 85,152, 47, 64,
98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 8, 26, 0, 4,
44, 0, 1,126, 5, 3,233, 56, 56,247, 48, 53,254, 45, 55,
210, 39, 48, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,226,226,226,255,255,255,255,255,255,
229,229,229, 28, 28, 28,113,113,113,255,255,255,255,255,255,
255,255,255,255,255,255, 0, 0, 0,255,255,255,255,255,255,
255,255,255,255,255,255,179,179,179, 52, 52, 52,204,204,204,
255,255,255,255,255,255,255,255,255,170,170,170, 0, 0, 0,
226,226,226,255,255,255,255,255,255,232,232,232, 56, 56, 56,
85, 85, 85,255,255,255,255,255,255,255,255,255,255,255,255,
56, 56, 56,144,144,144,255,255,255,255,255,255,255,255,255,
217,217,217,103,103,103, 52, 52, 52,255,255,255,255,255,255,
255,255,255,255,255,255, 85, 85, 85,113,113,113,255,255,255,
255,255,255,255,255,255,198,198,198, 0, 0, 0,226,226,226,
255,255,255,255,255,255,255,255,255,179,179,179, 52, 52, 52,
204,204,204,255,255,255,255,255,255,255,255,255,170,170,170,
7, 2, 6, 30, 0, 4,115, 8, 41,202, 63,106,185, 54, 85,
152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0,
82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 8,
26, 0, 4, 44, 0, 1,127, 7, 4,231, 54, 54,247, 48, 53,
254, 49, 59,187, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 85, 85, 85,255,255,255,255,255,255,
255,255,255,198,198,198, 0, 0, 0, 0, 0, 0,170,170,170,
226,226,226,226,226,226,170,170,170, 28, 28, 28,255,255,255,
255,255,255,255,255,255,226,226,226, 0, 0, 0, 0, 0, 0,
85, 85, 85,255,255,255,255,255,255,255,255,255,170,170,170,
28, 28, 28,179,179,179,226,226,226,198,198,198, 85, 85, 85,
0, 0, 0, 28, 28, 28,255,255,255,255,255,255,255,255,255,
170,170,170, 0, 0, 0, 85, 85, 85,255,255,255,255,255,255,
255,255,255, 85, 85, 85, 0, 0, 0,141,141,141,255,255,255,
255,255,255,255,255,255,113,113,113, 0, 0, 0, 0, 0, 0,
255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0,
255,255,255,255,255,255,255,255,255,229,229,229, 28, 28, 28,
0, 0, 0, 85, 85, 85,255,255,255,255,255,255,255,255,255,
172,170,172, 7, 2, 6, 30, 0, 4,115, 8, 41,201, 62,105,
185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 34,125, 48, 55,
22, 7, 0, 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
62, 0, 8, 26, 0, 4, 42, 0, 0,123, 6, 4,230, 55, 55,
246, 49, 59,249, 48, 53,147, 33, 33, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 85,255,255,255,
255,255,255,255,255,255,255,255,255,245,245,245,198,198,198,
85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 85,
255,255,255,255,255,255,255,255,255,113,113,113, 0, 0, 0,
0, 0, 0,113,113,113,255,255,255,255,255,255,255,255,255,
85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 85,
141,141,141,179,179,179,242,242,242,255,255,255,255,255,255,
255,255,255,141,141,141, 0, 0, 0,170,170,170,255,255,255,
255,255,255,255,255,255, 56, 56, 56, 28, 28, 28,255,255,255,
255,255,255,255,255,255,226,226,226, 0, 0, 0, 0, 0, 0,
0, 0, 0, 56, 56, 56,122,122,122,141,141,141, 85, 85, 85,
85, 85, 85,255,255,255,255,255,255,255,255,255,141,141,141,
0, 0, 0, 0, 0, 0,113,113,113,255,255,255,255,255,255,
255,255,255, 89, 86, 89, 8, 3, 7, 30, 0, 4,115, 8, 41,
201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 34,
125, 48, 55, 22, 7, 0, 82, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62, 0, 8, 24, 0, 3, 40, 0, 0,118, 7, 5,
223, 58, 58,244, 51, 56,246, 51, 56,149, 41, 39, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170,170,170,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255, 85, 85, 85, 0, 0, 0,
141,141,141,255,255,255,255,255,255,255,255,255, 56, 56, 56,
0, 0, 0, 0, 0, 0,170,170,170,255,255,255,255,255,255,
255,255,255, 56, 56, 56, 0, 0, 0,141,141,141,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255, 85, 85, 85, 0, 0, 0,198,198,198,
255,255,255,255,255,255,255,255,255, 0, 0, 0, 85, 85, 85,
255,255,255,255,255,255,255,255,255,141,141,141, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,113,113,113,255,255,255,255,255,255,255,255,255,
85, 85, 85, 0, 0, 0, 0, 0, 0,170,170,170,255,255,255,
255,255,255,255,255,255, 59, 56, 59, 6, 1, 5, 30, 0, 4,
115, 8, 41,200, 61,104,185, 54, 85,152, 47, 64, 98, 33, 35,
75, 42, 32,125, 48, 55, 22, 7, 0, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62, 0, 10, 24, 0, 5, 36, 1, 0,
137, 34, 28,217, 64, 60,242, 51, 56,242, 51, 56,172, 53, 47,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 56, 56, 56,188,188,188,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
56, 56, 56,198,198,198,255,255,255,255,255,255,255,255,255,
0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,
255,255,255,255,255,255, 0, 0, 0,198,198,198,255,255,255,
255,255,255,255,255,255,179,179,179,122,122,122,166,166,166,
255,255,255,255,255,255,255,255,255, 28, 28, 28, 0, 0, 0,
255,255,255,255,255,255,255,255,255,198,198,198, 0, 0, 0,
170,170,170,255,255,255,255,255,255,255,255,255, 85, 85, 85,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,170,170,170,255,255,255,255,255,255,
255,255,255, 28, 28, 28, 0, 0, 0, 0, 0, 0,255,255,255,
255,255,255,255,255,255,255,255,255, 0, 0, 0, 5, 0, 4,
30, 0, 4,115, 8, 41,202, 63,102,185, 54, 85,152, 47, 64,
98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10, 24, 0, 5,
34, 3, 0,114, 13, 11,214, 69, 61,240, 51, 55,240, 51, 55,
197, 65, 58, 23, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 85, 85, 85,235,235,235,255,255,255,255,255,255,
255,255,255, 85, 85, 85,255,255,255,255,255,255,255,255,255,
198,198,198, 0, 0, 0, 0, 0, 0, 28, 28, 28,255,255,255,
255,255,255,255,255,255,170,170,170,113,113,113,255,255,255,
255,255,255,255,255,255,113,113,113, 0, 0, 0, 0, 0, 0,
226,226,226,255,255,255,255,255,255,226,226,226, 0, 0, 0,
85, 85, 85,255,255,255,255,255,255,255,255,255,141,141,141,
0, 0, 0,170,170,170,255,255,255,255,255,255,255,255,255,
85, 85, 85, 0, 0, 0, 0, 0, 0,113,113,113,207,207,207,
226,226,226,170,170,170, 0, 0, 0,255,255,255,255,255,255,
255,255,255,226,226,226, 0, 0, 0, 0, 0, 0, 28, 28, 28,
255,255,255,255,255,255,255,255,255,170,170,170, 0, 0, 0,
3, 0, 2, 30, 0, 4,115, 8, 41,202, 63,102,185, 54, 85,
152, 47, 62, 98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0,
82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10,
24, 0, 5, 52, 6, 5, 78, 9, 12,208, 61, 65,238, 53, 58,
242, 51, 56,217, 69, 62, 90, 18, 19, 1, 0, 0, 0, 0, 0,
0, 0, 0,170,170,170,255,255,255,255,255,255,255,255,255,
113,113,113, 0, 0, 0, 0, 0, 0,198,198,198,255,255,255,
255,255,255,255,255,255, 77, 77, 77,255,255,255,255,255,255,
255,255,255,170,170,170, 0, 0, 0, 0, 0, 0, 85, 85, 85,
255,255,255,255,255,255,255,255,255,141,141,141,170,170,170,
255,255,255,255,255,255,255,255,255, 85, 85, 85, 0, 0, 0,
113,113,113,255,255,255,255,255,255,255,255,255,170,170,170,
0, 0, 0,113,113,113,255,255,255,255,255,255,255,255,255,
85, 85, 85, 0, 0, 0,141,141,141,255,255,255,255,255,255,
255,255,255,141,141,141, 0, 0, 0, 28, 28, 28,255,255,255,
255,255,255,255,255,255,198,198,198, 28, 28, 28,255,255,255,
255,255,255,255,255,255,170,170,170, 0, 0, 0, 0, 0, 0,
85, 85, 85,255,255,255,255,255,255,255,255,255,141,141,141,
0, 0, 0, 0, 0, 0, 0, 0, 0,115, 8, 41,202, 63,102,
185, 54, 85,152, 47, 62, 98, 33, 35, 75, 42, 32,125, 48, 55,
22, 7, 0, 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
62, 0, 10, 24, 0, 5, 32, 3, 0, 9, 0, 0, 64, 20, 18,
157, 34, 37,247, 50, 55,235, 54, 54,134, 28, 28, 22, 1, 0,
0, 0, 0, 0, 0, 0,141,141,141,255,255,255,255,255,255,
255,255,255,255,255,255,226,226,226,245,245,245,255,255,255,
255,255,255,255,255,255,141,141,141, 85, 85, 85,255,255,255,
255,255,255,255,255,255, 85, 85, 85, 0, 0, 0, 0, 0, 0,
141,141,141,255,255,255,255,255,255,255,255,255, 85, 85, 85,
141,141,141,255,255,255,255,255,255,255,255,255,245,245,245,
236,236,236,255,255,255,255,255,255,255,255,255,255,255,255,
170,170,170, 0, 0, 0,170,170,170,255,255,255,255,255,255,
255,255,255,238,238,238,113,113,113, 56, 56, 56,255,255,255,
255,255,255,255,255,255,255,255,255,236,236,236,245,245,245,
255,255,255,255,255,255,229,229,229, 28, 28, 28, 85, 85, 85,
255,255,255,255,255,255,255,255,255,113,113,113, 0, 0, 0,
0, 0, 0,141,141,141,255,255,255,255,255,255,255,255,255,
85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 8, 41,
202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 22, 7, 0, 82, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62, 0, 10, 26, 0, 4, 30, 2, 1, 79, 10, 13,
101, 28, 28, 40, 7, 7, 78, 15, 16,154, 31, 34,103, 27, 27,
23, 0, 0, 10, 1, 0, 0, 0, 0, 0, 0, 0,141,141,141,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,113,113,113, 0, 0, 0,170,170,170,
255,255,255,255,255,255,255,255,255, 56, 56, 56, 0, 0, 0,
0, 0, 0,170,170,170,255,255,255,255,255,255,255,255,255,
28, 28, 28, 28, 28, 28,229,229,229,255,255,255,255,255,255,
255,255,255,255,255,255,223,223,223,255,255,255,255,255,255,
255,255,255,170,170,170, 0, 0, 0,113,113,113,255,255,255,
255,255,255,255,255,255,255,255,255,113,113,113, 0, 0, 0,
85, 85, 85,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,204,204,204, 28, 28, 28, 0, 0, 0,
141,141,141,255,255,255,255,255,255,255,255,255, 85, 85, 85,
0, 0, 0, 0, 0, 0,170,170,170,255,255,255,255,255,255,
255,255,255, 28, 28, 28, 25, 1, 0, 0, 0, 0, 0, 0, 0,
115, 8, 41,201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35,
75, 42, 32,125, 48, 55, 22, 7, 0, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62, 0, 10, 26, 0, 4, 29, 2, 0,
74, 3, 0,192, 61, 61,233, 52, 56,164, 30, 36, 73, 11, 15,
35, 8, 9, 64, 7, 7, 19, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 28, 28, 28,103,103,103,141,141,141,141,141,141,
141,141,141, 85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28,103,103,103,
141,141,141,122,122,122, 56, 56, 56, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56, 56, 56,122,122,122,141,141,141,103,103,103, 28, 28, 28,
0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 85,141,141,141,
141,141,141,122,122,122, 56, 56, 56, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 30, 0, 0, 67, 5, 2, 0, 0, 0,
0, 0, 0,114, 7, 40,201, 62,105,185, 54, 85,152, 47, 64,
98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10, 26, 0, 4,
27, 2, 0, 72, 3, 0,189, 60, 63,233, 52, 56,254, 45, 55,
253, 44, 54,175, 37, 40, 81, 25, 24, 38, 3, 3, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 5, 5, 88, 26, 25,
0, 0, 0, 0, 0, 0,114, 7, 40,201, 62,105,185, 54, 85,
152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0,
82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10,
26, 0, 4, 27, 2, 0, 72, 3, 0,189, 60, 63,233, 50, 59,
254, 45, 55,254, 45, 55,249, 48, 58,238, 51, 56, 87, 18, 21,
11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3,
6, 1, 5, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 0, 0, 0, 0, 0, 0, 7, 2, 6, 7, 2, 6,
6, 5, 6, 4, 3, 4, 6, 6, 6, 6, 3, 5, 6, 3, 5,
7, 2, 6, 7, 2, 6, 7, 2, 6, 4, 3, 4, 6, 3, 5,
6, 3, 5, 6, 6, 6, 4, 3, 4, 6, 5, 6, 7, 2, 6,
7, 2, 6, 0, 0, 0, 0, 0, 0, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 6, 1, 5, 4, 0, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 81, 15, 18,159, 50, 52,
77, 4, 1, 0, 0, 0, 0, 0, 0,115, 8, 41,201, 62,105,
185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55,
22, 7, 0, 82, 36, 35,146, 47, 63,179, 52, 88,186, 63,106,
62, 0, 10, 26, 0, 4, 25, 2, 2, 66, 3, 0,185, 64, 64,
231, 52, 60,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
244, 46, 54,205, 45, 50, 66, 11, 13, 7, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 3, 0, 2, 6, 1, 5, 5, 1, 5, 2, 0, 2,
1, 0, 0, 1, 0, 1, 4, 1, 4, 6, 1, 5, 7, 2, 6,
7, 2, 6, 0, 0, 0, 0, 0, 0, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 3, 1, 3, 4, 1, 4, 6, 1, 5, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 0, 0, 0, 0, 0, 0,
7, 2, 6, 7, 2, 6, 6, 1, 5, 4, 1, 4, 1, 0, 1,
1, 0, 0, 2, 0, 2, 5, 1, 5, 6, 1, 5, 3, 0, 2,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 11, 1, 2,162, 28, 34,229, 51, 59,
185, 64, 64, 66, 3, 0, 0, 0, 0, 0, 0, 0,115, 8, 41,
202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 22, 7, 0, 82, 36, 35,148, 47, 63,179, 52, 88,
186, 63,106, 62, 0, 10, 26, 0, 4, 22, 4, 1, 56, 0, 1,
145, 41, 38,228, 53, 57,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 45, 55,253, 45, 55,240, 45, 54,155, 25, 30,
76, 13, 16, 15, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 15, 2, 3, 99, 17, 21,234, 41, 50,254, 45, 55,
228, 53, 57,145, 41, 38, 56, 0, 1, 0, 0, 0, 0, 0, 0,
115, 8, 41,202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35,
75, 42, 32, 92, 35, 38, 22, 7, 0, 82, 36, 35,148, 47, 63,
179, 52, 88,186, 63,106, 62, 0, 10, 26, 0, 4, 20, 4, 1,
50, 2, 0,140, 44, 39,226, 55, 59,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,253, 45, 55,
252, 45, 54,220, 39, 47,118, 20, 25, 9, 1, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 9, 1, 2,118, 20, 25,251, 44, 54,254, 45, 55,
254, 45, 55,226, 55, 59,140, 44, 39, 50, 2, 0, 0, 0, 0,
0, 0, 0,114, 7, 40,202, 63,102,185, 54, 85,152, 47, 64,
98, 33, 35, 75, 42, 32, 92, 35, 38, 22, 7, 0, 82, 36, 35,
146, 47, 63,179, 52, 88,186, 63,106, 62, 0, 10, 26, 0, 4,
20, 4, 1, 50, 2, 0,141, 38, 41,224, 55, 59,253, 46, 56,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
253, 45, 55,253, 45, 55,253, 45, 54,250, 44, 53,186, 32, 39,
59, 10, 12, 7, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7, 1, 1, 59, 10, 12,186, 32, 39,250, 44, 53,254, 45, 55,
254, 45, 55,253, 46, 56,224, 55, 59,141, 38, 41, 50, 2, 0,
0, 0, 0, 0, 0, 0,115, 8, 41,202, 63,102,185, 54, 85,
152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0,
82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10,
26, 0, 4, 20, 4, 1, 50, 1, 0,140, 44, 39,224, 55, 59,
253, 46, 56,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,253, 45, 55,253, 45, 54,
252, 44, 54,193, 34, 41, 69, 11, 15, 7, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7, 1, 1, 69, 11, 15,193, 34, 41,252, 44, 54,253, 45, 54,
254, 45, 55,254, 45, 55,253, 46, 56,224, 55, 59,140, 44, 39,
50, 1, 0, 0, 0, 0, 0, 0, 0,115, 8, 41,201, 62,105,
185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55,
22, 7, 0, 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
62, 0, 10, 26, 0, 4, 20, 4, 1, 48, 1, 0,107, 12, 8,
224, 53, 57,254, 47, 57,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
253, 45, 55,253, 45, 54,253, 44, 54,223, 38, 48,137, 24, 29,
39, 7, 8, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1,
39, 7, 8,137, 24, 29,223, 38, 48,253, 44, 54,253, 45, 54,
253, 45, 55,254, 45, 55,254, 45, 55,254, 47, 57,224, 53, 57,
107, 12, 8, 48, 1, 0, 0, 0, 0, 0, 0, 0,115, 8, 41,
201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 22, 7, 0, 82, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62, 0, 10, 26, 0, 4, 20, 4, 1, 48, 0, 1,
105, 12, 8,226, 53, 57,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,253, 44, 54,
251, 44, 54,194, 34, 41, 49, 8, 10, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49, 8, 10,194, 34, 41,251, 44, 54,253, 44, 54,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
226, 53, 57,105, 12, 8, 48, 0, 1, 0, 0, 0, 0, 0, 0,
115, 8, 41,201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35,
75, 42, 32,125, 48, 55, 22, 7, 0, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62, 0, 10, 26, 0, 6, 20, 4, 1,
48, 0, 1,105, 12, 8,227, 54, 58,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 44, 54,254, 45, 55,236, 41, 51, 85, 15, 18,
19, 3, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 12, 2, 2, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 12, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 19, 3, 4,
85, 15, 18,236, 41, 51,254, 45, 55,253, 44, 54,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,227, 54, 58,105, 12, 8, 48, 0, 1, 0, 0, 0,
0, 0, 0,115, 8, 41,201, 62,105,185, 52, 86,152, 45, 63,
98, 33, 35, 75, 42, 32, 92, 36, 38, 22, 7, 0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10, 26, 0, 6,
20, 4, 1, 48, 1, 0,102, 11, 7,224, 55, 59,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
252, 44, 54,138, 24, 29, 19, 3, 4, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 3, 4,
138, 24, 29,252, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,224, 55, 59,102, 11, 7, 48, 1, 0,
0, 0, 0, 0, 0, 0,115, 8, 41,201, 62,105,185, 52, 86,
152, 45, 63, 98, 33, 35, 75, 42, 32,125, 48, 55, 22, 7, 0,
82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10,
26, 0, 4, 18, 6, 1, 42, 5, 0,100, 7, 7,223, 54, 58,
254, 45, 55,254, 45, 55,253, 44, 54,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 47, 52,254, 46, 52,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,253, 44, 54,185, 32, 39, 63, 11, 13,
9, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 2, 63, 11, 13,
185, 32, 39,253, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
253, 44, 54,254, 45, 55,254, 45, 55,223, 54, 58,100, 7, 7,
42, 5, 0, 0, 0, 0, 0, 0, 0,115, 8, 41,201, 62,105,
185, 54, 85,152, 47, 64, 97, 32, 34, 75, 42, 32,125, 48, 55,
22, 7, 0, 82, 36, 35,146, 47, 63,179, 52, 88,186, 63,106,
62, 0, 10, 26, 0, 4, 16, 7, 0, 36, 8, 0,101, 18, 14,
221, 56, 60,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 47, 52,254, 47, 52,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,253, 44, 54,
241, 42, 51,117, 20, 24, 4, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1,117, 20, 24,
241, 42, 51,253, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,221, 56, 60,
101, 18, 14, 36, 8, 0, 0, 0, 0, 0, 0, 0,113, 8, 40,
201, 62,105,183, 54, 84,150, 47, 64, 94, 37, 35, 71, 43, 34,
142, 55, 64, 22, 7, 0, 82, 36, 35,148, 47, 63,179, 52, 88,
186, 63,106, 62, 0, 10, 26, 0, 4, 15, 7, 0, 32, 11, 0,
94, 20, 11,219, 58, 58,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 44, 54,247, 43, 53,113, 19, 23, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,113, 19, 23,
247, 43, 53,253, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
219, 58, 58, 94, 20, 11, 32, 11, 0, 0, 0, 0, 0, 0, 0,
113, 8, 40,201, 62,105,183, 54, 84,148, 47, 63, 85, 38, 36,
24, 6, 0,142, 55, 64, 22, 7, 0, 82, 36, 35,148, 47, 63,
179, 52, 88,186, 63,106, 62, 0, 10, 26, 0, 4, 11, 7, 0,
24, 11, 0, 88, 21, 15,217, 58, 58,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 54,247, 43, 52,
157, 27, 33, 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1,157, 27, 33,
247, 43, 52,254, 45, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,217, 58, 58, 88, 21, 15, 24, 11, 0, 0, 0, 0,
0, 0, 0,113, 8, 40,201, 62,105,183, 54, 84,146, 47, 63,
82, 36, 35, 30, 10, 4,142, 55, 64, 24, 7, 0, 84, 36, 35,
146, 47, 63,179, 52, 88,186, 63,106, 62, 0, 10, 26, 0, 4,
8, 7, 3, 11, 7, 0, 56, 2, 0,214, 55, 59,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,252, 44, 54,215, 37, 46, 60, 9, 12, 4, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 4, 0, 1, 60, 9, 12,215, 37, 46,
252, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,214, 55, 59, 56, 2, 0, 11, 7, 0,
0, 0, 0, 0, 0, 0,113, 8, 40,201, 62,105,183, 54, 84,
146, 47, 63, 82, 36, 35, 30, 10, 4,142, 55, 64, 24, 7, 0,
84, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62, 0, 10,
26, 0, 4, 7, 2, 6, 7, 2, 6, 48, 2, 0,212, 55, 59,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,253, 44, 54,252, 44, 54,
177, 30, 38, 32, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 32, 5, 6,177, 30, 38,252, 44, 54,
253, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,212, 55, 59, 48, 2, 0,
7, 2, 6, 0, 0, 0, 0, 0, 0,114, 7, 40,201, 62,105,
185, 54, 85,146, 47, 63, 82, 36, 35, 30, 10, 4,142, 55, 64,
30, 10, 4, 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
62, 0, 10, 26, 0, 4, 7, 2, 6, 7, 2, 6, 48, 2, 0,
212, 55, 59,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 44, 54,236, 41, 51,131, 22, 27, 57, 10, 12,
9, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9, 1, 2, 57, 10, 12,131, 22, 27,236, 41, 51,253, 44, 54,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,212, 55, 59,
48, 2, 0, 7, 2, 6, 0, 0, 0, 0, 0, 0,114, 7, 40,
201, 62,105,185, 54, 85,146, 47, 63, 82, 36, 35, 30, 9, 4,
142, 55, 64, 30, 10, 4, 82, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62, 0, 10, 26, 0, 4, 7, 2, 6, 7, 2, 6,
44, 2, 0,192, 59, 65,230, 51, 60,231, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
247, 43, 53,194, 33, 41,146, 25, 31,115, 20, 25, 57, 10, 12,
9, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 9, 1, 2, 57, 10, 12,115, 20, 25,
146, 25, 31,194, 33, 41,247, 43, 53,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,231, 50, 59,230, 51, 60,
192, 59, 65, 44, 2, 0, 7, 2, 6, 0, 0, 0, 0, 0, 0,
114, 7, 40,202, 63,106,185, 52, 86,146, 45, 64, 82, 35, 36,
30, 9, 4,142, 55, 64, 30, 10, 4, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62, 0, 10, 26, 0, 6, 6, 5, 3,
6, 5, 3, 30, 1, 1, 92, 5, 7,179, 62, 64,185, 60, 66,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,151, 31, 35, 53, 15, 16, 40, 15, 15, 34, 12, 12,
33, 11, 11, 35, 11, 11, 53, 15, 16,151, 31, 35,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,185, 60, 66,
179, 62, 64, 92, 5, 7, 30, 1, 1, 6, 5, 3, 0, 0, 0,
0, 0, 0,115, 8, 41,201, 62,105,185, 52, 86,146, 45, 64,
82, 35, 36, 30, 9, 4,142, 55, 64, 30, 10, 4, 82, 36, 35,
146, 47, 63,177, 54, 86,186, 63,106, 62, 0, 10, 24, 0, 6,
6, 5, 3, 6, 5, 3, 18, 3, 1, 48, 2, 0, 62, 2, 0,
68, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0, 72, 3, 0,
68, 3, 0, 62, 2, 0, 48, 2, 0, 18, 3, 1, 6, 5, 3,
0, 0, 0, 0, 0, 0,115, 8, 41,201, 62,105,185, 52, 86,
146, 45, 64, 82, 36, 35, 30, 9, 4,142, 55, 64, 30, 9, 4,
82, 36, 35,146, 47, 63,177, 54, 86,186, 63,106, 62, 0, 10,
24, 0, 5, 8, 3, 5, 7, 2, 6, 9, 5, 2, 20, 3, 1,
23, 2, 2, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0, 27, 2, 0,
27, 2, 0, 27, 2, 0, 23, 2, 2, 20, 3, 1, 9, 5, 2,
7, 2, 6, 0, 0, 0, 0, 0, 0,115, 8, 41,201, 62,105,
185, 54, 85,146, 45, 64, 82, 36, 35, 30, 10, 4,142, 55, 64,
30, 9, 4, 82, 36, 35,148, 49, 63,178, 55, 84,186, 63,106,
62, 0, 10, 24, 0, 5, 8, 3, 5, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 5, 7, 2, 5, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 30, 0, 4,115, 8, 41,
202, 63,102,185, 54, 85,146, 47, 63, 82, 36, 35, 30, 10, 4,
142, 55, 64, 30, 10, 4, 84, 35, 36,150, 49, 61,182, 55, 85,
187, 64,107, 62, 0, 8, 22, 0, 4, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 7, 2, 6, 7, 2, 6, 8, 3, 7,
8, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 6, 4, 3, 6, 4, 3,
7, 6, 3, 7, 6, 3, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 30, 0, 4,
115, 8, 41,202, 63,102,186, 55, 82,148, 49, 63, 82, 35, 36,
60, 23, 21,142, 55, 64, 30, 10, 4, 84, 35, 36,152, 51, 60,
166, 39, 63,190, 63,105, 64, 0, 9, 26, 0, 4, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 6, 1, 5, 6, 1, 5,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 8, 3, 7, 8, 3, 7, 8, 3, 7,
8, 3, 7, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
8, 3, 7, 8, 3, 7, 7, 2, 6, 7, 2, 6, 8, 3, 7,
8, 3, 7, 8, 3, 7, 8, 3, 7, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 6, 4, 3,
6, 4, 3, 7, 6, 3, 7, 6, 3, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
30, 0, 4,113, 6, 41,200, 61,104,165, 36, 63,146, 49, 63,
81, 35, 34, 30, 7, 4,142, 55, 64, 30, 10, 4, 84, 36, 35,
156, 55, 60,169, 42, 63,194, 63,106, 70, 0, 9, 28, 0, 5,
7, 2, 6, 7, 2, 6, 6, 1, 5, 7, 2, 6, 7, 2, 6,
8, 3, 7, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6, 7, 2, 6,
7, 2, 6, 30, 0, 4,110, 5, 42,196, 59,104,158, 35, 64,
141, 50, 65, 81, 34, 35, 26, 3, 0,142, 55, 64, 60, 23, 21,
82, 38, 35, 97, 10, 8,165, 46, 60,188, 59, 92, 90, 0, 19,
38, 0, 4, 16, 3, 3, 13, 5, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2, 11, 7, 2,
13, 5, 2, 18, 1, 3, 41, 0, 3,147, 32, 70,188, 53, 94,
240,129,153,211,132,143,184,143,146, 58, 39, 37,172,168,163,
125, 48, 55, 73, 39, 36,108, 31, 31,158, 57, 59,164, 43, 63,
171, 60, 84, 58, 0, 2, 36, 0, 3, 27, 3, 0, 22, 7, 0,
22, 6, 0, 22, 6, 0, 22, 7, 0, 24, 8, 0, 22, 6, 0,
22, 6, 0, 22, 7, 0, 22, 7, 0, 22, 6, 0, 22, 6, 0,
22, 7, 0, 22, 7, 0, 22, 6, 0, 22, 6, 0, 22, 7, 0,
22, 7, 0, 22, 6, 0, 22, 6, 0, 22, 7, 0, 22, 7, 0,
22, 7, 0, 22, 7, 0, 22, 7, 0, 22, 7, 0, 22, 6, 0,
22, 6, 0, 22, 7, 0, 22, 7, 0, 22, 7, 0, 22, 7, 0,
22, 7, 0, 22, 7, 0, 22, 6, 0, 22, 6, 0, 22, 7, 0,
22, 7, 0, 22, 6, 0, 22, 6, 0, 22, 7, 0, 22, 7, 0,
22, 6, 0, 22, 6, 0, 22, 7, 0, 22, 7, 0, 22, 6, 0,
22, 6, 0, 22, 7, 0, 22, 7, 0, 22, 6, 0, 22, 6, 0,
22, 7, 0, 22, 7, 0, 22, 6, 0, 22, 6, 0, 22, 7, 0,
22, 6, 0, 22, 6, 0, 22, 6, 0, 22, 6, 0, 22, 7, 0,
22, 6, 0, 22, 6, 0, 22, 7, 0, 22, 7, 0, 24, 6, 0,
24, 6, 0, 22, 7, 0, 22, 7, 0, 22, 6, 0, 22, 6, 0,
22, 7, 0, 29, 2, 0, 40, 0, 2,102, 17, 39,199, 68,102,
169, 32, 64,174, 79, 95,148, 87, 94,208,177,180,173,164,164,
254,252,251,142, 55, 64, 28, 4, 0, 91, 36, 32, 90, 13, 9,
160, 53, 58,160, 47, 63,168, 73, 91, 76, 1, 13, 89, 36, 34,
84, 36, 35, 82, 36, 35, 82, 36, 35, 81, 35, 34, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 35, 36,
82, 35, 36, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 35, 36, 82, 35, 36, 82, 36, 35,
82, 36, 35, 82, 35, 36, 82, 35, 36, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 35, 36, 82, 35, 36, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
84, 36, 35, 84, 36, 35, 84, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 84, 35, 36, 91, 34, 35,133, 52, 67,176, 69, 92,
170, 39, 63,166, 43, 63,163, 88, 95,126, 85, 86,148,129,130,
227,223,222,166,165,163,142, 55, 64,142, 55, 64, 32, 3, 0,
92, 35, 33, 98, 9, 7,166, 53, 56,164, 51, 59,160, 51, 58,
157, 54, 58,152, 53, 60,167, 68, 82,165, 66, 82,168, 67, 83,
167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,
165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,
165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,
167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,
167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,
165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,
165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,
167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,
167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,
165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,
165, 66, 82,167, 66, 82,167, 66, 82,165, 64, 83,165, 64, 83,
167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,
167, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,167, 66, 82,
165, 66, 82,167, 68, 82,152, 53, 60,156, 53, 60,162, 49, 60,
166, 49, 58,169, 50, 56,101, 4, 7, 89, 34, 34, 26, 2, 0,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
92, 35, 38, 73, 39, 36,101, 32, 34, 96, 13, 9,101, 6, 6,
155, 56, 58,154, 55, 57,152, 53, 60,148, 49, 63,146, 45, 64,
148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,
148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,
146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,
146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,
148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,
148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,
146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,
146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,
148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,
148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,
146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,
146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,
148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,
148, 47, 63,146, 47, 63,147, 48, 62,152, 51, 60,155, 54, 59,
155, 56, 58,100, 5, 5, 96, 13, 9,101, 33, 32, 73, 40, 34,
92, 35, 38,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64, 76, 28, 30, 30, 2, 0, 76, 38, 35,
82, 35, 35, 85, 36, 34, 85, 36, 34, 84, 35, 36, 82, 36, 35,
82, 35, 36, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 84, 35, 36,
85, 36, 37, 85, 36, 34, 82, 35, 35, 77, 39, 36, 32, 3, 0,
92, 35, 38,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
125, 48, 55, 60, 22, 21, 30, 9, 4, 30, 9, 4, 30, 9, 4,
30, 9, 4, 30, 9, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4,
30, 10, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4,
30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4,
30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4,
30, 10, 4, 30, 10, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4,
30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 10, 4, 30, 10, 4,
30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4,
30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4,
30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4,
30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4,
30, 10, 4, 30, 10, 4, 30, 10, 4, 30, 10, 4, 30, 10, 4,
30, 10, 4, 30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4,
30, 9, 4, 30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4,
30, 9, 4, 30, 10, 4, 30, 10, 4, 30, 9, 4, 30, 9, 4,
30, 8, 4, 30, 9, 4, 30, 9, 4, 60, 22, 21,125, 48, 55,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64};
1.1 snatch/x11.c
Index: x11.c
===================================================================
/* X11 layer of subversion library to intercept RealPlayer socket and
device I/O. --Monty 20011101 */
#include <stdio.h>
#include <errno.h>
#include <sys/time.h>
#include "snatchppm.h"
static int savefile=-1;
tatic unsigned long window_id_base=0;
static unsigned long window_id_mask=0;
tatic unsigned long rpshell_window=0;
static unsigned long rpmain_window=0;
static unsigned long rpmenu_window=0;
static unsigned long rpplay_window=0;
static unsigned long rpplay_width=0;
static unsigned long rpplay_height=0;
tatic unsigned long logo_x=0;
static unsigned long logo_y=0;
static unsigned long logo_prev=-1;
tatic unsigned long play_blackleft=-1;
static unsigned long play_blackright=-1;
static unsigned long play_blackupper=-1;
static unsigned long play_blacklower=-1;
tatic unsigned long rpvideo_window=0;
static int video_width=-1;
static int video_length=-1;
static int bigendian_p=0;
/* Built out of a few pieces of xscope by James Peterson, 1988
xscope is (c) Copyright MCC, 1988 */
tatic int littleEndian;
tatic unsigned long ILong(unsigned char *buf){
if(littleEndian)
return((((((buf[3] << 8) | buf[2]) << 8) | buf[1]) << 8) | buf[0]);
return((((((buf[0] << 8) | buf[1]) << 8) | buf[2]) << 8) | buf[3]);
}
tatic unsigned short IShort(unsigned char *buf){
if(littleEndian)
return (buf[1] << 8) | buf[0];
return((buf[0] << 8) | buf[1]);
}
tatic unsigned short IByte (unsigned char *buf){
return(buf[0]);
}
tatic void SetUpReply(unsigned char *buf){
if(IByte(&buf[0])){
window_id_base=ILong(&buf[12]);
window_id_mask=ILong(&buf[16]);
bigendian_p=IByte(&buf[30]);
if(debug){
fprintf(stderr,
" ...: RealPlayer X setup\n"
" window id base = %lx\n"
" window id mask = %lx\n"
" server image endianness = %s\n",
window_id_base,window_id_mask,(bigendian_p?"big":"small"));
}
}
}
tatic void CreateWindow(unsigned char *buf){
unsigned long id=ILong(&buf[4]);
unsigned long parent=ILong(&buf[8]);
if((id & ~window_id_mask) == window_id_base){
if(parent==rpshell_window){
rpmain_window=id;
rpplay_window=0;
if(debug)
fprintf(stderr,
" ...: RealPlayer main window id=%lx\n",rpmain_window);
}else if(rpshell_window){
if(parent==rpmain_window){
if(!rpplay_window){
rpplay_window=id;
if(debug)
fprintf(stderr,
" ...: RealPlayer console window id=%lx\n",rpplay_window);
}else{
rpmenu_window=id;
}
}else if(parent==rpplay_window){
rpvideo_window=id;
if(debug)
fprintf(stderr,
" ...: RealPlayer video window id=%lx\n",rpvideo_window);
}
}
}
}
tatic void ConfigureWindow(unsigned char *buf){
unsigned long id=ILong(&buf[4]);
if(id==rpplay_window){
unsigned long bitmask=IShort(&buf[8]);
int i,count=0;
for(i=0;i<16;i++){
unsigned long testmask=1<<i;
unsigned long val;
if(bitmask & testmask){
if(bigendian_p)
val=IShort(&buf[12+count+2]);
else
val=IShort(&buf[12+count]);
if(testmask==0x4){ /* width */
rpplay_width=val;
}
if(testmask==0x8){ /* height */
rpplay_height=val;
}
count+=4;
}
}
}
}
tatic void ChangeProperty(unsigned char *buf){
long n;
unsigned long id=ILong(&buf[4]);
long property=ILong(&buf[8]);
long type=ILong(&buf[12]);
long format=ILong(&buf[16]);
char *data;
if(rpshell_window==0){
if(property==67 && type==31){ /* WM_CLASS and STRING */
n = ILong(&buf[20])*format/8;
data=&buf[24];
if(debug)
fprintf(stderr,
" ...: looking for our shell window...\n"
" candidate: id=%lx, name=%s class=%s\n",
id,(data?data:""),(data?strchr(data,'\0')+1:""));
if(n>26 && !memcmp(data,"RealPlayer\0RCACoreAppShell\0",27)){
/* it's our shell window above the WM parent */
rpshell_window=id;
/* re-setup */
rpmain_window=0;
rpmenu_window=0;
rpplay_window=0;
rpplay_width=0;
rpplay_height=0;
logo_x=0;
logo_y=0;
logo_prev=-1;
rpvideo_window=0;
video_width=-1;
video_length=-1;
if(debug)
fprintf(stderr," GOT IT!\n");
}else{
if(debug)
fprintf(stderr," nope...\n");
}
}
}
}
tatic void PutImage(unsigned char *buf){
int id=ILong(&buf[4]);
if(id==rpvideo_window){
int width=IShort(&buf[12])+IByte(&buf[20]);
int height=IShort(&buf[14]);
int n = width*height*4,i,j;
char *work=alloca(n+1),*ptr=&buf[24],charbuf[80];
static long ZeroTime1 = -1;
static long ZeroTime2 = -1;
static struct timeval tp;
static long lastsec = 0;
long sec /* seconds */ ;
long hsec /* hundredths of a second */ ;
//if(savefile==-1)
//savefile=open("realplayer-out.ppm",O_RDWR|O_APPEND|O_CREAT,0770);
(void)gettimeofday(&tp, (struct timezone *)NULL);
if (ZeroTime1 == -1 || (tp.tv_sec - lastsec) >= 1000)
{
ZeroTime1 = tp.tv_sec;
ZeroTime2 = tp.tv_usec / 10000;
}
lastsec = tp.tv_sec;
sec = tp.tv_sec - ZeroTime1;
hsec = tp.tv_usec / 10000 - ZeroTime2;
if (hsec < 0)
{
hsec += 100;
sec -= 1;
}
sprintf(charbuf,"P6\n# time %ld.%08ld\n%d %d 255\n",sec,hsec,width, height);
//write(savefile,charbuf,strlen(charbuf));
for(i=0,j=0;i<n;i+=4){
work[j++]=ptr[i+2];
work[j++]=ptr[i+1];
work[j++]=ptr[i];
}
work[j++]='\n';
//write(savefile,work,j);
}
/* Subvert the Real sign on logo; paste the Snatch logo in.
Although this might seem like a vanity issue, the primary reason
for doing this is to give the user a clear indication Snatch is
working properly, so some care should be taken to get it right. */
if(id==rpplay_window){
int width=IShort(&buf[12])+IByte(&buf[20]);
int height=IShort(&buf[14]);
int x=IShort(&buf[16]);
int y=IShort(&buf[18]);
char *ptr=&buf[24];
long i,j,k;
if(x==0 && width==rpplay_width){
if(y==0){
play_blackupper=42;
play_blacklower=-1;
play_blackleft=-1;
play_blackright=-1;
}
if(y<=play_blackupper && y+width>play_blackupper){
for(play_blackleft=20;play_blackleft>0;play_blackleft--)
if(ptr[(play_blackupper-y)*width*4+play_blackleft*4+1]!=0)break;
play_blackleft++;
for(play_blackright=width-20;play_blackright<width;play_blackright++)
if(ptr[(play_blackupper-y)*width*4+play_blackright*4+1]!=0)break;
}
if(play_blacklower==-1){
play_blacklower=42;
if(y>play_blacklower)play_blacklower=y;
for(;play_blacklower<y+height;play_blacklower++)
if(ptr[(play_blacklower-y)*width*4+81]!=0)break;
if(play_blacklower==y+height)play_blacklower=-1;
}
}
/* after a resize, look where to put the logo... */
if(x==0 && y<rpplay_height/2 && width==rpplay_width){
if(y<=logo_prev)
logo_y=-1;
if(logo_y==-1){
/* look for the real logo in the data; it's in the middle of the
big black block */
int test;
for(test=play_blackupper;test<height+y;test++)
if(test>=y)
if(ptr[(test-y)*width*4+(width/2*4)+1]!=0)break;
if(test<height+y &&
(test+snatchheight<play_blacklower || play_blacklower==-1) &&
test!=y){
logo_y=test;
/* verify enough room to display... */
if(test<50){
long blacklower;
for(blacklower=test;blacklower<y+height;blacklower++)
if(ptr[(blacklower-y)*width*4+(20*4)+1]!=0)break;
if(blacklower-test<snatchheight)logo_y=-1;
}
}
}
logo_prev=y;
logo_x=(width/2)-(snatchwidth/2);
}
/* blank background */
if(bigendian_p){
int lower=(play_blacklower==-1?y+height:play_blacklower);
for(i=play_blackupper;i<lower;i++)
if(i>=y && i<y+height)
for(j=play_blackleft;j<play_blackright;j++)
if(j>=x && j<x+width){
ptr[(i-y)*width*4+(j-x)*4]=0x00;
ptr[(i-y)*width*4+(j-x)*4+1]=snatchppm[0];
ptr[(i-y)*width*4+(j-x)*4+2]=snatchppm[1];
ptr[(i-y)*width*4+(j-x)*4+3]=snatchppm[2];
}
}else{
int lower=(play_blacklower==-1?y+height:play_blacklower);
for(i=play_blackupper;i<lower;i++)
if(i>=y && i<y+height)
for(j=play_blackleft;j<play_blackright;j++)
if(j>=x && j<x+width){
ptr[(i-y)*width*4+(j-x)*4+3]=0x00;
ptr[(i-y)*width*4+(j-x)*4+2]=snatchppm[0];
ptr[(i-y)*width*4+(j-x)*4+1]=snatchppm[1];
ptr[(i-y)*width*4+(j-x)*4]=snatchppm[2];
}
}
/* paint logo */
if(logo_y!=-1){
for(i=0;i<snatchheight;i++){
if(i+logo_y>=y && i+logo_y<height+y){
char *snatch=snatchppm+snatchwidth*3*i;
char *real;
long end;
k=x-logo_x;
if(k<0)k=0;
end=x+snatchwidth-logo_x;
j=(logo_x-x)*4;
if(j<0)j=0;
real=ptr+width*4*(i+logo_y-y);
snatch=snatchppm+snatchwidth*3*i;
if(bigendian_p){
for(k*=3;k<snatchwidth*3 && j<width*4;){
real[++j]=snatch[k++];
real[++j]=snatch[k++];
real[++j]=snatch[k++];
++j;
}
}else{
for(k*=3;k<snatchwidth*3 && j<width*4;j+=4){
real[j+2]=snatch[k++];
real[j+1]=snatch[k++];
real[j]=snatch[k++];
}
}
}
}
}
}
}
/* Client-to-Server and Server-to-Client interception processing */
/* Here are the most in-tact bits of xscope */
struct ConnState {
unsigned char *SavedBytes;
long SizeofSavedBytes;
long NumberofSavedBytes;
long NumberofBytesNeeded;
long (*ByteProcessing)();
};
static struct ConnState serverCS;
static struct ConnState clientCS;
tatic void DecodeRequest(unsigned char *buf,long n){
int Request = IByte (&buf[0]);
switch (Request){
case 1:
CreateWindow(buf);
break;
case 12:
ConfigureWindow(buf);
break;
case 18:
ChangeProperty(buf);
break;
case 72:
PutImage(buf);
break;
}
}
tatic long DataToServer(unsigned char *buf,long n){
long togo=n;
unsigned char *p=buf;
while(togo>0){
int bw=(*libc_write)(X_fd,p,togo);
if(bw<0 && (errno==EAGAIN || errno==EINTR))bw=0;
if(bw>=0)
p+=bw;
else
return(bw);
togo-=bw;
}
return(0);
}
tatic void SaveBytes(struct ConnState *cs,unsigned char *buf,long n){
/* check if there is enough space to hold the bytes we want */
if (cs->NumberofSavedBytes + n > cs->SizeofSavedBytes){
long SizeofNewBytes = (cs->NumberofSavedBytes + n + 1);
if(cs->SavedBytes)
cs->SavedBytes = realloc(cs->SavedBytes,SizeofNewBytes);
else
cs->SavedBytes = malloc(SizeofNewBytes);
cs->SizeofSavedBytes = SizeofNewBytes;
}
/* now copy the new bytes onto the end of the old bytes */
memcpy(cs->SavedBytes + cs->NumberofSavedBytes,buf,n);
cs->NumberofSavedBytes += n;
}
tatic void RemoveSavedBytes(struct ConnState *cs,long n){
/* check if all bytes are being removed -- easiest case */
if (cs->NumberofSavedBytes <= n)
cs->NumberofSavedBytes = 0;
else if (n == 0)
return;
else{
/* not all bytes are being removed -- shift the remaining ones down */
memmove(cs->SavedBytes,cs->SavedBytes+n,cs->NumberofSavedBytes - n);
cs->NumberofSavedBytes -= n;
}
}
tatic long pad(long n){
return((n + 3) & ~0x3);
}
tatic long FinishRequest(struct ConnState *cs,unsigned char *buf,long n);
tatic long StartRequest(struct ConnState *cs,unsigned char *buf,long n){
unsigned short requestlength;
/* bytes 0,1 are ignored now; bytes 2,3 tell us the request length */
requestlength = IShort(&buf[2]);
cs->ByteProcessing = FinishRequest;
cs->NumberofBytesNeeded = 4 * requestlength;
return(0);
}
tatic long FinishSetUpMessage(struct ConnState *cs,unsigned char *buf,long n){
littleEndian = (buf[0] == 'l');
cs->ByteProcessing = StartRequest;
cs->NumberofBytesNeeded = 4;
return(n);
}
tatic long StartSetUpMessage(struct ConnState *cs,unsigned char *buf,long n){
short namelength;
short datalength;
namelength = IShort(&buf[6]);
datalength = IShort(&buf[8]);
cs->ByteProcessing = FinishSetUpMessage;
cs->NumberofBytesNeeded = n + pad((long)namelength) + pad((long)datalength);
return(0);
}
tatic long FinishRequest(struct ConnState *cs,unsigned char *buf,long n){
DecodeRequest(buf, n);
cs->ByteProcessing = StartRequest;
cs->NumberofBytesNeeded = 4;
return(n);
}
/* ************************************************************ */
tatic long FinishSetUpReply(struct ConnState *cs,unsigned char *buf,long n){
SetUpReply(buf);
cs->ByteProcessing = NULL; /* no further reason to watch the stream */
cs->NumberofBytesNeeded = 0;
return(n);
}
tatic long StartSetUpReply(struct ConnState *cs,unsigned char *buf,long n){
int replylength = IShort(&buf[6]);
cs->ByteProcessing = FinishSetUpReply;
cs->NumberofBytesNeeded = n + 4 * replylength;
return(0);
}
tatic void StartClientConnection(void){
memset(&clientCS,0,sizeof(clientCS));
clientCS.ByteProcessing = StartSetUpMessage;
clientCS.NumberofBytesNeeded = 12;
}
tatic void StopClientConnection(void){
if (clientCS.SizeofSavedBytes > 0)
free(clientCS.SavedBytes);
memset(&clientCS,0,sizeof(clientCS));
}
tatic void StartServerConnection(void){
memset(&serverCS,0,sizeof(clientCS));
serverCS.ByteProcessing = StartSetUpReply;
serverCS.NumberofBytesNeeded = 8;
}
tatic void StopServerConnection(void){
if(serverCS.SizeofSavedBytes > 0)
free(serverCS.SavedBytes);
memset(&serverCS,0,sizeof(clientCS));
}
tatic void ProcessBuffer(struct ConnState *cs,unsigned char *buf,long n,
long (*w)(unsigned char *,long)){
unsigned char *BytesToProcess;
long NumberofUsedBytes;
while (cs->ByteProcessing && /* we turn off watching replies from
the server after grabbing set up */
cs->NumberofSavedBytes + n >= cs->NumberofBytesNeeded){
if (cs->NumberofSavedBytes == 0){
/* no saved bytes, so just process the first bytes in the
read buffer */
BytesToProcess = buf /* address of request bytes */;
}else{
if (cs->NumberofSavedBytes < cs->NumberofBytesNeeded){
/* first determine the number of bytes we need to
transfer; then transfer them and remove them from
the read buffer. (there may be additional requests
in the read buffer) */
long m;
m = cs->NumberofBytesNeeded - cs->NumberofSavedBytes;
SaveBytes(cs, buf, m);
buf += m;
n -= m;
}
BytesToProcess = cs->SavedBytes /* address of request bytes */;
}
NumberofUsedBytes = (*cs->ByteProcessing)
(cs, BytesToProcess, cs->NumberofBytesNeeded);
/* *After* we've processed the buffer (and possibly caused side
effects), we ship the request off to the recipient */
if(w)(*w)(BytesToProcess,NumberofUsedBytes);
/* the number of bytes that were actually used is normally (but not
always) the number of bytes needed. Discard the bytes that were
actually used, not the bytes that were needed. The number of used
bytes must be less than or equal to the number of needed bytes. */
if (NumberofUsedBytes > 0){
if (cs->NumberofSavedBytes > 0)
RemoveSavedBytes(cs, NumberofUsedBytes);
else{
/* there are no saved bytes, so the bytes that were
used must have been in the read buffer */
buf += NumberofUsedBytes;
n -= NumberofUsedBytes;
}
}
} /* end of while (NumberofSavedBytes + n >= NumberofBytesNeeded) */
/* not enough bytes -- just save the new bytes for more later */
if (cs->ByteProcessing && n > 0)
SaveBytes(cs, buf, n);
return;
}
--- >8 ----
List archives: http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'cvs-request at xiph.org'
containing only the word 'unsubscribe' in the body. No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.
More information about the commits
mailing list