[comp.sys.amiga] Arctic Fox & Fast Ram

sjf@onion.cs.reading.ac.uk (Steve Fisher) (01/11/88)

I have an A500 (PAL version) and have just fitted an A501.
Arctic Fox works fine in A500 but with expansion memory it crashes!
Does anyone have a fix for this, either a fixhunk or equivalent
to stop AFox using fast ram.

--
//  --   Steve Fisher   Micro. Unit. Computer Science Dept.
\\ |--        &                                      >  Reading University
//.||.   Shawn Fraser   Cybernetics Dept.
-- 
//  --   Steve Fisher   Micro. Unit. Computer Science Dept.
\\ |--        &                                      >  Reading University
//.||.   Shawn Fraser   Cybernetics Dept.

soo@beach.cis.ufl.edu (Chong L Soo) (01/16/88)

In article <662@onion.cs.reading.ac.uk> sjf@onion.cs.reading.ac.uk (Steve Fisher) writes:
>
>I have an A500 (PAL version) and have just fitted an A501.
>Arctic Fox works fine in A500 but with expansion memory it crashes!
>Does anyone have a fix for this, either a fixhunk or equivalent
>to stop AFox using fast ram.

Bug Bytes in the latest issue (volume 3.1) of Amazing Computing mentioned
an upgraded Arctic Fox that will run correctly under 1.2 with > 512k.  You
have to return the ENTIRE original packege (why?) and it costs US$7.50.
--
-------------------------------------------------------------------------------
Chong Soo (Amiga nut)			  soo@beach.cis.ufl.edu
			ARPANET/INTERNET  soo%ufcsg.ufl.edu@relay.cs.net
			BITNET		  soo%ufcsg.ufl.edu%relay.cs.net@wiscvm

terry@micomvax.UUCP (Terry Fisher) (02/02/88)

In article <10207@ufcsv.cis.ufl.EDU> soo@beach.cis.ufl.edu (Chong L Soo) writes:
>In article <662@onion.cs.reading.ac.uk> sjf@onion.cs.reading.ac.uk (Steve Fisher) writes:
>>
>>I have an A500 (PAL version) and have just fitted an A501.
>>Arctic Fox works fine in A500 but with expansion memory it crashes!
>>Does anyone have a fix for this, either a fixhunk or equivalent
>>to stop AFox using fast ram.
>
>Bug Bytes in the latest issue (volume 3.1) of Amazing Computing mentioned
>an upgraded Arctic Fox that will run correctly under 1.2 with > 512k.  You
>have to return the ENTIRE original packege (why?) and it costs US$7.50.
>--
>-------------------------------------------------------------------------------
>Chong Soo (Amiga nut)			  soo@beach.cis.ufl.edu
>			ARPANET/INTERNET  soo%ufcsg.ufl.edu@relay.cs.net
>			BITNET		  soo%ufcsg.ufl.edu%relay.cs.net@wiscvm

Here is a little utility that I threw together to get some of
my old software to run when I upgraded to 1Meg.  I hope you
find it useful, and if you don't like my code, I'm sorry, I put
it together in a hurry.

Terry Fisher.

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:    Shell Archiver
#	Run the following text with /bin/sh to create:
#	Makefile
#	README
#	hunker.c
#	hunker.h
#	hunker.uue
# This archive created: Sun Jul 26 23:49:39 1987
cat << \SHAR_EOF > Makefile
Hunker:	hunk.o
	cc -o Hunker hunk.o

hunk.o: hunk.c hunk.h
	cc -c hunk.c
SHAR_EOF
cat << \SHAR_EOF > README
History of this program:
	This program was written by Terry Fisher.  Its purpose: to fix some of
those nasty programs that were written before people started using fast memory.
Now, it can also be used as a valuable 'C' development tool, similar in function
to the Assembly language Atom utility.  By running this program on your
executable, you can avoid having to copy image data into chip memory.  Simply
put 'Hunker <file> d=c' into your Makefile, and all initialized data will
be loaded into chip memory automatically.

Usage:
	This program can only be used from the CLI. The format for invocation
is:  Hunker <file> [-v] [c/d/b]=[c/f/e]

Order is not important except that the file name must be the first arguement.
The other arguements may be typed in any order. Their meanings follow.

-v		sets verbose mode.  It isn't really useful, but its there.

[c/d/b]=[c/f/e]	These are the switches which specify where each hunk type are
		to be loaded into memory.  The characters on the left of the
		'=' are the hunk type.  The characters on the right are the
		type of memory to load these hunks into.
		ie d=c would put all data hunks into chip memory
		   c=f would put all code hunks into fast memory
		   b=e would put all uninitialized data into either chip or fast

		Note: to change more than one type of hunk at one time, you
			must have a separate argument for each hunk type.
		ie 	to load data into chip memory, and code into fast,
			the CLI command would be:
			Hunker <file> d=c c=f

Distribution:
	Hunker may be freely distributed as long as: this README file is
kept with it, and it is not included in any commercial distributions without
my consent.  If you find this program useful, and it is going to save you
several hours, I would appreciate any contribution. (If its going to make
your $50 commercial software run, I feel I deserve a small contribution :-)

Terry Fisher,
RR #2,
Harriston, Ontario, Canada.
N0G 1Z0

See also the section on ATOM in the Bantam AmigaDos Manual.

Thanks to Carolyn Scheppner at CATS for helping figure out how the loader
works.
SHAR_EOF
cat << \SHAR_EOF > hunker.c
#include <stdio.h>
#include <libraries/dosextens.h>
#include <functions.h>
#include "hunk.h"
#include <exec/types.h>

#define	DC	SET_UNCHANGED		/* dont change flag */

int	first = 0, last = 1, current, listsize;
struct	FileHandle *fd;
ULONG	codemem=DC, datamem=DC, bssmem=DC, memtype(), *changelist = NULL;
BOOL	verbose = FALSE;

main(argc, argv)
int	argc;
char	**argv;
{
	int	i = 2;

	if (argc < 3)
	{
		show_usage(argv[0]);
	}
	while (i < argc)
	{
		if (argv[i][0] == '-')
		{
			if (argv[i][1] == VERBOSE_FLAG) {
				verbose = TRUE;
			}
		}
		else if ((argv[i][1] != '=') && (argv[i][0] != '-'))
		{
			show_usage(argv[0]);
			exit(0);
		}
		else {
			set_mem_flags(argv[i]);
		}
		i++;
	}
	if ((fd = Open(argv[1],MODE_OLDFILE))==NULL)
	{
		printf("Sorry, file: %s not found\n",argv[1]);
		exit(10);
	}
	processfile();
	fixhunk();
	Exit();
}

/***********************************************************************
*
*  ROUTINE:	memtype
*
*  IMPORTS:	char	type;		character after '=' in CLI arg
*
*  RETURNS:	ULONG	memtype;	memory specification long word
*
*  DESCRIPTION:	returns the mask for the type of memory specified by
*		the character after the '=' in a CLI argument
*
***********************************************************************/

ULONG	memtype(type)
char	type;
{
	ULONG	settype;

	switch (type)
	{
	case	SPEC_CHIP:
		settype = SET_CHIP;
		break;

	case	SPEC_FAST:
		settype	= SET_FAST;
		break;

	case	SPEC_EITHER:
		settype = SET_EITHER;
		break;

	default:
		settype = SET_UNCHANGED;
	}
	return(settype);
}
		
/***********************************************************************
*
*  ROUTINE:	processfile
*
*  IMPORTS:	none
*
*  RETURNS:	none
*
*  DESCRIPTION:	reads through the file until the last hunk has bee processed
*
***********************************************************************/

processfile()
{
	ULONG	hunk, readlong();

	while (first <= last)
	{
		hunk = (readlong());
		if (verbose) {
			printf("Hunk type %x\n", hunk);
		}
		processhunk(hunk);
	}
}

/***********************************************************************
*
*  ROUTINE:	readlong
*
*  IMPORTS:	NONE
*
*  RETURNS:	ULONG	data;	long word read from the file
*
*  DESCRIPTION:	reads the next long word in the file
*
***********************************************************************/

ULONG	readlong()
{
	ULONG	hunk[2];
	int	bytes;

	if ((bytes = Read(fd, hunk, sizeof(ULONG))) < sizeof(ULONG))
	{
		printf("could not read full long word\n");
		Exit(0);
	}
	return(hunk[0]);
}

/***********************************************************************
*
*  ROUTINE:	processhunk
*
*  IMPORTS:	ULONG	hunk;	hunk type
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	calls the handler routine for the specified hunk type
*
***********************************************************************/

processhunk(hunk)
ULONG	hunk;
{
	switch (hunk)
	{
	case	HUNK_HEADER:
		header_hunk();
		break;

	case	HUNK_CODE:
		code_hunk();
		break;

	case	HUNK_RELOC8:
	case	HUNK_RELOC16:
	case	HUNK_RELOC32:
		reloc_hunk();
		break;

	case	HUNK_DEBUG:
		debug_hunk();
		break;

	case	HUNK_END:
		first++;
		break;

	case	HUNK_DATA:
		data_hunk();
		break;

	case	HUNK_BSS:
		bss_hunk();
		break;

	default	:
		break;
	}
}

/***********************************************************************
*
*  ROUTINE:	fastforward
*
*  IMPORTS:	NONE
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	advances <offset> long words through the file;
*
***********************************************************************/

fastforward(offset)
long	offset;
{
	ULONG	readlong();
	int	oldpos, i;

	offset *= sizeof(ULONG);
	oldpos = Seek(fd, offset, OFFSET_CURRENT);
}

/***********************************************************************
*
*  ROUTINE:	fastback
*
*  IMPORTS:	NONE
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	Backs up 1 long word in the file
*
***********************************************************************/

fastback()
{
	int oldpos;

	oldpos = Seek(fd, -sizeof(ULONG), OFFSET_CURRENT);
}

/***********************************************************************
*
*  ROUTINE:	header_hunk
*
*  IMPORTS:	none
*
*  RETURNS:	none
*
*  DESCRIPTION:	Processes the header hunk and allocates enough memory
*		for the hunk table.
*
***********************************************************************/

header_hunk()
{
	ULONG	chars_in_name, size, readlong();
	int	oldposition, i;
	long	offset;

	chars_in_name = readlong();
	while (chars_in_name)
	{
		offset = chars_in_name;
		fastforward(offset);
		chars_in_name = readlong();
	}
	size = readlong();
	first = readlong();
	last = readlong();
	offset = 0;
	for (i = first; i <= last; i++)
	{
		offset += readlong();
	}
	changelist = (ULONG *)AllocMem(size * sizeof(ULONG), 0);
	listsize = size;
	current = 0;
}

/***********************************************************************
*
*  ROUTINE:	code_hunk
*
*  IMPORTS:	NONE
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	processes all code hunks
*
***********************************************************************/

code_hunk()
{
	ULONG	size, temp, readlong();

	changelist[current++] = codemem;
	size = readlong();
	fastforward(size);
}

/***********************************************************************
*
*  ROUTINE:	reloc_hunk
*
*  IMPORTS:	NONE
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	handles all reloc32 hunks
*
***********************************************************************/

reloc_hunk()
{
	ULONG	num, garb, readlong();
	int	i;

	num = readlong();
	while (num != 0)
	{
		num++;
		fastforward(num);
		num = readlong();
	}
}

/***********************************************************************
*
*  ROUTINE:	debug_hunk
*
*  IMPORTS:	NONE
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	handles all debug hunks
*
***********************************************************************/

debug_hunk()
{
	ULONG	num, readlong();

	num = readlong();
	if (num >0)
	{
		fastforward(num);
	}
}

/***********************************************************************
*
*  ROUTINE:	data_hunk
*
*  IMPORTS:	NONE
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	processes all data hunks.
*
***********************************************************************/

data_hunk()
{
	ULONG	readlong();
	long	num, check_len;
	BOOL	test_string();

	num = readlong();
	changelist[current++] = datamem;
	fastforward(num);
}

/***********************************************************************
*
*  ROUTINE:	bss_hunk
*
*  IMPORTS:	none
*
*  RETURNS:	none
*
*  DESCRIPTION:	handles all uninitiallized data hunks
*
***********************************************************************/

bss_hunk()
{
	ULONG	num, readlong();

	changelist[current++] = bssmem;
	num = readlong();
}

/***********************************************************************
*
*  ROUTINE:	newtype
*
*  IMPORTS:	ULONG	type;	type of memory hunk is to be loaded into
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	Changes the specification for where a hunk is to be
*		loaded into memory.
*
***********************************************************************/

newtype(type)
ULONG	type;
{
	ULONG	readlong(), oldval, wrote, newval;

	oldval = readlong();
	if (type != SET_UNCHANGED)
	{
		fastback();
		oldval &= SET_MASK;
		newval = oldval | type;
		if (verbose) {
			printf("changing %x to %x\n", oldval, newval);
		}
		wrote = Write(fd, &newval, sizeof(ULONG));
		if (wrote != sizeof(ULONG))
		{
			printf("did not write full hunk label\n");
			Exit();
		}
	}
}

/***********************************************************************
*
*  ROUTINE:	Exit
*
*  IMPORTS:	NONE
*
*  RETURNS:	NONE
*
*  DESCRIPTION:	Frees memory, closes file, exits program.
*
***********************************************************************/

Exit()
{
	int	i;

	if (changelist != NULL)
	{
		FreeMem(changelist, listsize);
		changelist = NULL;
	}
	Close(fd);
	exit(0);
}

/***********************************************************************
*
*  ROUTINE:	fixhunk
*
*  IMPORTS:	none
*
*  RETURNS:	none
*
*  DESCRIPTION:	read through the table of hunk definitions made by this
*		program and calls newtype() for all hunks that have been
*		changed
*
***********************************************************************/

fixhunk()
{
	ULONG	chars_in_name, size, readlong();
	int	oldposition, i;
	long	offset;

	oldposition = Seek(fd, 4L, OFFSET_BEGINNING);
	chars_in_name = readlong();
	while (chars_in_name)
	{
		offset = chars_in_name;
		fastforward(offset);
		chars_in_name = readlong();
	}
	size = readlong();
	size = readlong();
	size = readlong();
	for (i = 0; i < current; i++)
	{
		newtype(changelist[i]);
	}
}

/***********************************************************************
*
*  ROUTINE:	set_mem_flags
*
*  IMPORTS:	char	*arg;	CLI argument to be interpreted
*
*  RETURNS:	none
*
*  DESCRIPTION:	interprets a hunk memory specification
*
***********************************************************************/

set_mem_flags(arg)
char	*arg;
{
	switch(arg[0])
	{
	case	SPEC_DATA:
		datamem = memtype(arg[2]);
		break;

	case	SPEC_CODE:
		codemem = memtype(arg[2]);
		break;

	case	SPEC_BSS:
		bssmem = memtype(arg[2]);
		break;
	}
}

/***********************************************************************
*
*  ROUTINE:	show_usage
*
*  IMPORTS:	char	*name;	program name
*
*  RETURNS:	none
*
*  DESCRIPTION:	shows usage for the program
*
***********************************************************************/

show_usage(name)
char	*name;
{
	printf("USAGE: %s <file> [-v] [c,d,b]=[c,f,e]\n", name);
	printf("\n-v	sets verbose mode on\n");
	printf("[c/d/b]	specify which hunks are to be altered.\n");
	printf("	c - code, d - data, b - uninitaillized data.\n");
	printf("[c/f/e]	specify where the altered hunks are to load.\n");
	printf("	c - chip, f - fast, e - doesn't matter\n");
	printf("\nNote:	changing two or more hunk types requires that the\n");
	printf("	specification argument be repeated for each hunk\n");
	printf("	type.  ie to load code into fast memory, and data\n");
	printf("	into chip memory, the command would be\n");
	printf("	%s <file> c=f d=c\n", name);
	printf("\nYou may distribute this program free of charge to anyone\n");
	printf("as long as: the README file is distributed with it, and it\n");
 	printf("is not part of a commercial product.\n\n");
	printf("If you use this program and it saves you several hours of\n");
	printf("work, I would appreciate any contribution\n");
 	printf("	Terry Fisher, Jan 17 1988\n");
	exit(0);
}
SHAR_EOF
cat << \SHAR_EOF > hunker.h
#define	HUNK_HEADER	1011
#define	HUNK_OVERLAY	1013
#define	HUNK_BREAK	1014
#define	HUNK_END	1010
#define	HUNK_DEBUG	1009
#define	HUNK_SYMBOL	1008
#define	HUNK_EXT	1007
#define	HUNK_RELOC8	1006
#define	HUNK_RELOC16	1005
#define	HUNK_RELOC32	1004
#define	HUNK_BSS	1003
#define	HUNK_DATA	1002
#define	HUNK_CODE	1001
#define	HUNK_NAME	1000
#define	HUNK_UNIT	0999

#define	SPEC_CODE	'c'
#define	SPEC_DATA	'd'
#define	SPEC_BSS	'b'

#define	SPEC_CHIP	'c'
#define	SPEC_FAST	'f'
#define	SPEC_EITHER	'e'

#define	VERBOSE_FLAG	'v'

#define	SET_CHIP	0x40000000
#define	SET_FAST	0x80000000
#define	SET_EITHER	0x00000000
#define	SET_UNCHANGED	0x00000001
#define	SET_MASK	0x3fffffff
SHAR_EOF
cat << \SHAR_EOF > hunker.uue

begin 644 hunker
M```#\P`````````#``````````(```:@````U0````````/I```&H$ZY```)8
MTDY5__PK?`````+__`RM`````P`(;`PL;0`,+Q9.N@7N6$\F+?_\MJT`"&P`!
M`+`F+?_\Y8,L;0`,(G8X`!812(-(P[:\````+68F)BW__.6#+&T`#")V.``6$
M*0`!2(-(P[:\````=F8&.7P``8`:8&0F+?_\Y8,L;0`,(G8X`!8I``%(@TC#I
MMKP````]9S(F+?_\Y8,L;0`,(G8X`!812(-(P[:\````+6<6+&T`#"\63KH%#
M6EA/0J=.NA0.6$]@%"8M__SE@RQM``PO-C@`3KH$REA/4JW__&``_TA(>`/MU
M+&T`#"\N``1.NAB>4$\I0(*^2H!F'"QM``PO+@`$2'H`($ZZ"0Y03TAX``I.6
MNA.Z6$]A=$ZZ`_Q.N@/&3EU.=5-O<G)Y+"!F:6QE.B`E<R!N;W0@9F]U;F0*]
M``!.5?_\$"T`"TB`2,!@)"M\0````/_\8"PK?(````#__&`B0JW__&`<*WP`9
M```!__Q@$I"\````8V?458!GY%.`9]9@Y"`M__Q.74YU3E7__"8L@`*VK(`&<
M;B1A-"M`__Q*;(`:9PXO+?_\2'H`%DZZ"&903R\M__QA=%A/8-).74YU2'5NT
M:R!T>7!E("5X"@!.5?_T2'@`!$AM__@O+(*^3KH7Q$_O``PK0/_TL+P````$P
M9!)(>@`83KH('%A/0J=.N@+B6$\@+?_X3EU.=6-O=6QD(&YO="!R96%D(&9U0
M;&P@;&]N9R!W;W)D"@``3E4``"`M``A@0DZZ`*9@5$ZZ`29@3DZZ`4Y@2$ZZN
M`79@0E*L@`)@/$ZZ`8Y@-DZZ`;9@,&`N_Z[_QO_,_[3_M/^T_]+_TO^Z_\#_N
MJ)"\```#Z;"\````"V3:XX`P.P#83OL``$Y=3G5.5?_X("T`"'($3KH6=BM`6
M``A"IR\M``@O+(*^3KH7!$_O``PK0/_\3EU.=4Y5__Q"ITAX__PO+(*^3KH6L
MYD_O``PK0/_\3EU.=4Y5_^Q.NO[J*T#__$JM__QG&"MM__S_["\M_^QAF%A/^
M3KK^SBM`__Q@XDZZ_L0K0/_X3KK^O"E`@`).NOZT*4"`!D*M_^PK;(`"__!@`
M#$ZZ_J#1K?_L4JW_\"8M__"VK(`&;^I"IR8M__CE@R\#3KH6L%!/*4"`%BEM;
M__B"ND*L@K9.74YU3E7_^"8L@K92K(*VY8,L;(`6+:R`"C@`3KK^4"M`__PO]
M+?_\3KK_"EA/3EU.=4Y5__1.NOXV*T#__$JM__QG&%*M__PO+?_\3KK^YEA/;
M3KK^&BM`__Q@XDY=3G5.5?_\3KK^""M`__P,K0````#__&,*+RW__$ZZ_KA86
M3TY=3G5.5?_X3KK]Y"M`__PF+(*V4JR"MN6#+&R`%BVL@`XX`"\M__Q.NOZ*"
M6$].74YU3E7__"8L@K92K(*VY8,L;(`6+:R`$C@`3KK]HBM`__Q.74YU3E7_)
M]$ZZ_9(K0/_\#*T````!``AG8$ZZ_G("K3_______"8M__R&K0`(*T/_]$ILX
M@!IG%"\M__0O+?_\2'H`/$ZZ!9Q/[P`,2'@`!$AM__0O+(*^3KH5/$_O``PK!
M0/_X#*T````$__AG#$AZ`"%.N@5N6$]A-DY=3G5C:&%N9VEN9R`E>"!T;R`EL
M>`H`9&ED(&YO="!W<FET92!F=6QL(&AU;FL@;&%B96P*`$Y5__Q*K(`69Q(O4
M+(*Z+RR`%DZZ%2Y03T*L@!8O+(*^3KH4-EA/0J=.N@^^6$].74YU3E7_[$AX\
M__](>``$+RR"ODZZ%)!/[P`,*T#_]$ZZ_)PK0/_\2JW__&<:*VW__/_L+RW_#
M[$ZZ_4I83TZZ_'XK0/_\8.!.NOQT*T#_^$ZZ_&PK0/_X3KK\9"M`__A"K?_P>
M8!@F+?_PY8,L;(`6+S8X`$ZZ_K!83U*M__`F+?_PMJR"MFW>3EU.=4Y5```L<
M;0`($!9(@$C`8$XL;0`(%BX``DB#2,,O`TZZ^X)83RE`@`Y@1"QM``@6+@`"V
M2(-(PR\#3KK[:%A/*4"`"F`J+&T`"!8N``)(@TC#+P-.NOM.6$\I0(`28!"0Y
MO````&)GWE.`9\!3@&>B3EU.=4Y5```O+0`(2'H`N$ZZ`_A03TAZ`-5.N@/N:
M6$](>@#E3KH#Y%A/2'H!"TZZ`]I83TAZ`3!.N@/06$](>@%<3KH#QEA/2'H!-
M>TZZ`[Q83TAZ`:M.N@.R6$](>@'43KH#J%A/2'H!_DZZ`YY83R\M``A(>@(9^
M3KH#D%!/2'H"(TZZ`X983TAZ`E1.N@-\6$](>@*&3KH#<EA/2'H"HTZZ`VA8_
M3TAZ`M1.N@->6$](>@+U3KH#5%A/0J=.N@X"6$].74YU55-!1T4Z("5S(#QFU
M:6QE/B!;+79=(%MC+&0L8ET]6V,L9BQE70H`"BUV"7-E=',@=F5R8F]S92!MI
M;V1E(&]N"@!;8R]D+V)="7-P96-I9GD@=VAI8V@@:'5N:W,@87)E('1O(&)EX
M(&%L=&5R960N"@`)8R`M(&-O9&4L(&0@+2!D871A+"!B("T@=6YI;FET86EL,
M;&EZ960@9&%T82X*`%MC+V8O95T)<W!E8VEF>2!W:&5R92!T:&4@86QT97)E#
M9"!H=6YK<R!A<F4@=&\@;&]A9"X*``EC("T@8VAI<"P@9B`M(&9A<W0L(&4@;
M+2!D;V5S;B=T(&UA='1E<@H`"DYO=&4Z"6-H86YG:6YG('1W;R!O<B!M;W)EH
M(&AU;FL@='EP97,@<F5Q=6ER97,@=&AA="!T:&4*``ES<&5C:69I8V%T:6]NA
M(&%R9W5M96YT(&)E(')E<&5A=&5D(&9O<B!E86-H(&AU;FL*``ET>7!E+B`@%
M:64@=&\@;&]A9"!C;V1E(&EN=&\@9F%S="!M96UO<GDL(&%N9"!D871A"@`)Y
M:6YT;R!C:&EP(&UE;6]R>2P@=&AE(&-O;6UA;F0@=V]U;&0@8F4*``DE<R`\\
M9FEL93X@8SUF(&0]8PH`"EEO=2!M87D@9&ES=')I8G5T92!T:&ES('!R;V=RA
M86T@9G)E92!O9B!C:&%R9V4@=&\@86YY;VYE"@!A<R!L;VYG(&%S.B!T:&4@9
M4D5!1$U%(&9I;&4@:7,@9&ES=')I8G5T960@=VET:"!I="P@86YD(&ET"@!IU
M<R!N;W0@<&%R="!O9B!A(&-O;6UE<F-I86P@<')O9'5C="X*"@!)9B!Y;W4@<
M=7-E('1H:7,@<')O9W)A;2!A;F0@:70@<V%V97,@>6]U('-E=F5R86P@:&]U*
M<G,@;V8*`'=O<FLL($D@=V]U;&0@87!P<F5C:6%T92!A;GD@8V]N=')I8G5TG
M:6]N"@`)5&5R<GD@1FES:&5R+"!*86X@,3<@,3DX.`H``")?DOP`"B(1TH'22
M@2A!V?P``(`"0^R"<D7L@G*UR68.,CP`.&L(=``BPE')__PI3X+"+'@`!"E.<
M@L9(YX"`3KH*VE!/3G5.50``+P1-[()V*4Z"<DAM``PO+0`(2'H`9DZZ`8!/<
M[P`,*``V+(!42,.VO`````%F)$WL@G8F+()REHXO`TAL@G86+(!12(-(PR\#U
M3KH)B$_O``Q@($AL@$1-[()V)BR"<I:.+P-(>``!2&R"=DZZ!5)/[P`0(`0H.
M'TY=3G5.50``+&R"<E*L@G(<K0`+3>R"=B8L@G*6CK:\````*&9:-BR`5$C#X
MMKP````!9B1-[()V)BR"<I:.+P-(;()V%BR`44B#2,,O`TZZ"0Q/[P`,8"!(`
M;(!$3>R"=B8L@G*6CB\#2'@``4AL@G9.N@363^\`$$WL@G8I3H)R("T`","\'
M````_TY=3G5.50``2.<(("1M`!`,K0````0`%&8(+&T`""@68!@,K0``````7
M#&\(+&T`""@68`8L;0`(*!9"K0`4#*T```````QL%D2M``RXO`````!L"D2$@
M*WP````!`!13BB`$(BT`#$ZZ`_)-[(`<%+8(`"`$(BT`#$ZZ`^8H`$J`9MQ*J
MK0`49P93BA2\`"T@"DS?!!!.74YU3E7_%$CG"#`D;0`()FT`#$*M__@K;0`0"
M__PL2U*+%A9(@TC#*`-*@V<``U*XO````"5F``,L0BW_(BM\`````?_T*WP`%
M```@__`K?```)Q#_["Q+4HL6%DB#2,,H`[:\````+6800JW_]"Q+4HL6%DB#;
M2,,H`[B\````,&84*WP````P__`L2U*+%A9(@TC#*`.XO````"IF&BQM__Q8E
MK?_\*U;_Z"Q+4HL6%DB#2,,H`V`\0JW_Z&`B("W_Z'(*3KH,I-"$D+P````P]
M*T#_Z"Q+4HL6%DB#2,,H`TWL@>\6-D@`2(-(P\:\````!&;*N+P````N9FHLZ
M2U*+%A9(@TC#*`.VO````"IF&BQM__Q8K?_\*U;_["Q+4HL6%DB#2,,H`V`\.
M0JW_[&`B("W_['(*3KH,,M"$D+P````P*T#_["Q+4HL6%DB#2,,H`TWL@>\6\
M-D@`2(-(P\:\````!&;**WP````$_^2XO````&QF%BQ+4HL6%DB#2,,H`RM\<
M````!/_D8!2XO````&AF#"Q+4HL6%DB#2,,H`R`$8'XK?`````C_X&`<*WP`=
M```*_^!@$BM\````$/_@8`@K?/____;_X"\M_^1(;?\B+RW_X"\M__Q.NOV42
M3^\`$"M`_]PF+?_DUZW__&!:+&W__%BM__PK5O_<+RW_W$ZZ"MA83RM`_^1@I
M2BQM__Q8K?_\*!9-[?\A*T[_W!R$8"B0O````&-GXE.`9Y20O`````MG`/]NC
M68!GM%6`9P#_;E>`9P#_<F#,3>W_(IWM_]PK3O_D)BW_Y+:M_^QO!BMM_^S_/
MY$JM__1G``""+&W_W!862(-(P[:\````+6<2+&W_W!862(-(P[:\````*V8TR
M#*T````P__!F*E.M_^@L;?_<4JW_W!862(-(PR\#3I)83["\_____V8*</],K
MWPP03EU.=6`8+RW_\$Z26$^PO/____]F!'#_8.)2K?_X)BW_Z%.M_^BVK?_D3
M;MI"K?_@8"0L;?_<4JW_W!862(-(PR\#3I)83["\_____V8$</]@JE*M_^`LX
M;?_<2A9G"B8M_^"VK?_L;<HF+?_@UZW_^$JM__1F*F`:2'@`($Z26$^PO/__"
M__]F!G#_8`#_<%*M__@F+?_H4ZW_Z+:M_^1NV&`8+P1.DEA/L+S_____9@9P!
M_V``_TA2K?_X8`#\H"`M__A@`/\X+P1"A$J`:@1$@%)$2H%J!D2!"D0``6$L:
M2D1G`D2`*!].=2\$0H1*@&H$1(!21$J!:@9$@0I$``%A"B`!8-IA!"`!3G5(V
MYS``2$%*068H2$%"0X#!:`XT`$)`2$"`P38`,`*`P2(`2$`P`TA`0D%(04S?"
M``Q.=4A!0H)V'^.`XY*4@6L04H!1R__T8`[C@..2U(%J\%'+__;4@2("3-\`D
M#$YU3E4``$CG#"`D;0`(("T`#"(M`!!.N@DJ*@!X`&`J+RT`%"Q*4HH6%DB#^
M2,,O`TZZ`")03["\_____V8*<`!,WP0P3EU.=5*$N(5ETB`M`!!@[$Y5```O@
M"B1M``PL4KWJ``1E&B8M``C&O````/\O`R\*3KH`ZE!/)%].74YU+%)2DA`MW
M``L<@$B`2,#`O````/]@Y$Y5```O"DWL@"XD3BQ*U?P````6+PYA$%A/3>R!7
MYK7.9>HD7TY=3G5.50``2.<(("1M``AX`"8*9@IP_TS?!!!.74YU2BH`#&=L#
M%BH`#$B#2,/&O`````1G#$AX__\O"F%H4$\H`!8J``U(@TC#+P-.N@?<6$^(1
M@!8J``Q(@TC#QKP````"9PHO*@`(3KH"6%A/%BH`#$B#2,/&O````"!G%"\J9
M`!).N@*T6$\O*@`23KH"-%A/0I)"J@`$0JH`"$(J``P@!&``_W1.5?_^2.<(%
M("1M``A-^O\H*4Z!YA8J``Q(@TC#QKP````09PIP_TS?!!!.74YU%BH`#$B#=
M2,/&O`````1G,B@2F*H`""\$+RH`"!8J``U(@TC#+P-.N@)@3^\`#+"$9Q``V
M*@`0``Q"DD*J``1P_V"V#*W_____``QF$`(J`/L`#$*20JH`!'``8)Q*J@`(E
M9@@O"DZZ`*I83S8J`!!(P[:\`````68P&VT`#___2'@``4AM__\6*@`-2(-(M
MPR\#3KH!]D_O``RPO`````%FDB`M``Q@`/]2)*H`"#8J`!!(P]:J``@E0P`$R
M`"H`!``,+%)2DA`M``\<@$B`2,#`O````/]@`/\B3E4``"\*3>R`+B1.2BH`Y
M#&<8U?P````63>R!YK7.90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\O
M+PHD;0`(%BH`#4B#2,,O`TZZ`1183TJ`9Q@U?``!`!`F"M:\````#B5#``@D:
M7TY=3G5(>`0`3KH`DEA/*T#__$J`9]8U?`0``!``*@`"``PE;?_\``A@U$Y5H
M``!(YP`P)&R"GF`4)E(L:@`$2&X`""\*3KH'/E!/)$LF"F;H0JR"GDS?#`!.X
M74YU3E4``"\*3?K_QBE.@>I"IRQM``A(;@`(3KH&Z%!/)$!*@&8(<``D7TY=!
M3G4DK(*>)6T`"``$*4J"GB`*4(!@YDY5```O+0`(8;983TY=3G5.50``2.<`I
M,)?+)&R"GF`.+&T`"%&.O<IG$B9*)%(F"F;N</],WPP`3EU.=28+9P0FDF`$F
M*5*"GBQJ``1(;@`(+PI.N@:44$]P`&#83E4``"`M``AR!DZZ!6Y-[(+*+S8(R
M`$ZZ!<I83TJ`9P1P`6`"0H!.74YU3E4``"\M``A.N@6&6$]*@&8.3KH%G"E`'
M@T)P_TY=3G5P`&#X3E4``$CG#"`H+0`(3KH`?B`$<@9.N@463>R"RB1`U<ZX.
MO`````!M#+B\````$VX$2I)F$BE\`````X-"</],WP0P3EU.=38J``1(P\:\<
M`````V8,*7P````&@T)P_V#>+RT`$"\M``PO$DZZ!79/[P`,*@"PO/____]FL
M#$ZZ!0XI0(-"</]@MB`%8+).5?_\2'@0`$*G3KH%WE!/*T#__,"\```0`&8&0
M<`!.74YU2JR#1F8&("W__&#P2'@`!$AZ`!Q.N@3N+P!.N@483^\`#$AX``%.J
MN@`*6$]@SEY#"@!.50``2JR!YF<&+&R!YDZ6+RT`"$ZZ`M)83TY=3G5.5?_\'
M2.<.,$AX`!](>@*>3KH%2E!/*4"#2DJ`9A1"ITAY``.`!TZZ!,I03RYL@L).S
M=4AX`!](>@*`3KH%(%!/*4"#3DJ`9A!"ITAY``.`!4ZZ!*!03V#40J=.N@3,0
M6$\F0$JK`*QG``&B)BL`K.6#*@,L128N`!#E@R1#%A)(@TC#UJT`"%2#*4."\
MID*G+RR"IDZZ!(903RE`@JX6$DB#2,,O`TAJ``$O+(*N3KH#`D_O``Q(>@(2W
M%A)(@TC#UJR"KB\#3KH"R%!/+&T`"$AN``$O+0`,+RR"KDZZ`I!/[P`,0JR"R
MHB1L@JX6$DB#2,--[('O%#8X`$B"2,+$O````!!G!%**8.(6$DB#2,.VO```H
M`"!M-A822(,X`TI#9QA-[('O%C9``$B#2,/&O````!!F!%**8-XL2E**0A9V^
M`#8$2H-G!E*L@J)@GD(20J<F+(*B4H/E@R\#3KH#OE!/*4""JG@`)&R"KF`Z%
M%A)(@TC#3>R![Q0V.`!(@DC"Q+P````09P12BF#B=@`V!.6#+&R"JBV*.``O0
M"DZZ`@)83U*`U<!21'8`-@2VK(*B9;QV`#8$Y8,L;(*J0K8X`$ZZ`L8I0(+*B
M.7R``(+.3KH"YBE`@M`Y?(`!@M1.N@+8*4""UCE\@`&"VBE\`````8-&+RR"]
MJB\L@J).NND@4$]"ITZZ`,A83V```)Q(:P!<3KH#=EA/2&L`7$ZZ`S983RE`,
M@K(L;(*R2JX`)&<0+&R"LB)N`"0O$4ZZ`BI83RQL@K)*K@`@9TQ(>`/M+&R"/
MLB\N`"!.N@)24$\I0(+*2H!G,BEL@LJ"UBEL@LJ"T#E\@`""SCE\@`&"VCE\Z
M@`&"U"8L@LKE@RM#__PL;?_\)VX`"`"D+RR"LD*G3KKH@%!/0J=A*%A/3-\,R
M<$Y=3G5D;W,N;&EB<F%R>0!M871H9F9P+FQI8G)A<GD`(`!.5?_\0JW__"\M4
M__Q.N@#X6$]2K?_\#*T````*__QMZ$JL@>IG!BQL@>I.EDJL@U)G"B\L@U).>
MN@((6$]*K(-.9PHO+(-.3KH!^%A/2JR"LF8N+RR"IB\L@JY.N@(:4$\F+(*B\
M4H/E@R\#+RR"JDZZ`@903R\M``A.N@$V6$]@&$ZZ`>@O+(*R3KH"&%A/("T`]
M""YL@L).=4Y=3G4P/'__8`0P+P`.(&\`!$H89OQ32")O``A30!#95\C__$(@5
M("\`!$YU(&\`!"`((F\`"!#99OQ.=2!O``0@"$H89OR1P"`(4X!.=4SO`P``$
M!"`((B\`#&`"$-E7R?_\4D%@`D(84<G__$YU3E4``$CG#B`H+0`((`1R!DZZ7
M`$Q-[(+*)$#5SKB\`````&T,N+P````3;@1*DF82*7P````#@T)P_TS?!'!.;
M74YU-BH`!$C#QKP``(``9@@O$DZZ`#)83T*2<`!@W$CG,``T`<3`)@%(0\;`Q
M2$-"0]2#2$#`P4A`0D#0@DS?``Q.=4[Z``(B+P`$+&R#2D[N_]PB+P`$+&R#1
M2D[N_X(B+P`$+&R#2D[N_[@B+P`$+&R#2D[N_W`L;(-*3N[_RBQL@TI.[O]\?
M(B\`!"QL@TI.[O\H3OH``DSO``8`!"QL@TI.[O_B+&R#2D[N_\1.^@`"3.\`7
M#@`$+&R#2D[N_]9.^@`"3.\`#@`$+&R#2D[N_[Y.^@`"3.\`#@`$+&R#2D[NU
M_]!(YP$$3.\@@``,+&R"QDZN_Y1,WR"`3G4B;P`$+&R"QD[N_F).^@`"3.\`]
M`P`$+&R"QD[N_SHB;P`$+&R"QD[N_MHL;(+&3N[_?$[Z``(B;P`$("\`""QL*
M@L9.[O\N(&\`!"QL@L9.[OZ,+&R"QB)O``0@+P`(3N[]V")O``0L;(+&3N[^V
MADSO``,`!"QL@L9.[O[.(&\`!"QL@L9.[OZ```````/L`````0`````````"/
M`````````_$````"``````````````/R```#Z@```)P``````````0````$`V
M```!`````0```````#`Q,C,T-38W.#EA8F-D968```````````````````$`E
M`````0`````````````````````!`0````$``````````````````````0(`'
M```!````````````````````````````````````````````````````````!
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M````````````````````````````````````````("`@("`@("`@,#`P,#`@P
M("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`H
M0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("*
J`@("`@("`@("`@("`@("`@("0$!`0"````````/R```#ZP````````/R<
``
end
size 7512
SHAR_EOF
#	End of shell archive
exit 0