[comp.sys.amiga] BEZIER CURVES EXAMPLE

dillon@CORY.BERKELEY.EDU (Matt Dillon) (05/10/87)

	Here is a little program I wrote to fool around with Bezier curves.  It
allows you to fool around with a 4 point bezier curve, using the mouse to move
the points, and using a prop gadget to change the granularity of the 
curve generation loop.  A granualarity of about 40 is almost indestinguishable
from a granularity of 1, and draws the curve 40 times faster (as in, **fast**)

				Have Fun!

				-Matt


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	bezier.c
#	bezier.uue
# This archive created: Sun May 10 13:32:34 1987
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'bezier.c'" '(5624 characters)'
if test -f 'bezier.c'
then
	echo shar: "will not over-write existing file 'bezier.c'"
else
cat << \!Funky!Stuff! > 'bezier.c'

/*
 *  BEZIER.C
 *
 *  Matthew Dillon.
 *  Public Domain (no Copyrights whatsoever)
 *
 *  -Assumes AZTEC compilation,  +L (32 bit ints), with all AMIGA symbols
 *  precompiled.  Additionally expects certain typedefs and routines
 *  found in MY.LIB, as well as some MY.LIB #include files.
 *
 *  An experienced programmer can remove the MY.LIB dependancies
 *  (openlibs() call), and figure out what typedefs have been assumed if
 *  he wishes to compile the program.  You can also simply extract the
 *  Bezier functions for your own use.
 */

#include <typedefs.h>
#include <xmisc.h>

#define     SHIFTS  9
#define     ONE     (1<<SHIFTS)

typedef struct PropInfo XPI;
typedef struct Image	IM;

extern IMESS *GetMsg();

#define MYGADGETS   (WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE)

NW Nw = {
    64, 64, 320, 100,
    0, 1,
    NEWSIZE|MOUSEBUTTONS|MOUSEMOVE|CLOSEWINDOW|GADGETDOWN|GADGETUP,
    MYGADGETS|REPORTMOUSE|ACTIVATE|NOCAREREFRESH,
    0, 0, (UBYTE *)"Bezier", NULL, NULL,
    32, 64, -1, -1, WBENCHSCREEN
};

WIN *Win;
RP  *Rp;
short Ux, Uy, Lx, Ly;
short Step = 128;

main(ac, av)
char *av[];
{
    register IMESS *mess;
    short notdone = 1;
    short pt = -1;
    short ptarray[4][2];

    short gy, gg = 0;
    XPI *po;

    init_gadgets(&Nw, &po);
    exiterr(!openlibs(INTUITION_LIB|GRAPHICS_LIB), "unable to open libs");
    exiterr(!(Win = OpenWindow(&Nw)), "unable to open window");
    Rp = Win->RPort;
    SetAPen(Rp, 1);
    setpoint(ptarray, 0, 32, 32);
    setpoint(ptarray, 1, 40, 40);
    setpoint(ptarray, 2, 50, 50);
    setpoint(ptarray, 3, 60, 60);
    setbounds(ptarray);
    while (notdone) {
	short mx, my, mm = 0;
	WaitPort(Win->UserPort);
	while (mess = GetMsg(Win->UserPort)) {
	    switch(mess->Class) {
	    case CLOSEWINDOW:
		notdone = 0;
		break;
	    case NEWSIZE:
		setbounds(ptarray);
		break;
	    case GADGETUP:
	    case GADGETDOWN:
		{
		    gg = mess->Class;
		    gy = po->VertPot / 256;
		}
		break;
	    case MOUSEBUTTONS:
		switch(mess->Code) {
		case SELECTDOWN:
		    pt = getpoint(ptarray, mess->MouseX, mess->MouseY);
		    break;
		case SELECTUP:
		    pt = -1;
		    break;
		}
		break;
	    case MOUSEMOVE:
		if (gg == GADGETDOWN) {
		    gy = po->VertPot / 256;
		    break;
		}
		mm = 1;
		mx = mess->MouseX;
		my = mess->MouseY;
		break;
	    default:
		break;
	    }
	    ReplyMsg(mess);
	}
	if (mm && pt >= 0) {
	    movepoint(ptarray, pt, mx, my);
	    drawcurve(ptarray);
	}
	if (gg) {
	    char buf[32];
	    if (gg == GADGETUP)
		gg = 0;
	    if (gy + 1 >= 0)
		Step = gy + 1;
	    sprintf(buf, "gran: %4ld/%ld", Step, ONE);
	    drawcurve(ptarray);
	    Move(Rp, Ux + 1, Uy + 16);
	    Text(Rp, buf, strlen(buf));
	}
    }
    exiterr(1, NULL);
}

exiterr(n, str)
char *str;
{
    if (n) {
	if (str)
	    puts(str);
	if (Win)
	    CloseWindow(Win);
	closelibs(-1);
	exit(1);
    }
}

setbounds(a)
register long *a;
{
    Ux = Win->BorderLeft;
    Uy = Win->BorderTop;
    Lx = Win->Width - Win->BorderRight;
    Ly = Win->Height- Win->BorderBottom;
    drawcurve(a);
}

setpoint(a, pt, x, y)
register short a[4][2];
{
    a[pt][0] = x;
    a[pt][1] = y;
    drawpoints(a, pt, pt + 1);
}

getpoint(a, x, y)
register short a[4][2];
{
    register short i, bi;
    register long r, br;

    for (i = bi = 0, br = 0x7FFFFFFF; i < 4; ++i) {
	r = (x-a[i][0])*(x-a[i][0]) + (y-a[i][1])*(y-a[i][1]);
	if (r < br) {
	    bi = i;
	    br = r;
	}
    }
    return(bi);
}

movepoint(a, pt, x, y)
register short a[4][2];
{
    SetAPen(Rp, 0);
    drawpoints(a, pt, pt + 1);
    SetAPen(Rp, 1);
    setpoint(a, pt, x, y);
}

#define S10(x)	 ((x) >> SHIFTS)
#define S20(x)	 ((x) >> (2*SHIFTS))

/*
 *  So I can use integer arithmatic, I am defining 512 as 1 (as far
 *  as the mathematics go), which means that I must divide any power
 *  multiplication by 512^(n-1).  E.G. .5^2 = .25 ... to make 256^2
 *  equal 128, I must divide by 512^1
 */

drawcurve(a)
register short a[4][2];
{
    long  m1[4];	/* t matrix		    */
    long  mr[4];	/* partial result matrix    */
    long  corr[2];
    register short t, i;
    char  lastpt = 0;

    SetAPen(Rp, 0);
    RectFill(Rp, Ux, Uy, Lx - 1, Ly - 1);
    SetAPen(Rp, 1);
    drawpoints(a, 0, 4);

    Move(Rp, a[0][0], a[0][1]);
    for (t = 0; t <= ONE; t += Step) {	   /*  t = 0 to 1      */
oncemore:
	m1[3] = ONE;
	m1[2] = t;
	m1[1] = t * t;
	m1[0] = m1[1] * t;

	mr[0] = -S20(m1[0]  ) + S10(3*m1[1]) - 3*m1[2] + m1[3];
	mr[1] =  S20(3*m1[0]) - S10(6*m1[1]) + 3*m1[2];
	mr[2] = -S20(3*m1[0]) + S10(3*m1[1]);
	mr[3] =  S20(m1[0]  );
	for (i = 0; i < 2; ++i) {
	    corr[i] = (mr[0] * a[0][i] + mr[1] * a[1][i] +
		      mr[2] * a[2][i] + mr[3] * a[3][i]) >> SHIFTS;
	}
	Draw(Rp, corr[0], corr[1]);
    }
    if (lastpt == 0 && t - Step < ONE) {
	lastpt = 1;
	t = ONE;
	goto oncemore;
    }
}

drawpoints(a, is, ie)
register short a[4][2];
{
    register short i;
    for (i = is; i < ie; ++i) {
	Move(Rp, a[i][0] - 2, a[i][1]);
	Draw(Rp, a[i][0] + 2, a[i][1]);
	Move(Rp, a[i][0], a[i][1] - 2);
	Draw(Rp, a[i][0], a[i][1] + 2);
    }
}

/*
 *  GADGET ROUTINES!
 */


#define NG(nn)	&Gadgets[nn+1]
#define G_YGLOB 1
#define G_XGLOB 2

XPI Props[] = {
    { AUTOKNOB|FREEVERT , 0, 0, 0x1FFF, 0x1FFF }
};

IM Images[] = {
    { 0,0,2,1,1, NULL, 1, 0, NULL },
};

GADGET Gadgets[] = {
    {
	NULL, -15, 11, 15, -19, GADGIMAGE|GADGHCOMP|GRELRIGHT|GRELHEIGHT,
	GADGIMMEDIATE|RIGHTBORDER|RELVERIFY,PROPGADGET,
	(APTR)&Images[0],NULL,NULL,0,(APTR)&Props[0], G_YGLOB, 0
    },
};

GADGET *Gc;
long GUx, GUy;

init_gadgets(nw, ppo)
NW *nw;
XPI **ppo;
{
    nw->FirstGadget = &Gadgets[0];
    *ppo = &Props[0];
}


!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'bezier.uue'" '(11291 characters)'
if test -f 'bezier.uue'
then
	echo shar: "will not over-write existing file 'bezier.uue'"
else
cat << \!Funky!Stuff! > 'bezier.uue'
begin 644 bezier
M```#\P`````````#``````````(```;<````_P````$```/I```&W$[Z"89"
M97II97(``$Y5_[XO"CM\``'__CM\_____$)M_^A(;?_D2&R``DZZ!]A03TAZ
M`KA(>``#3KH(OEA/2H!F!'`!8`)P`$C`+P!.N@+64$](>@*J2&R``DZZ&PA8
M3RE`@ZIF!'`!8`)P`$C`+P!.N@*R4$\@;(.J*6@`,H.N2'@``2\L@ZY.NAI^
M4$](>``@2'@`($*G2&W_[$ZZ`S1/[P`02'@`*$AX`"A(>``!2&W_[$ZZ`QQ/
M[P`02'@`,DAX`#)(>``"2&W_[$ZZ`P1/[P`02'@`/$AX`#Q(>``#2&W_[$ZZ
M`NQ/[P`02&W_[$ZZ`G183TIM__YG``'>0FW_WB!L@ZHO*`!63KH9MEA/(&R#
MJB\H`%9.NAEF6$\D0$J`9P``Z"`J`!1@``"F0FW__F```,Q(;?_L3KH"*EA/
M8```OCMJ`!;_Z"!M_^1P`#`H``3@B#M`_^I@``"D<``P*@`88"HP*@`B2,`O
M`#(J`"!(P2\!2&W_[$ZZ`IA/[P`,.T#__&`8.WS____\8!"0O````&AGSI"\
M````@&?H8%X,;0`@_^AF$B!M_^1P`#`H``3@B#M`_^I@1#M\``'_WCMJ`"#_
MXCMJ`"+_X&`P8"Y5@&<`_V!=@&>"48!GPI"\````$&<`_UR0O````"!G`/]2
MD+P```'`9P#_,F#0+PI.NAB@6$]@`/\&2FW_WF<T2FW__&TN,"W_X$C`+P`R
M+?_B2,$O`30M__Q(PB\"2&W_[$ZZ`G)/[P`02&W_[$ZZ`KQ83TIM_^AG``"*
M#&T`0/_H9@1";?_H,"W_ZDC`4H!*@&T,,"W_ZDC`4H`Y0(`R2'@"`#`L@#)(
MP"\`2'H`E$AM_[Y.N@O`3^\`$$AM_^Q.N@)J6$\P+(.D2,`@0$AH`!`R+(.B
M2,%2@2\!+RR#KDZZ&#!/[P`,2&W_ODZZ$&983R\`2&W_OB\L@ZY.NAA(3^\`
M#&``_AY"ITAX``%A0E!/)%].74YU=6YA8FQE('1O(&]P96X@;&EB<P!U;F%B
M;&4@=&\@;W!E;B!W:6YD;W<`9W)A;CH@)31L9"\E;&0``$Y5``!*K0`(9S1*
MK0`,9PHO+0`,3KH*'%A/2JR#JF<*+RR#JDZZ&`Y83TAX__].N@3.6$](>``!
M3KH4Y%A/3EU.=4Y5```O"B1M``@@;(.J$"@`-DB`.4"#HB!L@ZH0*``W2(`Y
M0(.D(&R#JC`H``A(P")L@ZH2*0`X2(%(P9"!.4"#IB!L@ZHP*``*2,`B;(.J
M$BD`.4B!2,&0@3E`@Z@O"DZZ`3983R1?3EU.=4Y5```O"B1M``@@+0`,Y8`U
MK0`2"``@+0`,Y8`@0-'*,6T`%@`"("T`#%*`+P`O+0`,+PI.N@,:3^\`#"1?
M3EU.=4Y5``!(YP\@)&T`"'H`.`4N/'____]@:B`M``PR!$C!Y8$T,A@`2,*0
M@B(M``PV!$C#Y8,T,C@`2,*2@DZZ%4PO`"`M`!`V!$C#Y8,@0]'*-B@``DC#
MD(,B+0`0-@1(P^6#(D/3RC8I``)(PY*#3KH5&BQ?+`[<@+R';`0Z!"X&4D2X
M?``$;9`P!4C`3-\$\$Y=3G5.50``+PHD;0`(0J<O+(.N3KH63E!/("T`#%*`
M+P`O+0`,+PI.N@)43^\`#$AX``$O+(.N3KH6*E!/+RT`%"\M`!`O+0`,+PI.
MNO[@3^\`$"1?3EU.=4Y5_]9(YPP@)&T`"$(M_]="IR\L@ZY.NA7R4$\P+(.H
M2,!3@"\`,BR#IDC!4X$O`30L@Z1(PB\"-BR#HDC#+P,O+(.N3KH5LD_O`!1(
M>``!+RR#KDZZ%;103TAX``1"IR\*3KH!P$_O``PP*@`"2,`O`#(22,$O`2\L
M@ZY.NA5H3^\`#'@`8``!9"M\```"`/_\,`1(P"M`__@P!,'$*T#_]#`$2,`B
M+?_T3KH3]"M`__!R`R`M__1.NA/F=`GDH"8M__!T$N2C1(/0@W(#+P`@+?_X
M3KH3RB!?D<#1[?_\*TC_X'(#("W_\$ZZ$[1T$N2@<@8O`"`M__1.NA.D=@GF
MH"!?D<!R`R`M__A.NA.2T<`K2/_D<@,@+?_P3KH3@G02Y*!$@'(#+P`@+?_T
M3KH3<'8)YJ`@7]'`*TC_Z"`M__!R$N*@*T#_['H`8'XP!4C`Y8!![?_8,@5(
MP>.!+P`P,A@`2,`B+?_@3KH3-#0%2,+C@B)"T\HO`#`I``1(P"(M_^1.NA,:
M)!_4@#8%2,/C@RQ#W<HP+@`(2,`B+?_H3KH2_M2`-@5(P^.#+$/=RC`N``Q(
MP"(M_^Q.NA+DU(`F'W()XJ(A@C@`4D6Z?``";0#_?"\M_]PO+?_8+RR#KDZZ
M$_)/[P`,V&R`,KA\`@!O`/Z82BW_UV8B,`1(P#(L@#)(P9"!L+P```(`;`X;
M?``!_]<X/`(`8`#^<$S?!#!.74YU3E4``$CG""`D;0`(."T`#F```+PP!$C`
MY8`@0-'*,"@``DC`+P`R!$C!Y8$T,A@`2,)5@B\"+RR#KDZZ$X9/[P`,,`1(
MP.6`($#1RC`H``)(P"\`,@1(P>6!-#(8`$C"5((O`B\L@ZY.NA-&3^\`##`$
M2,#E@"!`T<HP*``"2,!5@"\`,@1(P>6!-#(8`$C"+P(O+(.N3KH3*D_O``PP
M!$C`Y8`@0-'*,"@``DC`5(`O`#($2,'E@30R&`!(PB\"+RR#KDZZ$NI/[P`,
M4D0P!$C`L*T`$&T`_SQ,WP003EU.=4Y5``!![(!>(FT`""-(`!)![(`T(FT`
M#"*(3EU.=4Y5``!(YP@@."T`"D'Y````B"1(8"8(!```9QP@:@`$2I!G%"!J
M``0O$$ZY```:/EA/(&H`!$*0XDQ0BDI$9P1*DF;23-\$$$Y=3G5G<F%P:&EC
M<P!I;G1U:71I;VX`97AP86YS:6]N`&1I<VMF;VYT`'1R86YS;&%T;W(`:6-O
M;@!M871H9F9P`&UA=&AT<F%N<P!M871H:65E961O=6)B87,`;6%T:&EE965S
M:6YG8F%S`&QA>65R<P!C;&ES=`!P;W1G;P!T:6UE<@!X,34`>#$V``!.5?^\
M+PIP`#`M``HK0/^\0?D```"()$A@2@@M````"V<\+Q)(;?_`3KD```U&4$](
M>@!42&W_P$ZY```-'%!/(&H`!$J09A9"ITAM_\!.N0``&I!03R!J``0@@&<8
MXNT`"E"*2FT`"F<$2I)FK'`!)%].74YU+RW_O$ZY```((EA/<`!@ZBYL:6)R
M87)Y``!A<$/L@V)%[(-BM<EF#C(\`"9K"'0`(L)1R?_\*4^#:BQX``0I3H-N
M2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH*4"#<F8,+CP`
M`X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.=4Y5```O"DAY
M``$``#`L@U[!_``&+P!.NA`T4$\I0(-V9A1"ITAY``$``$ZZ#_A03RYL@VI.
M=2!L@W9":``$(&R#=C%\``$`$")L@W8S?``!``H@;(-J("R#:I"H``10@"E`
M@WH@;(-Z(+Q-04Y80J=.N@_H6$\D0$JJ`*QG,"\M``PO+0`(+PI.N@"T3^\`
M#"E\`````8-^(&R#=@!H@```!"!L@W8`:(````I@1$AJ`%Q.NA`06$](:@!<
M3KH/Q%A/*4"#@B!L@X)*J``D9Q`@;(."(F@`)"\13KH.\%A/+RR#@B\*3KH"
MJE!/*6R#@H.&3KH.\"!L@W8@@$ZZ#Q`@;(-V(4``!F<62'@#[4AZ`"Q.N@[L
M4$\@;(-V(4``#"\L@X8O+(.*3KKTX%!/0J=.N@T.6$\D7TY=3G4J`$Y5``!(
MYPPP)&T`$"!M``@@*`"LY8`H`"!$("@`$.6`)D`0$TB`2,#0K0`,5(`I0(..
M0J<O+(..3KH.U%!/*4"#DF8(3-\,,$Y=3G40$TB`2,`O`"!+4H@O""\L@Y).
MN@%:3^\`#$AZ`5`0$TB`2,#0K(.2+P!.N@&.4$\O+0`,+PHO+(.23KH!6D_O
M``Q"K(.*)FR#DB1+$!-(@$C`*@"PO````"!G(+J\````"6<8NKP````,9Q"Z
MO`````UG"+J\````"F8$4HM@S`P3`"!M``",#!,`(F8R4HL@2U*+$!!(@$C`
M*@!G("!*4HH0A;J\````(F80#!,`(F8$4HM@!D(J__]@`F#28$0@2U*+$!!(
M@$C`*@!G,+J\````(&<HNKP````)9R"ZO`````QG&+J\````#6<0NKP````*
M9P@@2E**$(5@PB!*4HI"$$J%9@)3BU*L@XI@`/\\0A)"IR`L@XI2@.6`+P!.
MN@V@4$\I0(.&9@A"K(.*8`#^QGH`)FR#DF`:(`7E@"!L@X8ABP@`+PM.N@9.
M6$]2@-?`4H6ZK(.*;>`@!>6`(&R#AD*P"`!@`/Z.(`!,[P,```0@""(O``Q@
M`A#95\G__&<&4D%@`D(84<G__$YU,#Q__V`$,"\`#B!O``1*&&;\4T@B;P`(
M4T`0V5?(__QG`D(0("\`!$YU(&\`!"`((F\`"!#99OQ.=4Y5```O"B1M``A*
M$F<D($I2BA`02(!(P"\`3KH%QEA/L+S_____9@AP_R1?3EU.=6#82'@`"DZZ
M!:I83V#L3E4``$CG#C`D;0`(0J=(>@".3KH,[%!/*4"#TF8(3-\,<$Y=3G4@
M;0`,(F@`)"\I``1.N@V$6$\H`&=22'H`;2!$+R@`-DZZ#5903R9`2H!G-$AX
M`^TO"TZZ#!103RP`9R0@!N6`*@`@125H``@`I"5&`)Q(>`/M2'H`.$ZZ"_!0
M3R5``*`O!$ZZ#2)83R\L@]).N@P66$]"K(/28(!I8V]N+FQI8G)A<GD`5TE.
M1$]7`"H`3E4``"\$*6T`"(-B2&T`$"\M``Q(>@`:3KH`O$_O``PH`"!L@V)"
M$"`$*!].74YU3E4``"!L@V)2K(-B$"T`"Q"`2(!(P,"\````_TY=3G5.50``
M2.<(("1M`!`,K0````0`%&8((&T`""@08!1*K0`,;P@@;0`(*!!@!B!M``@H
M$$*M`!1*K0`,;!)$K0`,2H1L"D2$*WP````!`!0B+0`,(`1.N@/20>R!$E.*
M%+`(`"(M``P@!$ZZ`\HH`&;>2JT`%&<&4XH4O``M(`I,WP003EU.=4Y5_Q1(
MYP@P)&T`""9M``Q"K?_X*VT`$/_\($M2BQ`02(!(P"@`9P`#,+B\````)68`
M`PI"+?\B*WP````!__0K?````"#_\"M\```G$/_L($M2BQ`02(!(P"@`L+P`
M```M9A!"K?_T($M2BQ`02(!(P"@`N+P````P9A0K?````##_\"!+4HL0$$B`
M2,`H`+B\````*F8:(&W__%BM__PK4/_H($M2BQ`02(!(P"@`8#1"K?_H8")R
M"B`M_^A.N@G`T(20O````#`K0/_H($M2BQ`02(!(P"@`0>R!)0@P``)(`&;2
MN+P````N9F(@2U*+$!!(@$C`*`"PO````"IF&B!M__Q8K?_\*U#_["!+4HL0
M$$B`2,`H`&`T0JW_[&`B<@H@+?_L3KH)5M"$D+P````P*T#_["!+4HL0$$B`
M2,`H`$'L@24(,``"2`!FTBM\````!/_DN+P```!L9A8@2U*+$!!(@$C`*``K
M?`````3_Y&`4N+P```!H9@P@2U*+$!!(@$C`*``@!&!^*WP````(_^!@'"M\
M````"O_@8!(K?````!#_X&`(*WS____V_^`O+?_D2&W_(B\M_^`O+?_\3KK]
MM$_O`!`K0/_<("W_Y-&M__Q@6B!M__Q8K?_\*U#_W"\M_]Q.N@(<6$\K0/_D
M8$H@;?_\6*W__"@00>W_(2M(_]P0A&`HD+P```!C9^)3@&>4D+P````+9P#_
M;EF`9[15@&<`_VY7@&<`_W)@S$'M_R*1[?_<*TC_Y"`M_^2PK?_L;P8K;?_L
M_^1*K?_T9W`@;?_<#!``+6<*(FW_W`P1`"MF-`RM````,/_P9BI3K?_H(&W_
MW%*M_]P0$$B`2,`O`$Z26$^PO/____]F"G#_3-\,$$Y=3G5@&"\M__!.DEA/
ML+S_____9@1P_V#B4JW_^"`M_^A3K?_HL*W_Y&[:0JW_X&`D(&W_W%*M_]P0
M$$B`2,`O`$Z26$^PO/____]F!'#_8*I2K?_@(&W_W$H09PH@+?_@L*W_[&W*
M("W_X-&M__A*K?_T9BI@&DAX`"!.DEA/L+S_____9@9P_V``_W!2K?_X("W_
MZ%.M_^BPK?_D;MA@&"\$3I)83["\_____V8&</]@`/](4JW_^&``_,0@+?_X
M8`#_.$CG2`!"A$J`:@1$@%)$2H%J!D2!"D0``6$^2D1G`D2`3-\`$DJ`3G5(
MYT@`0H1*@&H$1(!21$J!:@)$@6$:(`%@V"\!81(@`2(?2H!.=2\!808B'TJ`
M3G5(YS``2$%*068@2$$V`30`0D!(0(##(@!(0#("@L,P`4)!2$%,WP`,3G5(
M028!(@!"04A!2$!"0'0/T(#3@;:!8@22@U)`4<K_\DS?``Q.=2!O``0@"$H8
M9OR1P"`(4X!.=4Y5``!(;(&\+RT`"$ZZ``A03TY=3G5.50``+P0H+0`(+RT`
M#"\$3KH`-%!/N+P````*9B8@;0`,$"@`#$B`2,`(```'9Q1(>/__+RT`#$ZZ
M`/Y03R@?3EU.=6#X3E4``"\*)&T`#"!2L>H`!&4:("T`","\````_R\`+PI.
MN@#04$\D7TY=3G4@4E*2$"T`"Q"`2(!(P,"\````_V#D3E4``"\*0>R!IB1(
M($K5_````!8O"&$06$]![(->M<AEZB1?3EU.=4Y5``!(YP@@)&T`"'@`(`IF
M"G#_3-\$$$Y=3G5**@`,9U0(*@`"``QG#$AX__\O"F%64$\H`!`J``U(@$C`
M+P!.N@4(6$^(@`@J``$`#&<*+RH`"$ZZ`CQ83P@J``4`#&<4+RH`$DZZ`MA8
M3R\J`!).N@(@6$]"DD*J``1"J@`(0BH`#"`$8(Q.5?_^2.<(("1M``A!^O]"
M*4B#E@@J``0`#&<*</],WP003EU.=0@J``(`#&<R*!*8J@`(+P0O*@`($"H`
M#4B`2,`O`$ZZ`I9/[P`,L(1G$`CJ``0`#$*20JH`!'#_8+X,K?____\`#&80
M"*H``@`,0I)"J@`$<`!@I$JJ``AF""\*3KH`I%A/#&H``0`09C`;;0`/__](
M>``!2&W__Q`J``U(@$C`+P!.N@(R3^\`#+"\`````6:8("T`#&``_V`DJ@`(
M,"H`$$C`T*H`""5```0(Z@`"``P@4E*2$"T`#Q"`2(!(P,"\````_V``_S!.
M50``+PI![(&F)$A**@`,9QC5_````!9![(->M<AE"'``)%].74YU8.)"DD*J
M``1"J@`((`I@ZDY5__PO"B1M``A(>`0`3KH`PEA/*T#__&88-7P``0`0(`K0
MO`````XE0``()%].74YU-7P$```0".H``0`,)6W__``($"H`#4B`2,`O`$ZZ
M`-Y83TJ`9P8`*@"```Q@S$Y5``!(YP`P)&R#9F`4)E(@*@`$4(`O`"\*3KH$
M1E!/)$L@"F;H0JR#9DS?#`!.74YU3E4``"\*0?K_QBE(@YI"IR`M``A0@"\`
M3KH#]%!/)$!*@&8(<``D7TY=3G4DK(-F)6T`"``$*4J#9B`*4(!@YDY5```O
M+0`(8;983TY=3G5.50``2.<`,)?+)&R#9F`.(&T`"%&(L<IG$B9*)%(@"F;N
M</],WPP`3EU.=2`+9P0FDF`$*5*#9B`J``10@"\`+PI.N@.<4$]P`&#83E4`
M`"\*<@8@+0`(3KH"M"1`U>R#=DJM``AM$C`L@UY(P"(M``BR@&P$2I)F$"E\
M`````H.></\D7TY=3G5R!B`M``A.N@)\(&R#=B\P"`!.N@+(6$]*@&<$<`%@
M`G``8-9.50``+RT`"$ZZ`I)83TJ`9@Y.N@*<*4"#GG#_3EU.=7``8/A.50``
M2.<,("@M``A.N@!V<@8@!$ZZ`B8D0-7L@W9*A&T.,"R#7DC`N(!L!$J29A(I
M?`````*#GG#_3-\$,$Y=3G4P*@`$P'P``V8,*7P````%@YYP_V#B+RT`$"\M
M``PO$DZZ`E)/[P`,*@"PO/____]F#$ZZ`A8I0(.></]@NB`%8+9.5?_\2'@0
M`$*G3KH"PE!/*T#__`@```QG$DJL@WYF""`M__Q.74YU3KH`!G``8/1.50``
M2'@`!$AZ`!Y.N@'L+P!.N@'N3^\`#$AX``%.N@`,6$].74YU7D,*`$Y5``!*
MK(.69P8@;(.63I`O+0`(3KH`"%A/3EU.=4Y5__PO!"MM``C__$JL@W9G+'@`
M8`HO!$ZZ`,Y83U*$,"R#7DC`N(!M[#`L@U[!_``&+P`O+(-V3KH!UE!/2JR#
MFF<&(&R#FDZ02JR#VF<*+RR#VDZZ`8Q83TJL@]9G"B\L@]9.N@%\6$]*K(/>
M9PHO+(/>3KH!;%A/+'@`!`@N``0!*6<4+PU+^@`*3J[_XBI?8`9"I_-?3G-*
MK(."9BI*K(.29R(O+(..+RR#DDZZ`6!03R`L@XI2@.6`+P`O+(.&3KH!3%!/
M8`Y.N@$\+RR#@DZZ`7183R`M__PN;(-J3G4H'TY=3G5.50``2.<.("@M``AR
M!B`$3KH`1"1`U>R#=DJ$;0XP+(->2,"X@&P$2I)F$BE\`````H.></],WP1P
M3EU.=3`J``3`?(``9@@O$DZZ`"Y83T*2<`!@X$CG<``T`<3`)@%(0\;`2$-"
M0]2#2$#`P4A`0D#0@DS?``Y.=2(O``0L;(-R3N[_W"(O``0L;(-R3N[_@B(O
M``0L;(-R3N[_N"QL@W).[O_*+&R#<D[N_WPB+P`$+&R#<D[N_RA,[P`&``0L
M;(-R3N[_XBQL@W).[O_$3.\`#@`$+&R#<D[N_]!(YP$$3.\@@``,+&R#;DZN
M_Y1,WR"`3G5.^@`"(F\`!"QL@VY.[OYB3.\``P`$+&R#;D[N_SHB;P`$+&R#
M;D[N_MHL;(-N3N[_?")O``0@+P`(+&R#;D[N_RY.^@`"(&\`!"QL@VY.[OZ,
M3OH``BQL@VXB;P`$("\`"$[N_=A.^@`"(F\`!"QL@VY.[OZ&3.\``P`$+&R#
M;D[N_LY.^@`"(&\`!"QL@VY.[OZ`(F\`!$SO``,`""QL@[Y.[O\*(F\`!$SO
M``,`""QL@[Y.[O\0(F\`!$SO``\`""QL@[Y.[O[.(F\`!"`O``@L;(.^3N[^
MJB)O``0@;P`(("\`#"QL@[XO!TZN_\0N'TYU3.\#```$+&R#TD[N_Z`@;P`$
M+&R#TD[N_Z8@;P`$+&R#TD[N_[(@;P`$+&R#PD[N_[@@;P`$+&R#PD[N_S0`
M``/L````!0````````A.```)(@``"3(```E(```)=`````,````!```(,```
M"0H```G\`````````_(```/J````V`!``$`!0`!D``$```)Z``(2#P``````
M````````!````````````"``0/____\``0"```4`````'_\?_P``````````
M`````````````@`!``$``````0```````````/_Q``L`#__M`%0`$P`#````
M2````````````````````#(``0````````AN```#O```"'<```/````(@0``
M`\0```B+```#R```")0```/,```(GP```]````BD```#U```"*P```/8```(
MM@```]P```C&```#X```"-8```/D```(W0```^@```CC```#[```".D```/P
M```([P```_0```CS```#^```````````,#$R,S0U-C<X.6%B8V1E9@```"`@
M("`@("`@(#`P,#`P("`@("`@("`@("`@("`@("`@D$!`0$!`0$!`0$!`0$!`
M0`P,#`P,#`P,#`Q`0$!`0$!`"0D)"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`
M0$!`0$`*"@H*"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@````````````
M``````$``````0`````````````````````!`0````$`````````````````
M`````0(````!````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````````````````!0``````^P````2`````0``
M`&X```!^````C````)0```"<````I````*P```"T````O````,0```#,````
MU````-P```#D````[````/0```#\```!!````!$`````````&@```(@```"0
M````F````*````"H````L````+@```#`````R````-````#8````X````.@`
?``#P````^````0`````````#\@```^L````!```#\M``
`
end
!Funky!Stuff!
fi  # end of overwriting check
exit 0
#	End of shell archive