[comp.sys.amiga] Amiga Ogre

hobie@sq.UUCP (02/22/87)

	I have recently discovered that there is a commercial version of the
game Ogre for the Amiga.  This discovery prompted me to dig out my Unix Ogre
which I ported to the Amiga as my first Intuition program.  So here it is.
This posting is in two parts.  Part 1 is the object code and instructions to
play the game, Part 2 is the source code and README. I am posting to this 
group because it's the only Amiga group that appears to be alive and well.

	For those who don't know what Ogre is, it's a `display-oriented'
(whatever that means) game of future tactical ground combat against a big
robot tank.  This version was ported to Amiga from Unix, where it was released
over the net in 1984, and has been tarted up with menus and gadgets and such.
It was created under 1.1 with Lattice 3.02 (seriously!) but it also compiles
under 1.2 with no problems.  Since it was my first large Amiga program, there
are probably serious programming gaffes. I would appreciate these being pointed
out to me.  I would also like it if someone who knows the commercial version
would mail me a comparative review.  I'd like to know if we both used the same
source code as a basis.

-- 
 Hobie Orris				| 	
 SoftQuad Inc., Toronto, Ont.		|"There'll be no more giant leeches
 {ihnp4 | decvax | ? }!utzoo!sq!hobie	| When you find the good Lord Jesus"

hobie@sq.UUCP (02/22/87)

# Amiga Ogre Part 1: The object
# This file contains the following:
# 	Instructions - How to play
#	ogre.info.uue - uuencoded icon for the game
#	ogre.uue - uuencoded game object code
#
# Note:  To use the help option in the game menu, the file
#	 `instructions' should be in the volume `Ogre:'
#
: To unbundle, sh this file
echo x - instructions 1>&2
cat >instructions <<'@@@End of instructions'

                              OGRE 2086
                              ---------

   Introduction
   ------------

   Ogre is a game of tactical ground combat in the year 2086.  In this
advanced age, the Ogres are giant cybernetic tanks, each prodigiously armed
and possessing a limited self-awareness, allowing them to do their own
tactical planning.  Their weaponry includes long-range missiles, heavy main
batteries (`hellbores'), smaller, secondary batteries (`infinite repeaters'),
and short-range anti-personnel weapons.  The actual configuration of these
weapons depends on the type of Ogre.  In the game, Ogres Mark III and Mark V
are represented.

   The other combatants on this future battlefield include rapid-fire
howitzers, heavy tanks, mobile missile launchers, GEVs, and infantry wearing
powered armor.  The GEVS (short for Ground Effects Vehicle) are armed and
armored hovercraft which can strike their targets and retreat before the
enemy has a chance to retaliate.

   The game pits an Amiga-controlled Ogre (naturally) against a human
opponent who has control of a mixed force.  The goal of the Ogre is to
destroy the human command post by fire or by stomping on it.  The goal of
the human (this means you!) is to prevent this by immobilizing the Ogre.
I say `immobilize' because there is no way to actually destroy the Ogre;
even when all of its individual weapons systems are destroyed, it can still
move and can still crush things, including command posts.  Therefore, all of
the Ogre's treads must be eliminated.


   Starting the Game
   -----------------

   To start the game, type `ogre' (assuming it's in your current directory.)
or click the Ogre icon from Workbench.  At this point, the game loads and
sets up the playfield. The map key is as follows:

                              7 - clear terrain
                              * - crater

Craters are impassable to everything. Clear terrain is, well, clear.


   Sequence of Play
   ----------------

   A.  Human Deployment

   B.  Ogre Movement
   C.  Ogre Combat

   D.  Human Movement
   E.  Human Combat

   F.  Repeat steps B-E until someone wins.

   These items will be presented in order:


   A.  Human Deployment
   --------------------

   After the map is displayed, the cursor is left sitting in the middle of
the map and a message is displayed indicating how many armor and infantry
units are left to place, as well as the command post (CP).  To place your
units, move the cursor to the desired location and press the key for the
type of unit you wish to put there.  Only one unit may be placed in a single
location.  The operative keys are:

   Cursor movement:

                              w    e
                                \ /
                             a - s - d
                                / \
                               z   x

   The `s' key is for `sit', which is not used for deployment, but is used
later in the movement phase.

   The gadgets in the lower right of the screen perform the same function
as these keys.

   Unit Placement:

   To place a unit, press the letters used for displaying the unit type or
select from the Deploy menu. The following notation is used to indicate the
capabilities of the units:

                        a/b Mc Dd

where `a' is the unit's attack strength, `b' is the range, in spaces, of the
unit's weapon, `c' is its movement, in spaces per turn, and `d' is its
defensive strength.

         Unit  Abilities    Description
         ------------------------------------------------------------------
          C   (0/0 M0 D0) - Command Post. Only one of these can be placed
                            per game.  It is suggested that it be placed
                            well to the rear (the right side of the map.)

          H   (6/8 M0 D1) - Howitzer.  This is the most powerful offensive
                            unit but very vulnerable to attack, due to its
                            immobility and weak defence.  Note that a
                            howitzer is worth TWO armor units for deployment
                            purposes.

          T   (4/2 M3 D3) - Heavy Tank.  This is a well-rounded unit, except
                            that, the range of its gun requires it to get
                            pretty close to an Ogre in order to fire.  Ogres
                            tend to stomp on heavy tanks that get too close.

          M   (3/4 M2 D2) - Missile Tank.  Although slow-moving, the missile
                            tank can outrange all but the Ogre's most
                            powerful weapons and still keep out of the way
                            of the Ogre's crushing treads if the Ogre has
                            been slowed down by damage.

          G (2/2 M4-3 D2) - GEV. The GEV is built for speed.  It has light
                            armor and armament, but moves TWICE per turn;
                            once before combat, and once afterwards,allowing
                            it to move in, fire, and get out of harm's way.
                            A pack of GEVs can surround an Ogre, concentrate
                            their fire and then scatter, leaving the Ogre
                            with few targets of opportunity.

          I   (*/1 M2 D*) - Infantry.  Unlike armor units, infantry can with-
                            stand losses and still function as a unit. The *
                            indicates the current strength of the unit. A
                            full squad has a strength of 3, but squads of 2
                            or 1 are allowed.  To select a full squad, hit
                            `I' or `3'; for a lesser squad, `2' or `1'. The
                            menu selection for infantry is for a full squad.
                            As the squad sustains losses, it will be reduced.

          O   several     - The Ogre.  The Ogre has many different weapon
                            systems, each of which has its own attack, range
                            and defence.  Its movement is 3 at the beginning
                            of the game but can be reduced to 0 by tread
                            damage.

   As you select units, the count at the bottom of the screen is reduced.
You must deploy your full complement of units before play can begin. At this
point, a display of the Ogre's weapons and treads is printed on the bottom
of the screen.  Each line has the format,

            Main Batteries:      1  (4/3 D4)

where `1' is the current number of functioning batteries, 4/3 is the attack
strength and range of the weapon, and D4 indicates it has a defense strength
of four.  As the Ogre sustains losses, the number is reduced, until there
are none left, at which point the line will no longer be displayed.


   B. Ogre Movement
   ----------------

   The Ogre enters on the left side of the map as soon as deployment is com-
plete.  Its initial movement allowance is three spaces, but on the first
turn it moves only one.  If there are units within range of its movement,
the Ogre will run them over, with a fifty percent chance that the unit will
be destroyed.  This type of overrun attack is resolved immediately and does
not require that the Ogre fire any of its weapons.


   C. Ogre Combat
   --------------

   After moving, the Ogre will fire some or all of its weapons at whatever
targets are in range.  It will attack a target more than once if the first
attack fails to destroy the target.  The Ogre comes equiped with missiles
which can be fired only once.  After being fired, they are removed from the
Ogre's status display.  The Ogre's anti-personnel weapons can only be fired
at infantry type units.

   There are three possible results of Ogre combat: no effect, disable, and
destroy.  A no effect result means that the target can fire and move
normally in the human turn.  Disablement has different effects on infantry
and armor units:  a disable result against an armor  unit causes the unit
to be re-displayed in lower case and it can neither fire nor move for the
next turn; an infantry unit has its combat strength reduced by 1 and the new
value is displayed.  On a destroy result the target is eliminated and removed
from the display.


   D. Human Movement
   -----------------

   When all Ogre attacks have been resolved the cursor is positioned on each
movable (non-CP and non-howitzer) unit in turn, the message, "Move ..." is
displayed and the player is free to move that unit up to the limit of its
movement allowance.  The movement keys are described above; `s' is used to
indicate that the unit is not to be moved.  Again, the arrow gadgets let you
move units and the `S' gadget is for `sit'. If you do not wish to move a unit
its full movement, press `s' or click the `S' gadget when you are done.  Note
that the map simulates a hexagonal grid, so that there are six possible
directions of movement. The following example illustrates an important fact
for calculating ranges:

                      7    7   7   7   7   7
                     7   7   7   T   7   7
                       7   7   7   G   7   7
                     7   7   7   O   7   7
                       7   7   7   7   7   7

The GEV is adjacent to the Ogre, so the range between them is one space; the
heavy tank, however, is two spaces away (one to the GEV and one to the Ogre).
In other words, horizontal and diagonal spaces are adjacent and vertical ones
are not.

   When all eligible units have been moved and there are units close
enough to fire on the Ogre, the combat phase begins.


   E. Human Combat
   ---------------

   The cursor is automatically positioned to each unit eligible to fire and
the player is required to select a target at which to fire.  Each weapon
system of the Ogre and its treads are targets.  As units are allocated for
firing at a particular target (eg. the main batteries), the odds of the
attack are displayed next to the line describing the target. For example, if
a missile tank (attack 3) is allocated to fire at a secondary battery
(defense 3) the odds 1-1 are displayed.  If a howitzer (attack 6) is then
allocated, the odds are updated to 3-1 (3 + 6 = 9 versus defence 3). You can
allocate as many units as are within range to attack a single weapon system,
or you can type `r' (for resolve) to carry out the attack immediately.

    Attacking the Ogre's treads is a different process.  All attacks
against treads are automatically at 1-1 odds and are resolved immediately
as each unit is allocated.  If the attacker scores a hit on the treads, a
number of tread points equal to the attacker's strength are destroyed,
whereas other targets are attacked individually (eg. if the above-mentioned
3-1 attack on the secondary batteries is successful then one battery is 
destroyed).  The number of treads an Ogre has affects its movement.  All Ogre
types start with a number of treads (45 for Mark III, 60 for Mark V) and a
movement allowance of three.  When 1/3 of these treads are destroyed the
Ogre's movement drops to two.  When 2/3 are destroyed it drops to one.  When
all are destroyed, the Ogre is immobile and you win.

   Needless to say, the more attacking strength used against a target, the
better your chances for destroying it.  However, odds in excess of 4-1 are
treated as 4-1, so allocating 20 attack points against a secondary battery
(6-1) is no better than allocating 12 attack points (4-1).

   The keys used for allocating an attack are:

           Key  Specs      Description
-------------------------------------------------------------------------
            m   (6/5 D3) - Missile.  Remember, Ogre missiles are one-shot
                           only.

            b   (4/3 D4) - Main Battery

            s   (3/2 D3) - Secondary Battery

            a   (1/1 D1) - Anti-personnel weapons. Can only be fired at
                           infantry.

            t   (-/- D1) - Treads.  These are weapons only to the extent that
                           a mobile Ogre can overrun enemy units.

            r            - Resolve. All attacks currently allocated are
                           carried out.

            p            - Pass.  Save this unit to fire later on in the
                           phase.  This is useful if you want to combine
                           the fire of two units which do not fire in
                           sequence.


   The Target menu allows you to select targets as in the above table.


   Self-Destruct
   -------------

   This is an optional rule included in the Steve Jackson Microgame, but not
in the original Unix version of Ogre.  I put it in just to be mean.

   If the Ogre has its treads reduced to zero but is within four spaces of
the human command post, it will detonate its atomic pile, eliminating itself
and everything within four spaces.  All armor units five spaces away are
disabled by this blast.  An Ogre self-destruction results in a drawn game
since it will only self-destruct if it is within 4 hexes to the command
post.


   Credits
   -------

   The concept of the Ogre-style war machine originated in the Bolo stories
by Keith Laumer.  These ripping good stories are available in the anthologies
"Bolo", published by Berkeley, and "Rogue Bolo", published by Baen Books.

   The game Ogre was originally published as a paper board game in 1977 by
Steve Jackson Games.  It is widely regarded as a classic war game and spawned
a series of expansion games by Steve Jackson called GEV, ShockWave, and
Battlesuit.

   The computer game Ogre was written for Unix by Michael Caplinger of Rice
University in 1982 and released to the public domain over Usenet.  The game
was ported to the Amiga by Hobie Orris (me) in 1986 and distributed to
anybody who wants it.

   Comments, criticisms or enhancements are welcome.

   Hobie Orris
   9 Ferrier Ave.			uucp: utzoo!sq!hobie
   Toronto, Ont.			ci$:  73657,1573
   Canada
   M4K 3H5
@@@End of instructions
echo x - ogre.info.uue 1>&2
cat >ogre.info.uue <<'@@@End of ogre.info.uue'
begin 644 ogre.info.uue
MXQ   0           $@ '0 $  ,  0 !\%                          
M     ^@              )P    )                      !( !P  @ "
MO0 #                                                        
M                                                            
M                                                            
M                                                            
M    ??@          #[\                               /OOOO[[[]
M^   'WWW[^_??OP  !]]]^_OWW[\   /OOOO[[[]^                   
M                                                    !_X_X_P_
M@     8&,&,,,      &!C ###      !AX]X_P_@     8>/&/&/      &
M'CQCQCP     !_X_X\8_@                                       
M                  ____P        /____         ____ "(       '
M_P ___@      __ ?X($      _____! __\  ?________P   /________
M^   '_________P  #_________^   __________@  '_________P   __
<_______X                             /__
 
end
@@@End of ogre.info.uue
echo x - ogre.uue 1>&2
cat >ogre.uue <<'@@@End of ogre.uue'
begin 644 ogre.uue
M   #\P        !0         $\   !G    %    J0   )K    #    HX 
M   Q   !^P   !\   %_    #P    ,   "\     @   )@    G    'P  
M Q@    ,    !    F(    5    V@    @   ##    +P    ,   "6    
M$P   %8    !    00    $    :    1     $   "R    /     $   & 
M    !    /P   !;     P   &0   "A    6    "\    >    +     D 
M   !    '@    8   !X    5P   "$   (>    !0    0   &8    $   
M #     -    $0   "@    ,    $0    0    V    !    .4    H    
M 0   $4   !F    !0   #P    <    /    ^D   !G(\     X(\@    \
M2.=^_BQY    !"/.    )"//    -$*Y    ,)/)3J[^VBA 2JP K&<  'YA
M  %.0J=.N0   #!8CR! (&@ K-'(T<@B:  0T\G3R2 Y    .'( $AG0@5* 
M0F=2@ ) __Z?P%6 0G<  " Y    ."!Y    /"0 4X#4@1^P   @ %."4<C_
M]A^\ " @ %."'[$@ "  4<K_^")/+PE.N0    !P &!>80  TF$  +PCP   
M # O "1 ("H )&<0+'D    H($ B*   3J[_@B(J "!G'"0\   #[4ZN_^(C
MP    $!G"N6(($ I:  ( *1(>0    !.N0    !P & $("\ !"\ 3KD   "T
M2KD    P9RPB.0   "!G!$ZN_]PB.0   $!G!$ZN_]PL>0    1.KO]\(GD 
M   P3J[^AB ?+GD    T3-]_?DYU2.<!!BX\  . !RQX  1.KO^43-]@@'!D
M8)Q![ !<3J[^@$'L %Q.KOZ,3G5#^0   $1.KOYH(\     H9\).=0   ^P 
M   3     0   90   &*   !4@   48   $P   !)    1P   $     [@  
M ,X   "^    ?@   '@   !:    )    !X    8    "     (    !    
M*@   18    "    -P   08   "L     0   $L   !          _(   /J
M    %                         0                             
M                                    9&]S+FQI8G)A<GD    #\@  
M ^D   *D3E;_RB!Y    !"\H %9.N0   *Q8CR/     '$J 9@9P $Y>3G4@
M>0   !Q#[O_*<#,2V%'(__PO.0   !Q.N0   ,!8CTJN_]YG1" N_]X,@   
M $!G) R    ! &<.#(    ( 9B)A  6H8")(;O_*80 #>EB/3EY.=4AN_\IA
M  /&6(].7DYU< !.7DYU3EY.=4Y6__QP/"\ +SP   $L<  O "\ 2'D   CZ
M2'D   CF2'D   C2+SD    $3KD   "\3^\ ("U __Q*@&<(< ,M0/_\8 9P
M!2U __P@+O_\3EY.=4Y6__PC_   !%H   0\(_P   1X   $6I'((\@   1X
M(_P   26   $3B/\   %8@  !&PC_   !E    2*(_D   =T   $2B/Y   '
M>   !&@C^0  !WP   2&+4C__" N__P,@     9L('(B3KD     ($#1_   
M!)8B0-/\   $N"")4J[__&#4D<@CR   !4 M2/_\("[__ R     !VP@<B).
MN0     @0-'\   %8B) T_P   6$((E2KO_\8-21R"/(   &+B/(   &4"U(
M__P@+O_\#(     &;"AR%$ZY     "! T?P   > ("[__.6 (D#3_   !KHA
M40 ,4J[__&#,0J[__" N__P,@     =L*'(43KD     ($#1_   !_@@+O_\
MY8 B0-/\   ',"%1  Q2KO_\8,PC^0  !UP   B00J[__" N__P,@     9L
M,'(B3KD     ($#1_   !)8@+O_\<A1.N0     B0-/\   '@" )(4  $E*N
M__Q@Q$*N__P@+O_\#(     ';#!R(DZY     "! T?P   5B("[__'(43KD 
M    (D#3_   !_@@"2%  !)2KO_\8,0C_   "(0   9B2'D   0\+SD    $
M3KD   "D4(].7DYU3E;__$*N__P@+O_\#(     &;#!R+$ZY     "! T?P 
M  , ("[__'(43KD     (D#3_    G0@"2%  !)2KO_\8,0C_    'P   )^
M(_P   #$   "DB/\   !#    J8C_    50   *Z(_P   &<   "SB/\   !
MY    N(C_    BP   +V0KD   0(3EY.=4Y6__Q"IR\Y    !$AY   # $ZY
M    B$_O  Q"KO_\("[__ R     !VQ4<BQ.N0     @0-'\   # '#_+P O
M""\Y    !$ZY     $_O  P@+O_\<BQ.N0     @0-'\   # $*G+SD    $
M+PA.N0   $1/[P ,4J[__&"@3EY.=4Y6__9P "!N  @P*  8+T    *     
M'R(O  #JB0*!    /SU __X]0?_\4D!F!G  3EY.=7  ,"[__G('3KD     
M($#1_   ")AP # N__S1P! 03EY.=4Y6__Q"KO_\("[__ R     !VPD<BQ.
MN0     @0-'\   # " ((FX ""!I !RQP&<&4J[__&#0(&[__-'\   $-! 0
M3EY.=6$  99.=4Y6  !"IR\N  AA   T4(](>0  "0YA  "^6(]"IR\N  AA
M   <4(].7DYU2'D   E%+SD    ,80 $>%"/3G5.5O_P("X "%* '7P F__X
M<@0O 2\ 2&[_^2U   A.N0    !/[P ,+4#_]%* ';P .PCX4H!![O_XT<!R
M!"\!+RX #"\(+4#_\$ZY     $_O  PB+O_P+4#_]-"!';P 2 CX0C8(^4AN
M__@O.0    PM0/_P80 $8E"/3EY.=2\Y    #$ZY     %B/3G5A  "J3G5.
M5@  +RX ""\Y    #&$ !#10CTY>3G5.5@  $^X "P   "Q(>0   "PO.0  
M  QA  .J4(].7DYU3E;__D(N__Y(>0   "TO.0   ! O.0   !AA  2.3^\ 
M#!U __X, /__9QH,   _9@Q.N0     =0/_^8 @0+O_^3EY.=6$ ^A(=0/__
M2@!GL@P  #]F#$ZY     !U __Y@H! N__].7DYU< <O &$  >)8CT*G3KD 
M    6(].=4Y6__I"ITAY   )1DZY    Z%"/(\     @2H!F"G !+P!A  &N
M6(]"ITAY   )4DZY    Z%"/(\     H2H!F"G "+P!A  &*6(]"ITAY   )
M9$ZY    Z%"/(\     D2H!F"G #+P!A  %F6(]"ITAY   )=4ZY     %"/
M(\     42H!F"G $+P!A  %"6(\O.0   !1.N0    !8CR/     #$J 9@IP
M$R\ 80 !(%B/0J=(>0  "8!.N0    !0CR/     &$J 9@IP!2\ 80  _%B/
M+SD    83KD     6(\CP    !!*@&8*< PO &$  -I8CTAY    7$ZY    
M8%B/(\      2H!F&DAY   )BDZY     %B/<!0O $ZY     %B/(_D     
M    2DAY    +$ZY    =%B/(\     $2H!F"' &+P!A?%B/80#[5&$ ^6(O
M.0    0O.0   ! O.0    QA  %H3^\ #"U __Q*@&<(< <O &%*6(](;O_[
M+SD    080 ")E"/+SD    03KD   %P6(\=0/_[2@!F$"\Y    $$ZY   !
MA%B/8 XO.0   !A.N0   *Q8CTY>3G5.5@  ("X " 2      6T  .H,@   
M !-L  #@Y8!.^P@"8   R&   +9@  "D8   A&   &1@  !$8   ,F   +I@
M  "V8   0F   *Y@  !68   IF   *)@  ">8   FF   )9@  "28   5B\Y
M    #$ZY   !-%B/+SD    $3KD    P6(\O.0    !.N0   !Q8CR\Y    
M&$ZY    J%B/+SD    03KD   !&6(\O.0   !1.N0   *A8CR\Y    #$ZY
M    1EB/+SD    D3KD   $ 6(\O.0   "A.N0   0!8CR\Y    ($ZY   !
M %B/+RX "$ZY     %B/3EY.=4Y6__P@;@ ((6X $  H<'PA0  D<  O "\(
M+P!(>0  "9Q.N0   11/[P 0(&X "")N  PC:  4 !0C:  8 !A.7DYU3E8 
M "!N  @Q?  # !PB;@ ,P8D"0/_^P8DA20 H< $A0  D+PA.N0   4A8CW  
M3EY.=4Y6   @;@ (,7P  P <(FX #,&) D#__L&)(4D *"%N !  )"\(3KD 
M  %(6(]P $Y>3G5.5@  (&X "#%\  , '")N  S!B0) __[!B2%) "AP_R% 
M "0O"$ZY   !2%B/< !.7DYU3E8  "!N  @Q?  " !PB;@ ,P8D"0/_^P8DA
M20 H< $A0  D+PA.N0   5Q8CW  3EY.=4Y6__XO+@ (3KD   "L6(]*@&8.
M+RX "$ZY    U%B/8.(O+@ 0+RX #&&@4(\@;@ 0$!!.7DYU3E;__$CG  0O
M+@ (3KD   "L6(]*@&8*</],WR  3EY.=2!N  PJ:  H+RX $"\(80#_8E"/
M$!5,WR  3EY.=0   ^P   !+     P  "2(   =B   '7   !SX   <F   &
MX@  !IP   9X   &5   !C    3$   $J   !(8   1H   $-@   \P   .B
M   #>    V(   -<   #6    U(   -.   #2    T0   ,^   #.@   S0 
M  ,P   #*@   R8   ,@   #'    PH   +V   "P    KH   *V   "I   
M I    )D   "4    C    (L   "'    @X   'D   !U@   ;8   &P   !
MH    9@   %X   !:    6    %    !/    38   $R   !+    2@   $B
M   !'@   1@   $4   !#@   0H   $$    _    /@   #R    [@   +8 
M  "P    J@   #     $   (Z   "-H   C,   (O@  "+    BB   (E   
M"(8   AX   (:@  !^H   ?:   'Q   ![@   >6   'D   !XH   =P   '
M6   !S0   <2   '!   !O    ;,   &O@  !JH   :&   &8@  !CX   6\
M   %M@  !;    68   %D@  !8P   5V   %6   !40   3*   #U    ZX 
M  -R   "Q@   +P    Z    *    !@    &     @    X   8    %V@  
M  ,    A   (^@  !U    8@     0   "X   =$     @   #    4B   $
M]@    X   !#   $8   !"X   /$   #F@   P(   +N   "G    H@   )<
M   "2    @8   '.   !D    5@    4    2P  "C(   H,   )V   ":0 
M  EP   )*   ".X   C@   (T@  "'    ?@   'R@  !GX   9:   &-@  
M $    I>   *(@  !_     0    !    $T   BV   (F@  !N@   :B    
M!    $X   C$   (J   !PH   ;$    "0   $\   B,   (?@  !V@   <L
M   #W    [0   -^   "S    ,(        #\@   ^H   )K=&]P87HN9F]N
M=          (  %/9W)E(#(N,"!B>2!(;V)I92!/<G)I<P       H  R ,!
M   #8   ' @              !0           !D "T"@ #(  \      H  
MR  "  &    /    #                /__\ "  !  O_ 0 +_@$ "_P!  
MOX 0 +_ $ "_X!  N_ 0 +'X$ "@_!  @'X0 ( _$ " 'Y  @ \0 ( &$ " 
M !  ___P /__\ "  !  @/_0 (!_T " /]  @!_0 ( _T " ?]  @/W0 ('X
MT "#\%  A^ 0 (_ $ "?@!  CP 0 (8 $ "  !  ___P /__\ "  !  @( 0
M (& $ "#@!  AP 0 (__T "?_]  O__0 )__T "/_]  AP 0 (. $ "!@!  
M@( 0 (  $ "  !  ___P /__\ "  !  @! 0 ( 8$ " '!  @!X0 +__$ "_
M_Y  O__0 +__D "__Q  @!X0 ( <$ " &!  @! 0 (  $ "  !  ___P /__
M\ "  !  @ 80 ( /$ " 'Y  @#\0 (!^$ "@_!  L?@0 +OP$ "_X!  O\ 0
M +^ $ "_P!  O^ 0 +_P$ "  !  ___P /__\ "  !  A@ 0 (\ $ "?@!  
MC\ 0 (?@$ "#\%  @?C0 (#]T " ?]  @#_0 ( ?T " /]  @'_0 (#_T " 
M !  ___P /__\ "  !  @?P0 (/^$ "'!A  C@ 0 (P $ ". !  A_P0 (/^
M$ " !Q  @ ,0 ( '$ "&#A  A_P0 (/X$ "  !  ___P        %  2  $ 
M  !\ @$            4 !(  0   ,0" 0           !0 $@ !   !# (!
M            %  2  $   %4 @$            4 !(  0   9P" 0      
M     !0 $@ !   !Y (!            %  2  $   (L @$           '"
M 'L %  2  0  P !   "=                                    =8 
M>P 4 !( !  #  $   *(                                   !N "-
M !0 $@ $  ,  0   IP                                   '@ (T 
M%  2  0  P !   "L                                    <( GP 4
M !( !  #  $   +$                                   !U@"? !0 
M$@ $  ,  0   M@                                   ', (T %  2
M  0  P !   "[                             !W96%D>GAS        
M 0   '     !                            <0   '     !        
M                    X@   '     !                            
M     '  " !2                                    "@!P  @ 4@  
M                                 !0 <  ( %(                 
M                   > '  " !2                                
M    * !P  @ 4@                                   #( <  ( %( 
M                                     (( " !2                
M                    "@""  @ 4@                              
M     !0 @@ ( %(                                    > (( " !2
M                                    * ""  @ 4@              
M                     #( @@ ( %(                             
M       \ (( " !2                                      ""  @ 
M4@                          0R!#;VUM86YD(%!O<W0 2"!(;W=I='IE
M<@!4($AE879Y(%1A;FL 32!-:7-S:6QE(%1A;FL 1R!'158 22!);F9A;G1R
M>0     &<@  !H$   :,   &F0  !J@   :N="!4<F5A9', 8B!-86EN($)A
M='1E<GD <R!396-O;F1A<GD@0F%T= !M($UI<W-I;&4 82!!;G1I+5!E<G-O
M;FYE; !P(%!A<W,@;F]W '(@4F5S;VQV92!N;W<     !M(   ;;   &Z@  
M!OL   <%   '%@  !R$_($EN<W1R=6-T:6]N<P     '3$1E<&QO>0!487)G
M970 2&5L<      '8   !V<   =N P             ,           #    
M          P           ,             #            P          
M   ,           #              P           ,             #   
M         P             ,           #              P         
M  ,             #            P             ,           #    
M          P           ,             #            P          
M   ,           #              P          $-(5$U'20!T8G-M87!R
M/P       $-H;V]S92!A;B!/9W)E('1Y<&4 36%R:R!)24D 36%R:R!6   #
M 0   #P "@        BM      ,!    !P $        ",$      P$    '
M  0        (R@     @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @
M(" @(" @(" @(" @(" @(" @(" @("  #&1O<RYL:6)R87)Y &EN='5I=&EO
M;BYL:6)R87)Y &=R87!H:6-S+FQI8G)A<GD 8V]N,2YW<FET90!C;VXQ+G)E
M860 0V%N)W0@;W!E;B!W:6YD;W< 8V]N<V]L92YD979I8V4      ^P    S
M     P  "08   CR   (W@  "(P   AX   (9   "%    @\   (*   "!0 
M  @    '[   !]@   ?$   'L   !YP   >(   '?   !W@   =T   '7   
M!T@   =$   '0   !SP   <X   '-   !S    ;.   &R@  !L8   ;"   &
MO@  !KH   0:   #[@   \(   .6   #:@   SX   ,2   "]@   N(   +.
M   "N@   J8   *2   "?@   &P   !&    #         /R   #ZP    P 
M  /R   #Z0   HY.5O_V3KD   20< $M0/_\#*X    <__QN0G !+4#_^" N
M__@,@    !QN*B\ +R[__&$  &!0CTJ 9A1PMR\ +R[_^"\N__QA  #J3^\ 
M#%*N__A@RE*N__Q@M&$ !CA.N0   VI.7DYU3E8  ! N  \2+@ +D@!> 2!N
M ! 0@1(N  O2 ' RD $@;@ 4$(!.7DYU3E;__A N  M(@$C $BX #TB!2,%(
M;O_^2&[__R\!+P!AM$_O ! 0+O_^2@!K% P  "9N#A N__]* &L&#   #F\&
M< %.7DYU< !.7DYU3E;__A N  M(@$C $BX #TB!2,%(;O_^2&[__R\!+P!A
M /]F3^\ $! N__X,   *;10,   F;@X0+O__2@!K!@P   YO!G !3EY.=7  
M3EY.=4Y6__X0+@ +2(!(P!(N  ](@4C!2&[__DAN__\O 2\ 80#_%$_O ! 0
M+O__2(!(P!(N__Y(@4C!XX%2@2\!+P!.N0  !-90CQ N !-(@$C +P!.N0  
M!818CTY>3G5.5O_\$#D   %1L"X "V84$#D   %2L"X #V8(80 "7$Y>3G5"
MKO_\("[__+"Y   !5&Q:<@M.N0     @0-'\     !(H  FR+@ +9CH@0-'\
M     ! H  JP+@ /9B@@+O_\<@M.N0     @0-'\     ! H  A7 &<,+R[_
M_&%R6(].7DYU4J[__&":$"X "TB 2, 2+@ /2(%(P2\!+P!A  064(]*@&<D
M$"X "TB 2, 2+@ /2(%(P70J+P(O 2\ 80#^W$_O  Q.7DYU$"X "TB 2, 2
M+@ /2(%(P72W+P(O 2\ 80#^N$_O  Q.7DYU3E;_]B N  AR"TZY     "! 
MT?P     '6@ "?__($#1_      =:  *__X@0-'\     ! H  A(@$C #(  
M   #9P !'@R      F<  ,0,@     %F  $J("X "'(+3KD     ($#1_   
M   0$$B 2, ,@    $EF4! N__](@$C $B[__DB!2,$O0   ("X ""]!  1R
M"TZY     "! T?P     $"@  4B 2, &@    # O "\O  @O+P (80#][$_O
M  Q@  "X$"[__TB 2, 2+O_^2(%(P2]    @+@ (+T$ !'(+3KD     ($#1
M_      0$$B 2, O "\O  @O+P (80#]I$_O  Q@<! N__](@$C $B[__DB!
M2,$O0   ("X ""]!  1R"TZY     "! T?P     $!!(@$C +P!.N0   6!8
MCR\ +R\ ""\O  AA /U43^\ #& @$"[__TB 2, 2+O_^2(%(P72W+P(O 2\ 
M80#],D_O  Q.7DYU3E;__AUY   !4?__'7D   %2__Y(>0    !.N0  !6Q8
MCQ N__](@$C $B[__DB!2,%T3R\"+P$O &$ _.Q/[P ,2'D    *3KD   5L
M6(].7DYU3E;__A N  M(@$C $BX #TB!2,%(;O_^2&[__R\!+P!A /OH3^\ 
M$! N__](@$C $B[__DB!2,'C@5*!+P$O $ZY   $UE"/3EY.=4Y6   @+@ (
M<@M.N0     @0-'\     !(H  E(@4C!($#1_      0*  *2(!(P"\ +P%A
M /]^4(].7DYU3E;_W! N  M(@$C $BX #TB!2,$O0   D($2+@ 32(%(P10N
M !=(@DC"+T$ !)*")"\  "8O  24@QU __\=0?_^2H)J!$2"8!00+@ +2(!(
MP!(N !-(@4C!D($D "U"__ 0+@ /2(!(P!(N !=(@4C!D(%*@&H$1(!@$A N
M  ](@$C $BX %TB!2,&0@2U __00+O__2(!(P!(N__Y(@4C!D(%*@&H$1(!@
M$A N__](@$C $B[__DB!2,&0@2U __A"KO_L< $M0/_H("[_Z R      VP>
MY8 B+O_LY8$D-@CPM+88\&P&+6[_Z/_L4J[_Z&#6("[_[.6 +78(\/_D(C8(
M\"VN__@(\!U!__U(@4C!+4'_^$*N_^QP 2U _^@@+O_H#(     ";![E@"(N
M_^SE@20V"/"TMACP; 8M;O_H_^Q2KO_H8-8@+O_LY8 B+O_D)#8(\-2!( ).
M7DYU3E;__$*N__P@+O_\#(     1;##C@"! T?P    4$A"R+@ +9A@@0-'\
M    %! H  &P+@ /9@9P 4Y>3G52KO_\8,1P $Y>3G5.5O_\0J[__" N__P,
M@    !%L-N. ($#1_    !02$$B!2,$@0-'\    %! H  %(@$C ="HO B\ 
M+P%A /I@3^\ #%*N__Q@ODY>3G5.5O^P("X #'(+3KD     ($#1_      0
M$$B 2,!R* 2!    "&L  RBPNQ@(9O!.^Q@&    26   H(   !48  !X@  
M $=@  %"    36   *(   !(8    G !+P!P$"\ 3KD   364(]P$"\ 3KD 
M  266(\@+@ ,<@M.N0     @0-'\     !(H  %(@4C!($#1_      4*  "
M2()(PB! T?P     %B@  TB#2,,@0-'\     ! H  =(@$C +P O R\"+P$O
M+@ (2'D    V2&[_L$ZY     $_O !Q(;O^P3KD   5L6(]@  )>< $O ' 0
M+P!.N0  !-90CW 0+P!.N0  !)98CR N  QR"TZY     "! T?P     $B@ 
M 4B!2,$@0-'\     !0H  )(@DC"($#1_      6*  #2(-(PR! T?P     
M$"@ !TB 2, O "\#+P(O 2\N  A(>0   %)(;O^P3KD     3^\ '$AN_[!.
MN0  !6Q8CV   <9P 2\ <! O $ZY   $UE"/<! O $ZY   $EEB/("X #'(+
M3KD     ($#1_      2*  !2(%(P2! T?P     %"@  DB"2,(@0-'\    
M !8H  -(@TC#($#1_      0*  '2(!(P"\ +P,O B\!+RX "$AY    <DAN
M_[!.N0    !/[P <2&[_L$ZY   %;%B/8  !+G !+P!P$"\ 3KD   364(]P
M$"\ 3KD   266(\@+@ ,<@M.N0     @0-'\     !(H  %(@4C!($#1_   
M   4*  "2()(PB! T?P     %B@  TB#2,,@0-'\     ! H  =(@$C +P O
M R\"+P$O+@ (2'D   ")2&[_L$ZY     $_O !Q(;O^P3KD   5L6(]@  "6
M< $O ' 0+P!.N0  !-90CW 0+P!.N0  !)98CR N  QR"TZY     "! T?P 
M    $B@  4B!2,$@0-'\     !0H  )(@DC"($#1_      6*  #2(-(PR! 
MT?P     $"@ !TB 2, O "\#+P(O 2\N  A(>0   *=(;O^P3KD     3^\ 
M'$AN_[!.N0  !6Q8CTY>3G4   /L    %@    (   FV   )'@  "(8   ?N
M   '5@  "BX   F6   (_@  "&8   ?.   $5@  !"@   &(   )J@  "1( 
M  AZ   'X@  !TH   2B   !=@   &(    &    "P    8   H6   )?@  
M".8   A.   'M@  !KX   :P   &=@  !F8   10   $(@   "8    =   )
M_   ">P   G<   )S   "60   E4   )1   "30   C,   (O   "*P   B<
M   (-   ""0   @4   (!   !YP   >,   '?   !VP   ;X   $T   !,  
M  /    #>@   RH   +P   "M@   J@   *:   " @   >0   '2   !P   
M!!H   02   !I    9@    !    +    \X    %    +P  "B    F(   (
M\   "%@   ?     #@   $,   G$   )+   ")0   ?\   '9   !O    2X
M   #N    W(   ,B   "Z    I(   'Z   !R@        /R   #Z@   #&;
M,3LS,CLT,&T FS [,S$[-#!M !$0$PT-$@X/#0\/"@D/"@P'#@L*#@<,!@<*
M" 8$"0D$"0,E<R!H;W=I='IE<B H)60O)60@1"5D($TE9"D )7,@;6ES<VEL
M92!T86YK("@E9"\E9"!$)60@325D*0 E<R!'158@*"5D+R5D($0E9"!-)60I
M "5S(&AE879Y('1A;FL@*"5D+R5D($0E9"!-)60I "5S(&EN9F%N=')Y("@E
M9"\E9"!$)60@325D*0     #\@   ^D   '[3E;__$JN  QO$B N  @B+@ ,
M3KD     4H!@ G &+4#__ R     !F\&< 8M0/_\#*X    !__QF%B N  CC
M@+"N  QL!'  8 )P 2U __P@+O_\3EY.=4Y6   O+@ ,+RX "&&:4(_E@"! 
MT?P    :(!!.7DYU3E;__' 0+P!.N0  !)98CTAY    ;$ZY   %;%B/3KD 
M  >B(&X "! 02@!O2&$ !"YR!TZY     "! T?P    V(FX "! 12(!(P'(#
M+P$O "](  AA /\P4(\@;P  T< 0$%< 9@X0.0   4I3 !/    !2B!N  @0
M*  !2@!O2F$  ]IR!TZY     "! T?P    V(FX "! I  %(@$C <@0O 2\ 
M+T@ "&$ _MI0CR!O  #1P! 05P!F#A Y   !2U, $\    %+(&X "! H  )*
M &]*80 #A'('3KD     ($#1_    #8B;@ ($"D  DB 2,!R R\!+P O2  (
M80#^A%"/(&\  -' $!!7 &8.$#D   %,4P 3P    4P@;@ ($"@  TH ;TIA
M  ,N<@=.N0     @0-'\    -B)N  @0*0 #2(!(P'(!+P$O "](  AA /XN
M4(\@;P  T< 0$%< 9@X0.0   4U3 !/    !32!N  @0*  $2@!O1&$  MAR
M!TZY     "! T?P    V< $O "\ +T@ "&$ _>10CR!O  #1P! 05P!F%"!N
M  @0*  $2(!(P"\ 80 %+EB/<"@O ' 2+P!.N0  !-90CTAY    8$ZY   %
M;%B/<"@O ' 3+P!.N0  !-90CTAY    8$ZY   %;%B/<"@O ' 3+P!.N0  
M!-90CTAY    8$ZY   %;%B/<"@O ' 4+P!.N0  !-90CTAY    8$ZY   %
M;%B/<"@O ' 5+P!.N0  !-90CTAY    8$ZY   %;%B/<"@O ' 6+P!.N0  
M!-90CTAY    8$ZY   %;%B/0J=.N0    !8CTY>3G5.5O_Z("X "'(+3KD 
M    ($#1_      2*  (5P%G  &P($#1_      0*  &2@!O  &>80 !GG('
M3KD     ($#1_    #8@+@ (<@M.N0     B0-/\     !(I  9(@4C!(D#3
M_      0*0 #2(!(P"\ +P$O2  (80#\@%"/(&\  -' $! =0/__("X "'(+
M3KD     ($#1_      2$ P! $EF= PN  +__V9L($#1_      2*  !4P$1
M00 !($#1_      2*  !2@%F#B! T?P     $7P  P (("X "'(+3KD     
M($#1_      2*  )2(%(P2! T?P     $"@ "DB 2, O "\!3KD   &24(].
M7DYU("X "'(+3KD     ($#1_      0*  (2(!(P R      F<D#(     !
M9CX@+@ (<@M.N0     @0-'\     !%N__\ "& B#"X  ?__9QH@+@ (<@M.
MN0     @0-'\     !%\  , "" N  AR"TZY     "! T?P     $B@ "%,!
M9RP@0-'\     !(H  E(@4C!($#1_      0*  *2(!(P"\ +P%.N0   9)0
MCTY>3G5.5O_\0J[__$JN__QF%$ZY   !M'(&3KD     +4'__&#F("[__$Y>
M3G5.5O_X0J[__" N__RPN0   51L  &D<@M.N0     @0-'\     !(H  D4
M.0   5&R F8  7P@0-'\     ! H  H2.0   5*P 68  60@+O_\<@M.N0  
M   @0-'\     ! H  A7 &<  48@+O_\3KD     ($#1_      0$$B 2, ,
M@    $EF3A Y   !34H ;P !&B N__QR"TZY     "! T?P     $B@  5,!
M$4$  2! T?P     $B@  4H!9@  ZB! T?P     $7P  P (8   V" N__QR
M"TZY     "! T?P     $B@ !$H!9Q @0-'\     ! H  A5 &9$("[__'(+
M3KD     ($#1_      1?  #  @@0-'\     ! 0#   5&8$< )@ G !+P!A
M  $P6(]"ITZY     %B/8&8@+O_\<@M.N0     @0-'\     "](  !A /YR
M#(     #;P1P V "< (@;P  $4  "" N__QR"TZY     "! T?P     $! ,
M  !49@1P F "< $O &$  ,A8CT*G3KD     6(]2KO_\8 #^4DY>3G5.5@  
M("X "'(+3KD     ($#1_      2*  )%#D   %1L@)F  "$($#1_      0
M*  *$CD   %2L %F;" N  AR"TZY     "! T?P     $! ,  !)9U @+@ (
M3KD     ($#1_      0$ P  %1F"G "+P!A-%B/8 AP 2\ 82I8CR N  AR
M"TZY     "! T?P     $7P  P (0J=.N0    !8CTY>3G5.5@  $#D   %.
M2(!(P)"N  @3P    4YR !/!   !3TH ;P@3_  !   !3Q Y   !4TB 2,!R
M TZY     !(Y   !3DB!2,&R@&\($_P  @   4\0.0   5-(@$C XX!R TZY
M     !(Y   !3DB!2,&R@&\($_P  P   4].7DYU   #[     X    "   "
MX    L(   *D   "A@   F@   )*   "[@   M    *R   "E    G8   )8
M    D    ((    "    !0  !,P   06    #@    @   -&   "Z    LH 
M  *L   "C@   G    )2   "#    ;8   %@   !"@   +8   "*    ;@  
M  $    4    F     0    8   '8   !JH   9"   "^    #H    =   %
M#@  !U(   <D   '"@  !N@   ;0   &C   !EH   8D   &%@  !?H   7J
M   %S   !;H   6H   %>@  !5X   4Z   %(@  !+H   2J   $F@  !(  
M  1<   $,   ! 0   /T   #V@   \H   .X   #H    VH   -:   #*   
M Q8   ?D   'U   !\    >Z   'J@  !Y@   >2   'A@  !WX   =P   &
M\@  !MH   6.   %1   !2P   'L   !Y    98   &.   !0    3@   #J
M    X@    $    \   $Y@    0   !    'S@  !Z0   3N    %    !H 
M  !#   '2@  !QP   <"   &R   !H0   92   &#@  !>(   6@   %<@  
M!58   4:   $D@  !'@   14   $*    ^P   .8   #4@   SX   ,.   "
M!    :X   %8   ! @   *X        #\@   ^H    ?,"\Q #$O,@ Q+S$ 
M,B\Q #,O,0 T+S$ *P          !     @    ,    $    !0    8 0$!
M 0(" P$! 0(" P,! 0(" P,# 0$" P,# P$" P,# P,! P,# P,#(" @(" @
M(" @("  4F5S;VQV:6YG+BXN         ^P    '    "    #(    N    
M*@   "8    B    '@   !H        #\@   ^D   %_3E;_^AU\  '__W *
M+P!(>0    !A  -44(].N0   7!*+O__9P  XD(N__]"KO_Z("[_^K"Y   !
M5&SD$#D   %/2@!F!DZY    :" N__IR"TZY     "! T?P     $B@ "%,!
M9@  F"! T?P     2B@ !F8  (@@+O_Z<@M.N0     @0-'\     ! H  %*
M &]J("[_^DZY     "! T?P     (D#3_      0*  %$BD  K !;D0O+O_Z
M2'D     3KD   ;D4(\O+O_Z8498CPR     <&8('7P  ?__8!H@+O_Z<@M.
MN0     @0-'\     !%\  $ !E*N__I@ /\J2'D     3KD   !X6(].7DYU
M3E;__B\N  A.N0  !*Q8CT(N__Y.N0  !:8=0/__2(!(P'(X!($    (:P "
M$+"[& AF\$[[& 8   !R8  !W    '1@  %H    86   1(   !S8   O   
M &)@  !F    ;6   !    !P8    G!P3EY.=1 Y   !2DH ;SH@+@ (<@M.
MN0     @0-'\     ! Y     !(H  '0 1/      ! N__](@$C +P!A  '"
M6(]@  &*'7P  ?_^8  !@! Y   !2TH ;SH@+@ (<@M.N0     @0-'\    
M ! Y     1(H  '0 1/      1 N__](@$C +P!A  %T6(]@  $\'7P  ?_^
M8  !,A Y   !3$H ;SH@+@ (<@M.N0     @0-'\     ! Y     A(H  '0
M 1/      A N__](@$C +P!A  $F6(]@  #N'7P  ?_^8   Y! Y   !34H 
M;SH@+@ (<@M.N0     @0-'\     ! Y     Q(H  '0 1/      Q N__](
M@$C +P!A  #86(]@  "@'7P  ?_^8   EA Y   !3DH ;S@@+@ (<@M.N0  
M   @0-'\     ! Y    !!(H  '0 1/     !! N__](@$C +P!A  "*6(]@
M!AU\  '__DHN__YF1DAY     $ZY    >%B/< HO $AY     &$Z4(]@*$AY
M     $ZY    >%B/< HO $AY     &$<4(]P<$Y>3G4=?  !__Y*+O_^9@#]
MR'  3EY.=4Y6__Q"KO_\("[__+"N  QL#B!N  C1P$(04J[__&#H3EY.=4Y6
M_ZP0+@ +2(!(P'(H!($    (:P "5+"[& AF\$[[& 8   !T8  !Z    &%@
M  %V    ;6   0(   !S8   @@   &)@   "<"@O ' 2+P!.N0  !-90CTAY
M    !4ZY   %;%B/<"@O ' 2+P!.N0  !-90CQ Y     4B 2,!R!"\!+P O
M0  (3KD   !84(\O '($+P$O+P (2'D    /2&[_L$ZY     $_O !1(;O^P
M3KD   5L6(]@  &J<"@O ' 3+P!.N0  !-90CTAY    !4ZY   %;%B/<"@O
M ' 3+P!.N0  !-90CQ Y     DB 2,!R R\!+P O0  (3KD   !84(\O '(#
M+P$O+P (2'D    :2&[_L$ZY     $_O !1(;O^P3KD   5L6(]@  $R<"@O
M ' 4+P!.N0  !-90CTAY    !4ZY   %;%B/<"@O ' 4+P!.N0  !-90CQ Y
M     $B 2,!R R\!+P!.N0   %A0CR\ 2'D    E2&[_L$ZY     $_O  Q(
M;O^P3KD   5L6(]@  #&<"@O ' 5+P!.N0  !-90CTAY    !4ZY   %;%B/
M<"@O ' 5+P!.N0  !-90CQ Y     TB 2,!R 2\!+P!.N0   %A0CR\ 2'D 
M   H2&[_L$ZY     $_O  Q(;O^P3KD   5L6(]@6G H+P!P%B\ 3KD   36
M4(](>0    5.N0  !6Q8CW H+P!P%B\ 3KD   364(\0.0    1(@$C +P!(
M>0   "M(;O^P3KD     3^\ #$AN_[!.N0  !6Q8CTY>3G4   /L    %0  
M  (   7R   %M@  !98   5,   %*@  !.    2^   $:   !$8   /P   %
MQ@  !:@   5<   %/@  !/    32   $>   !%H   0    #X@   3     "
M    !0   20   #(    !P    <   5T   %"   !)0   0<   #/    QX 
M  $0    "P    H   7:   %L   !7X   5&   %$@  !-H   2F   $8@  
M!"X   /J    P@   !4    +   %S@  !60   3X   $@   ! @   -(   #
M-@   RH   ,8   "]    N@   *F   "F@   E@   ),   ""@   ?X   &\
M   !L    0H    0     0   !8    <     0   !L   !(    $@   !T 
M  +B   "E    D8   'X   !J@   /8   "L    I    (H   !N    7   
M LH   )\   "+@   >    &2    /@   #8    %    +P  !>0   6(   %
M'   !+    0X    "0   $,   +:   "C    CX   'P   !H@   .X   "<
M    @@   %0        #\@   ^H    /1FER90 @(" @(" @(" @)60@)60@
M*"5S*0 E9" E9" H)7,I "5S "5S #$O,2 H)60I(" @("         #\@  
M ^L    #   #\@   ^D   "\3E;__$*N__P@+O_\L+D   %4;'AR"TZY    
M "! T?P     $B@ "%,!9E@@0-'\     ! H  =* &\2+R[__$AY     $ZY
M   &Y%"/("[__'(+3KD     ($#1_      2*  '2@%O&B! T?P     $"@ 
M"%, 9@HO+O_\81!8CV#*4J[__&  _WY.7DYU3E;_^!U\  '__THN__]G  )*
M("X "'(+3KD     ($#1_      2*  )($#1_      0*  *'4'__4B!2,$=
M0/_\2(!(P"\ +P%.N0  !&!0CT(N__Y.N0  !:8=0/_[2(!(P') !($    (
M:P  EK"[& AF\$[[& 8    @8   9@   '-@  !>    >F   %    !W8   
M0@   &%@   P    >&   "(   !E8   %    &1@   "4R[__5,N__Q@1E,N
M__U@0%,N__Q@.E(N__U2+O_\8#!2+O_\8"I2+O_]8"0@+@ (<@M.N0     @
M0-'\     $(H  =P $Y>3G4=?  !__X0+O_]2(!(P!(N__Q(@4C!+P$O $ZY
M    E%"/2H!F8A N__U(@$C $B[__$B!2,$O 2\ 3KD   FD4(]*@&<<("X 
M"'(+3KD     ($#1_      0*  '4P!G)A N__U(@$C $B[__$B!2,$O 2\ 
M3KD   9,4(]*@&8&2B[__F<(0B[__F  _G@@+@ (<@M.N0     @0-'\    
M !(H  D@0-'\     !0H  H@0-'\     !%N__T "2! T?P     $6[__  *
M'4'_^DB!2,$=0O_Y2()(PB\"+P%.N0   9)0CT(N__\@+@ (<@M.N0     @
M0-'\     ! H  =3 !%   <O+@ (3KD   :\6(\@+@ (<@M.N0     @0-'\
M     !(H  E(@4C!($#1_      0*  *2(!(P"\ +P%.N0   9)0CV  _;).
M7DYU      /L     0    (   #H    !@    4   +@   ">@   @P   &P
M    W    $@    !    !P   J@    !    #0   $(    !    $0   =  
M   0    '0   LX   *^   "E    EH   ),   "0    C0   'J   !A@  
M +X   "R    ;@   %X    P    (     X    (    0P   K8   *,   "
M+    >(   %^    J@   %8    8         _(   /J     DUO=F4     
M   #\@   ^D   "83E;_^$*G2'D   !,3KD     4(\CP     A*@&8&</].
M7DYU+SD    (3KD     6(\CP     !*@&8&</].7DYU0J=(>0   %=.N0  
M  !0CR/     #$J 9@9P_DY>3G4O.0    Q.N0    !8CR/     !$J 9@9P
M_DY>3G4C^0         H2'D    *3KD   !T6(\CP    !!*@&8&</].7DYU
M+SD    0+SD    $+SD     3KD   D$3^\ #"U __A*@&<*80  HG#]3EY.
M=4AY    >"\Y    !$ZY   )Y%"/</XO $AY    .DZY    U%"/2H!F*DAY
M    82\Y     $ZY   )L%"/+SP   #Z3KD   $ 6(]A3'#\3EY.=4AY    
MF4AY    .DZY     %"/+4#__$J 9@9P_$Y>3G4O+O_\80  ;%B/81@O+O_\
M+4#_^$ZY   #CEB/("[_^$Y>3G5.5O_\+SD    (3KD   "H6(\O.0    !.
MN0   $98CR\Y    #$ZY    J%B/+SD    $3KD   !&6(\O.0   !!.N0  
M #!8CTY>3G5.5O_X<  M0/_X+4#__"\N  AP9"\ 2'D    43KD   "03^\ 
M#"U __Q*@&=.2'D    4+SD     3KD   FP4(\@+O_X4H M0/_X#(     5
M9KI(>0   '@O.0    0O.0    Q.N0  "AA/[P ,$\    !X0J[_^&"22'D 
M  !X+SD    $+SD    ,3KD   H83^\ #!/     >$Y>3G4   /L    !@  
M  (   ).   ")@   ?H   $.    Y    +P    !    !    ((    (    
M#P   3(   $L   ! @   /    ",    A@   $8    (    '0   !    )8
M   "2    D(   (\   ",    B    (:   "%    ?0   'N   !U@   :X 
M  &@   !D@   80   %V   !"    -X   #8    M@   +    "J    F@  
M '(   !D    5    #0    F    %@    $    B   !W     $    D   !
M.     $    G   !8@    (   !*   !'    /8    $    30   9@   %\
M    3     X    $    3@   :8   &*    :@   "P    "    3P   ;0 
M  "2         _(   /J    )T]G<F4@2&5L<        H  R ,!        
M$                             !D "T"@ #(  ]/9W)E.DEN<W1R=6-T
M:6]N<P!C;VXR+G=R:71E &-O;C(N<F5A9  *0V%N)W0@;W!E;B!/9W)E.DEN
M<W1R=6-T:6]N<RX@0VAE8VL@>6]U<B!V;VQU;64@;F%M92X* '(      ^P 
M   !    #P   "0        #\@   ^L    ?   #\@   ^D   ,83E;_J' *
M$\      $\     !("X " R     !6<:#(     #9B)P$"/     "G 2(\  
M   &8!!P%B/     "G ;(\     &<  CP    50CP     )*N0    IN$$JY
M    !FX(2KD    "9F1*N0    )G"$'Y    )V &0?D    I+P@O.0    8O
M.0    I(>0    !(;O^P3KD     3^\ %$*G<! O $ZY   $UE"/<! O $ZY
M   $EEB/2&[_L$ZY   %;%B/80 !(&"$2'H)]G ++P O.0   51(>0    !A
M"$_O !!.7DYU3E;_X$CG " @+@ ,<@).N0     M0/_\2J[__&\  -@M;O_\
M__@@+O_XL*X #&P  +*0KO_\+4#_]$JN__1K  ":("[_]'(+3KD     (&X 
M"-' ("[_]-"N__Q.N0     B;@ (T\ O"2\()&X %$Z24(]*@&]B("[_]'(+
M3KD     (&X "-' +T@ !$/N_^EP"A+84<C__" N__30KO_\3KD     (&X 
M"-' +T@ "")O  1P"A+84<C__$'N_^DB;P (< H2V%'(__P@+O_\D:[_]&  
M_V)2KO_X8 #_1B N__QR DZY     "U __Q@ /\D3-\$ $Y>3G5.5O_Z'7P 
M ?__0B[__A Y     $B 2, 2.0    %(@4C!+P$O $ZY   $8%"/2B[__V< 
M!!8=>0    #__1UY     ?_\3KD   6F'4#_^TB 2, B/    ( $@0    AK
M  -\L+L8"&;P3OL8!@   $A@  +:    26   D0    S8  !C@   #)@  &&
M    ,6   7X   !'8   Y@   $U@  #>    5&   -8   !#8   @@   '-@
M  ,H    >F   &@   !W8   5@   &%@   ^    >&   "P   !E8   &@  
M &1@   "4SD     4SD    !8  "Z%,Y     &   MY3.0    %@  +44CD 
M    4CD    !8  "Q%(Y     6   KI2.0    !@  *P2KD    "9PH=?  !
M__Y@  *>$#D     2(!(P!(Y     4B!2,$4+O_[2()(PB\"+P$O &$  N)/
M[P ,0B[__W !(\     "8  "9! Y     $B 2, 2.0    %(@4C!+P$O &$ 
M!AI0CTJ 9BP0.0    !(@$C $CD    !2(%(P2\!+P!.N0  !DQ0CTJ 9@A*
MN0    IF"AU\  '__F   @P0.0    !(@$C $CD    !2(%(P10N__M(@DC"
M+P(O 2\ 80 "4$_O  Q"+O__4[D    *8  !U! Y     $B 2, 2.0    %(
M@4C!+P$O &$ !8I0CTJ 9CP0.0    !(@$C $CD    !2(%(P2\!+P!.N0  
M!DQ0CTJ 9A@0+O_[2(!(P 2     ,"(Y    !K* ; H=?  !__Y@  %L$#D 
M    2(!(P!(Y     4B!2,$4+O_[2()(PB\"+P$O &$  ;!/[P ,0B[__Q N
M__M(@$C !(     PD;D    &8  !)A Y     $B 2, 2.0    %(@4C!+P$O
M &$ !-Q0CTJ 9C 0.0    !(@$C $CD    !2(%(P2\!+P!.N0  !DQ0CTJ 
M9@P,N0    ,    &; H=?  !__Y@  #*$#D     2(!(P!(Y     4B!2,%T
M,R\"+P$O &$  11/[P ,0B[__U>Y    !F   )@0.0    !(@$C $CD    !
M2(%(P2\!+P!A  1.4(]*@&8P$#D     2(!(P!(Y     4B!2,$O 2\ 3KD 
M  9,4(]*@&8,#+D    !    "FX('7P  ?_^8#P0.0    !(@$C $CD    !
M2(%(P10N__M(@DC"+P(O 2\ 80  @D_O  Q"+O__5;D    *8 8=?  !__X0
M.0    !(@$C $CD    !2(%(P2\!+P!.N0   .)0CTJ 9@9*+O_^9Q@3[O_]
M     !/N__P    !0B[__F  _ H0.0    !(@$C $CD    !2(%(P2\!+P!.
MN0  !&!0CV  ^^9.7DYU3E;__" Y   !5%*Y   !5!(N !-(@4C!+4#__'!(
M!(     (:P "UK*[" AF\$[[" 8    R8  "=@   #%@  (@    ,V   <8 
M  !)8  !O@   $A@  %D    1V   0P   !-8   L@   %1@  !8    0V  
M  (@+O_\<@M.N0     @0-'\     !"\ $,@0-'\     '( $4$  2! T?P 
M    $4$  B! T?P     $4$  R! T?P     $4$ !&   C8@+O_\<@M.N0  
M   @0-'\     !"\ %0@0-'\     !%\  0  2! T?P     $7P  @ "($#1
M_     !R Q%!  ,@0-'\     !%!  1@  'D("[__'(+3KD     ($#1_   
M   0O !-($#1_      1?  #  $@0-'\     !%\  0  B! T?P     <@(1
M00 #($#1_      100 $8  !DB N__QR"TZY     "! T?P     $+P 1R! 
MT?P     <@(100 !($#1_      100 "($#1_      100 #($#1_      1
M?  $  1@  %"("[__'(+3KD     ($#1_      0O !(($#1_      1?  &
M  $@0-'\     !%\  @  B! T?P     $7P  0 #($#1_     !"*  $8   
M\" N__QR"TZY     "! T?P     $+P 22! T?P     $7P  P !($#1_   
M  !R 1%!  (@0-'\     !%!  ,@0-'\     !%\  ( !&   )X@+O_\<@M.
MN0     @0-'\     !"\ $D@0-'\     '(!$4$  2! T?P     $4$  B! 
MT?P     $4$  R! T?P     $7P  @ $8$X@+O_\<@M.N0     @0-'\    
M !"\ $D@0-'\     '("$4$  2! T?P     <@$100 "($#1_      100 #
M($#1_      1?  "  0@+O_\<@M.N0     @0-'\     '( $4$ !2! T?P 
M    $4$ !B! T?P     $7P  0 (($#1_      100 '($#1_      1;@ +
M  D@0-'\     !%N  \ "B\N__Q.N0   H98CTY>3G5.5O_\0J[__" N__RP
MN0   51L5'(+3KD     ($#1_      2*  (5P%G-B! T?P     $"@ "; N
M  MF)" N__QR"TZY     "! T?P     $"@ "K N  ]F!G !3EY.=5*N__Q@
MH'  3EY.=4Y6  !.N0   ;1(@$C <@=.N0     &@0   !83P0   5%P,I !
M$\    %2("X " R     !6= #(     #9FYP+1/    !3A/    !4Q/\  , 
M  %/$_P  @   4H3_  !   !2Q/\  0   %,$_P "    4U@-G \$\    %.
M$\    %3$_P  P   4\3_  %   !2A/\  (   %+$_P !@   4P3_  *   !
M34ZY   $#$Y>3G5.5O_\(&X "! 02(!(P'(P!($    (:P !=K"[& AF\$[[
M& 8   !)8  !1@   $=@  $.    36   +(   !48   ;    $A@   N    
M0V    (@;@ ,$!!(@$C #(    !#9@A"KO_\8  !(G#_+4#__&   1@@;@ ,
M$!!(@$C #(    !(9Q(,@    $-F$G !+4#__&   /1"KO_\8   ['#_+4#_
M_&   .(@;@ ,$!!(@$C #(    !49QH,@    $AG" R     0V82< $M0/_\
M8   MD*N__Q@  "N</\M0/_\8   I"!N  P0$$B 2,!R( 2!    "&LXL+L8
M"&;R3OL8!@   $U@   B    5&   !(   !(8   "@   $-@   "< $M0/_\
M8%Q"KO_\8%9P_RU __Q@3B!N  P0$$B 2, ,@    $=G$ R     268.</\M
M0/_\8"Q"KO_\8"9P_RU __Q@'B!N  P0$$B 2, ,@    $EF!D*N__Q@!G#_
M+4#__" N__Q.7DYU   #[     0    "   "-@   ,8   "Z    K@    D 
M   %   *P@  "9H   7L   %>   !.H   0\   #K   !BX   (6     P  
M !(   "4    @    '@   !#    $P  !B    86   &"   !@    7>   %
MU   !<8   6B   %F   !8@   5J   %8   !4@   4^   %-   !18   4,
M   $^@  !-P   32   $N@  !+    2F   $=   !&H   16   $+@  !"0 
M  0,   $ @   _@   /4   #R@   [@   .>   #E    WP   -R   #:   
M T(   ,X   #)@   QP   ,2   #"    P(   +X   "[@   N0   +>   "
M+@   B8   ((   !_@   (X   "(    <    &@   !@    6    %(   !$
M    /    #(    J    #@    @   !'    '0  "KP   JT   *K   "J0 
M  J<   *E   "HX   J$   *?   "G0   IL   *9   "EP   I6   *.@  
M"C    GR   )U   "<0   F*   )?   "7    EB   )5@  "4@   DN   )
M(@  "10   D&   (^@  "-X   C2   (Q@  "+@   BL   (C@  "((   AT
M   (9@  "%H   @^   (,   ""(   @4   ("   !^H   ?>   'T@  !\0 
M  >X   'G   !XX   >    '<@  !V8   =*   '/   !RX   <@   '%   
M!O@   ;L   &X   !M(   ;&    X@  ";(   9(   &0@   -P   !,    
M 0   "\   ">     0   #P   H8     P   $    HD   !V@   0     /
M    0P  ">H   F\   )0   "/(   BD   (4@  "     >P   '7@  !PP 
M  :^   !E    7    %.   !.@        /R   #Z@    QL969T('1O('!L
M86-E.B E9"!A<FUO<BP@)60@:6YF86YT<GDE<P N "P@0U        /R   #
MZP    0   /R   #Z0   F).N0   / 3^0   4\   %0$#D   %02@!O#F$.
M3KD   4 80 '?F#H3G5.5O_8$#D   %1$CD   %2+7S__X !_^0=0/_;2(!(
MP%. '4'_VDB!2,%3@2\!+P!A  %X4(\M0/_H$"[_VTB 2,!3@!(N_]I(@4C!
M+P$O &$  5A0CRU _^P0+O_;2(!(P!(N_]I(@4C!4H$O 2\ 80 !.%"/+4#_
M\! N_]M(@$C 4H 2+O_:2(%(P5*!+P$O &$  190CRU __00+O_;2(!(P%* 
M$B[_VDB!2,$O 2\ 80  ]E"/+4#_^! N_]M(@$C $B[_VDB!2,%3@2\!+P!A
M  #64(\M0/_\0J[_W' !+4#_X" N_^ ,@     =L'N6 (B[_W.6!)#8(Y+2V
M&.1O!BUN_^#_W%*N_^!@UB N_]P,@     =D/N. 3OL( F V8 I@$F 68!I@
M(F F4R[_VU,N_]I@(%,N_]M@&E(N_]I@%%(N_]M2+O_:8 I2+O_;8 13+O_:
M$#D   %1$CD   %2$^[_VP   5$3[O_:   !4AU _]E(@$C '4'_V$B!2,$O
M 2\ 3KD   &24(].N0  ! P0.0   5!3 !/    !4$Y>3G5.5O_H$"X "TB 
M2, 2+@ /2(%(P10Y    "4B"2,(6.0    I(@TC#+P,O B\!+P!.N0  !.I/
M[P 01( 2.0   4I(@4C!%#D   %+2()(PM*"%#D   %,2()(PM*"0J[_\"U 
M__PM0?_X("[_\+"Y   !5&P  G1R"TZY     "! T?P     $"@ "%< 9P "
M4A N  M(@$C $BX #TB!2,$O0   ("[_\"]!  1R"TZY     "! T?P     
M$B@ "4B!2,$@0-'\     ! H  I(@$C +P O 2\O  PO+P ,3KD   3J3^\ 
M$"U __1*@&92("[_\'(+3KD     ($#1_      0$ P  $-F"G R+4#__&  
M =(@+O_P<@M.N0     @0-'\     ! H  %(@$C <@I.N0     M0/_\8  !
MIDJN__AO  &6#*X    %__1N3A Y   !2DH ;T0@+O_P<@M.N0     @0-'\
M     !(H  %(@4C!)"[__-*"($#1_      0*  $2(!(P'0$E(#2@E.N__@M
M0?_\8  !/@RN     __T;DX0.0   4M* &]$("[_\'(+3KD     ($#1_   
M   2*  !2(%(P20N__S2@B! T?P     $"@ !$B 2,!T!)2 TH)3KO_X+4'_
M_&   .8,K@    +_]&Y.$#D   %,2@!O1" N__!R"TZY     "! T?P     
M$B@  4B!2,$D+O_\TH(@0-'\     ! H  1(@$C = 24@-*"4Z[_^"U!__Q@
M  ".#*X    !__1N)A Y   !34H ;QP@+O_P<@M.N0     @0-'\     ! 0
M#   26<<("[_\'(+3KD     ($#1_      0$ P  $-F0" N__!R"TZY    
M "! T?P     $B@  4B!2,$D+O_\TH(@0-'\     ! H  1(@$C = 24@-*"
M4Z[_^"U!__Q2KO_P8 #]@A N  M(@$C $BX #TB!2,$O 2\ 3KD   "44(]*
M@&8@$"X "TB 2, 2+@ /2(%(P2\!+P!.N0  !DQ0CTJ 9P@M?/__@ '__" N
M__Q.7DYU3E;_]$ZY   "$$*G< $O &$  V)0CT*N__PM0/_X$#D   %-2(!(
MP"(N__RR@&P  (@@+O_X<@M.N0     @0-'\     !(H  4, 0 !;DX@0-'\
M     !(0# $ 0V<0($#1_      0$ P  $EF+B N__AR"TZY     "! T?P 
M    $"@ !E( $4  !B\N__A(>0    !A  ((4(\O+O_X< $O &$  LQ0CRU 
M__A2KO_\8 #_:"\N__AP B\ 80 "LE"/0J[__"U __@0.0   4Q(@$C (B[_
M_+* ;%@@+O_X<@M.N0     @0-'\     !(H  4, 0 ";B(@0-'\     ! H
M  96 !%   8O+O_X2'D    #80 !AE"/+R[_^' "+P!A  )*4(\M0/_X4J[_
M_&"6+R[_^' #+P!A  (R4(]"KO_\+4#_^! Y   !2TB 2, B+O_\LH!L6" N
M__AR"TZY     "! T?P     $B@ !0P!  -N(B! T?P     $"@ !E@ $4  
M!B\N__A(>0   !5A  $&4(\O+O_X< ,O &$  <I0CRU __A2KO_\8)8O+O_X
M< 4O &$  ;)0CQ(Y   !2DB!2,%"KO_\+4#_^"U!__0@+O_\L*[_]&P  *H@
M+O_X<@M.N0     @0-'\     !(H  A7 6=R($#1_      0$ P  $EG8B N
M__AR"TZY     "! T?P     $"@ !0P   5N1" N__A.N0     @0-'\    
M ! H  9< !%   80.0   4I3 !/    !2B\N__A(>0   ")A   Z4(]"ITZY
M     %B/+R[_^' %+P!A  #T4(\M0/_X4J[__&  _TY.7DYU<#PO $ZY   !
M %B/3G5.5O^P("X #'(+3KD     ($#1_      0*  (5P!F!$Y>3G4@+@ ,
M<@M.N0     @0-'\     !(H  E(@4C!($#1_      0*  *2(!(P"\ +P$O
M+@ (2'D    J2&[_L$ZY     $_O !1"IW 0+P!.N0  !-90CTAN_[!.N0  
M!6Q8CR N  QR"TZY     "! T?P     $B@ "4B!2,$@0-'\     ! H  I(
M@$C +P O 4ZY   $8%"/80#_,B\N  Q.N0   P)8CTY>3G5.5O_\("X #"(Y
M   !5%.!+4#__+"!9@1P & &("X #%* +4  #" N  PB+O_\LH!G  #,#*X 
M   !  AF9'(+3KD     ($#1_      2*  (5P%G  "&($#1_      2$ P!
M $-G$"! T?P     $! ,  !)9F0@+@ ,<@M.N0     @0-'\     ! H  5(
M@$C L*X "&Y"("X #$Y>3G4@+@ ,<@M.N0     @0-'\     !(H  A7 6<>
M($#1_      0*  %2(!(P+"N  AN"" N  Q.7DYU(#D   %44X B+@ ,LH!F
M!'  8 8@+@ ,4H M0  ,8 #_*B N  Q.7DYU   #[     (    "   (,   
M""0    '    !0  "&@   3T   $U    K@   (&   !O@   ;8    "    
M!P  "'@    >    !0   !4   @*   '<   !J0   8D   %H@    (    6
M   %%     (    !    &   !WX   !#    '0  "6    B,   "1   "40 
M  DT   )"@  ".X   C>   (S   "%8   A&   ']   !^0   ?$   '3@  
M!S(   <6   '!@  !I    9^   &$   !?X   6.   %<@  !6(   50   $
MG   !(8   1J   $3@  ! P   /V   #M    YX   -<   #1@   OX   +8
M   "G@   HX   )8   !]    >H   =F   '7@  !M8   9>   %W@  !2X 
M  0V   #W@   X8   ,N   "*    AP   (2   !S    <0   &<   !E   
M 8P   &&    -@   #     2    #     @    !    +P  "!0    8    
M0P  "2P   D"   (Q   "#X   ?<   'O   !T8   <J   &_@  !G8   7V
M   %A@  !4@   1^   $8@  !$8   /N   #E@   SX   ,.   "]@   M  
M  *&   "4     $   !*   'J         /R   #Z@   !5!4 !S96-O;F1A
M<GD@8F%T=&5R>0!M86EN(&)A='1E<GD ;6ES<VEL90!/9W)E(&9I<F5S("5S
M(&%T('5N:70@870@:&5X("5D)60@(" @("        /R   #Z0   -I.5O_T
M0J[__" N__RPN0   51L  #8<@M.N0     @0-'\     ") T_P     $6D 
M!  '($#1_      2*  (50%F.B! T?P     $7P  0 (($#1_      2*  )
M2(%(P2! T?P     $"@ "DB 2, O "\!3KD   &24(\@+O_\<@M.N0     @
M0-'\     !(Y   !44B!2,$4.0   5)(@DC"(D#3_      6*0 )2(-(PR) 
MT_P     $"D "DB 2, O "\#+P(O 2]( !1.N0  !.I/[P 0(&\ !!%   52
MKO_\8 #_'DY>3G5.5O_T0J[__" N__RPN0   51L:'(+3KD     ($#1_   
M   2.0   5%(@4C!%#D   %22()(PB) T_P     %BD "4B#2,,B0-/\    
M ! I  I(@$C +P O R\"+P$O2  43KD   3J3^\ $"!O  010  %4J[__&",
M3EY.=4Y6__1"KO_\("[__+"Y   !5&P  (AR"TZY     "! T?P     $B@ 
M"%,!9F8@0-'\     $(H  8@0-'\     !(Y   !44B!2,$4.0   5)(@DC"
M(D#3_      6*0 )2(-(PR) T_P     $"D "DB 2, O "\#+P(O 2]( !1.
MN0  !.I/[P 0(&\ !!%   52KO_\8 #_;DY>3G5.5O_T0J[__" N__RPN0  
M 51L='(+3KD     ($#1_     !"*  &($#1_      2.0   5%(@4C!%#D 
M  %22()(PB) T_P     %BD "4B#2,,B0-/\     ! I  I(@$C +P O R\"
M+P$O2  43KD   3J3^\ $"!O  010  %4J[__&" 3EY.=4Y6__Q"KO_\("[_
M_+"Y   !5&Q(<@M.N0     @0-'\     !(H  A3 68J($#1_      0$ P 
M $=F&B N__QR"TZY     "! T?P     $7P  P '4J[__&"L3EY.=4Y6_[!"
MIW 2+P!.N0  !-90CW 2+P!.N0  !)98CR N  AR"TZY     "! T?P     
M$"@ !4B 2, O "\N  A(>0    !(;O^P3KD     3^\ $$AN_[!.N0  !6Q8
MCTZY   'HDY>3G4      ^P    #     @   U8   ,4   #"     4    %
M   "@@   ?0   %6    U    '@    !    %    UX    !    %P   SX 
M   F    '0   DP   )"   !O@   ;0   $@   !%@   )X   "4   #*@  
M N@   +,   "O    F@   )8   "/    C    ':   !R@   :X   &B   !
MD@   3P   $L   !$    +H   "J    C@   &8   !6    2    #@    J
M    (@   JH   (>   !?@   /X    .     0   "\   -(    "    $, 
M  ,B   "X    K0   (H   !B@   0@   "&    &@        /R   #Z@  
M  AR86YG92!F<F]M('5N:70@)60@=&\@3V=R92 E9"X      _(   /I    
MPTY6_[!*K@ (9A 0.0    $2.0   4NP 6=T$#D   %+2(!(P$J ;SXO $AY
M     $AN_[!.N0    !/[P ,0J=P$B\ 3KD   364(]P$B\ 3KD   266(](
M;O^P3KD   5L6(]@*$*G<!(O $ZY   $UE"/<!(O $ZY   $EEB/2'D    A
M3KD   5L6(]*K@ (9A 0.0    (2.0   4RP 6=T$#D   %,2(!(P$J ;SXO
M $AY    (TAN_[!.N0    !/[P ,0J=P$R\ 3KD   364(]P$R\ 3KD   26
M6(](;O^P3KD   5L6(]@*$*G<!,O $ZY   $UE"/<!,O $ZY   $EEB/2'D 
M  !$3KD   5L6(]*K@ (9A 0.0     2.0   4JP 6=T$#D   %*2(!(P$J 
M;SXO $AY    1DAN_[!.N0    !/[P ,0J=P%"\ 3KD   364(]P%"\ 3KD 
M  266(](;O^P3KD   5L6(]@*$*G<!0O $ZY   $UE"/<!0O $ZY   $EEB/
M2'D   !G3KD   5L6(]*K@ (9A 0.0    ,2.0   4VP 6=T$#D   %-2(!(
MP$J ;SXO $AY    :4AN_[!.N0    !/[P ,0J=P%2\ 3KD   364(]P%2\ 
M3KD   266(](;O^P3KD   5L6(]@*$*G<!4O $ZY   $UE"/<!4O $ZY   $
MEEB/2'D   "*3KD   5L6(]*K@ (9A(0.0    02.0   4ZP 6<  +(0.0  
M 4Y(@$C 2H!O>B\ 2'D   ",2&[_L$ZY     $_O  Q"IW 6+P!.N0  !-90
MCW 6+P!.N0  !)98CTAN_[!.N0  !6Q8CW H+P!P%B\ 3KD   364(\0.0  
M 4](@$C +P!(>0   *U(;O^P3KD     3^\ #$AN_[!.N0  !6Q8CV H0J=P
M%B\ 3KD   364(]P%B\ 3KD   266(](>0   +I.N0  !6Q8CT'Y   !2D/Y
M     ' )$MA1R/_\3EY.=0   ^P    @     @   NX   +$   "B    B8 
M  '\   !G    7(   $2    Z    (@   !>   "X    GP   (8   !\   
M 8X   %F   !!    -P   !Z    4@   M0   *8   "<    @P   'D   !
M@@   5H   #X    T    &X   !&    "P   !D   +H   "K    E8   (@
M   !R@   98   %    !#    +8   ""    +     8    :   "_    C0 
M  &J   !(    )8    ,    #    !T   +V   "H    D8   (Z   !N@  
M ;    $P   !)@   *8   "<    '    !(    &    +P   K8   )@   !
MU    4H   #     -@        /R   #Z@   "]-86EN($)A='1E<FEE<SH@
M(" @(" E9" H-"\S($0T*0 @ %-E8V]N9&%R>2!"871T97)I97,Z("5D("@S
M+S(@1#,I "  36ES<VEL97,Z(" @(" @(" @(" @)60@*#8O-2!$,RD ( !!
M;G1I+5!E<G-O;FYE;#H@(" @(" E9" H,2\Q($0Q*0 @ %1R96%D<SH@(" @
M(" @(" @(" @("5D("@Q+RH@1#$I $UO=F5M96YT.B E9  @     _(   /K
M     P   _(   /I    EDY6__Q.N0    !.N0   )0O "U __Q.N0    !8
MCR\N__Q.N0  "A)8CW !+P!.N0    !8CTZY     $ZY   %#F$D3KD     
M3KD     819.N0   IQ.N0    !.N0    !A F#.3E;_\D*N__80.0    A7
M &82+7P    \__QP 2U __9@  %.$#D   %/2@!F  $>$#D    %#   !6P 
M 1!"KO_R("[_\K"Y   !5&P  ,AR"TZY     "! T?P     $B@ !0P!  5L
M'B! T?P     $7P  P (+R[_\DZY   "AEB/8   B" N__)R"TZY     "! 
MT?P     $B@ !5L!9FH@0-'\     ! H  A3 &9:("[_\G(+3KD     ($#1
M_      0$ P  $-G/B N__).N0     @0-'\     ! 0#   26<D("[_\DZY
M     "! T?P     $7P  @ (+R[_\DZY   "AEB/4J[_\F  _RX0.0   5%(
M@$C $CD   %22(%(P70J+P(O 2\ 3KD   $T3^\ #"U\     /_\< $M0/_V
M8"00.0   4]* &8:$#D    %#   !&\.+7P    S__QP 2U __9*KO_V9W8O
M+O_\3KD     6(]P$"U __(@+O_R#(     7;"!R 2\!+P!.N0  !-90CR\N
M__).N0  !)98CU*N__)@U' 0+P!.N0  !)98CW !+P!P$"\ 3KD   364(\O
M+O_\3KD   5L6(].N0  !:8=0/_[3KD   5F3EY.=0   ^P    (     @  
M E    )&   "/@   B(   (0   ",@   @0    ,    !     4   &<   !
M<    .8    &     0    D   !,     @    P   !:    1@    (    1
M    )    !@    "    %    &     ^     @   !8   !4    .     $ 
M   8    ,     ,    <   !S    :8   !\    #P   !T   '    !M@  
M 8H   &    !8    48   $L   !$    0    #6    Q    +    ":    
MC@   '(    !    )0   >0    %    0P   5@   $^   !)    /@   "\
M         _(   /J    $U1H92!/9W)E('-E;&8M9&5S=')U8W1S(&%N9"!D
M97-T<F]Y<R!T:&4@0U N($1R87<A %EO=2!W:6XA %1H92!/9W)E('=I;G,A
M      /R   #ZP   %8   /R   #Z@    $   (    #\@   ^H   !! " @
M(" @(" @("@H*"@H(" @(" @(" @(" @(" @(" @2! 0$! 0$! 0$! 0$! 0
M$(2$A(2$A(2$A(00$! 0$! 0@8&!@8&! 0$! 0$! 0$! 0$! 0$! 0$! 0$0
M$! 0$!""@H*"@H(" @(" @(" @(" @(" @(" @(" A 0$! @(" @(" @(" @
M*"@H*"@@(" @(" @(" @(" @(" @("!($! 0$! 0$! 0$! 0$! 0A(2$A(2$
MA(2$A! 0$! 0$!"!@8&!@8$! 0$! 0$! 0$! 0$! 0$! 0$! 1 0$! 0$(*"
M@H*"@@(" @(" @(" @(" @(" @(" @("$! 0$"        /R   #Z@    $ 
M       #\@   ^D    :3E;__$*N__P@+O_\#(     4;"!R&$ZY     "! 
MT?P     +PA.N0   EI8CU*N__Q@U$*N__P@+O_\L+D     ;! O $ZY   #
MCEB/4J[__&#D+RX #"\N  A.N0    !0CTY>3G4   /L     0   "0    H
M     0   "<   !(     0   #,    ^     0   #4   !>     0   #8 
M   @     0   $,    8         _(   /I    1$Y6__A"KO_\(#D    $
M4X CP     1*@&L2<  @>0     0$%*Y     & .2'D     3KD     6(\M
M0/_X#(#_____9RP,@     IF$"!N  C1[O_\4J[__$(08!0@;@ (T>[__%*N
M__P@+O_X$(!@EDJN__QF!G  3EY.=2!N  C1[O_\0A @+@ (3EY.=4Y6__A"
MKO_\("X #%. (B[__+* ;$P@;@ 0("@ !%. (4  !$J :PHB4%*0<  0$6 ,
M+RX $$ZY     %B/+4#_^%* 9QP@;@ (T>[__%*N__P@+O_X$( ,@     IF
MJ$YQ("[__"!N  C1P$(02H!F!G  3EY.=2 N  A.7DYU   #[     (    I
M    R    #0    %    -@   "X    F    '@   !(    *         _( 
M  /J     0        /R   #Z0   +).5O_X+7P     __P@;O_\L?P   '@
M9!(0*  02@!G"@:N    &/_\8.(@;O_\L?P   '@9@9P $Y>3G4O+O_\+RX 
M#"\N  AA"$_O  Q.7DYU3E;_ZB!N !!**  09P@O"&$  ?98CRUY     /_T
M+6X #/_P<  @;O_P$"@  0R     8F<.#(    !A9A)"KO_T8 @M?   @ #_
M]%*N__ @;O_P$"@  0P  "M7P40!2(%(P7  (&X #! 0'4'_[PR     =V< 
M - ,@    ')G  ""#(    !A9@ !%" N__0 @     @O0   2B[_[V<$<@)@
M G(!("\  ("! (    $ +SP   &D+P O+@ (3KD   !<3^\ #"U __A2@&8&
M< !.7DYU< (O $*G+R[_^$ZY   #!D_O  Q*+O_O9P@@/    (!@ G "+4#_
M_&   *1*+O_O9P1P F "<  B+O_T@H O 2\N  A.N0   %Q0CRU __A2@&8&
M< !.7DYU2B[_[V<((#P   " 8 )P 2U __Q@7DHN_^]G!' "8 )P 2(N__2"
M@ "!   !  "!   " "\\   !I"\!+RX "$ZY    7$_O  PM0/_X4H!F!G  
M3EY.=4HN_^]G"" \    @& "< (M0/_\8 9P $Y>3G4@+O_X<@9.N0     @
M0-'\     $HH  %G& CN  +__R!N !#0_  6(FX $"-(  Q@""!N !!"J  ,
M("[_^"!N ! 10  1(*@ #'  (4  ""%   0@+O_\$4  $" (3EY.=4Y6   @
M;@ ($"@ $ @   %G#B\(</\O $ZY   !(%"/(&X "! H ! "   ,2@!F%DJH
M !)G$"\H !(O*  ,3KD   $*4(^1R")N  @C2  ,(T@ $D(I !!P ! I !$O
M $ZY   #CEB/3EY.=0     #[     $    C    :@    4    G   "O   
M 38   '&   !<    10    !    *0   G0    !    +0   IH    !    
M-    @@    #    -@   #     2    !@    $   !#   "          /R
M   #Z0   #Q.5O_\<  @;@ ($!!2K@ (+4#__$J 9SPB.0   "!3@2/!    
M($J!:Q0@>0   !A2N0   !@0@'( $A!@QDAY    &"\N__Q.N0   2!0CR( 
M8+ @.0   "!3@"/     ($J :Q8@>0   !A2N0   !AP"A" <@ 2$& 42'D 
M   8< HO $ZY   !(%"/(@ @ 4Y>3G5.5O_X0J[_^'  (&X "! 04JX ""U 
M__Q*@&<V(&X #"(H  A3@2%!  A*@6L,(E!2D!* <@ 2$6 2+RX #"\N__Q.
MN0   2!0CR( +4'_^&"V("[_^$Y>3G4   /L     P   "D   #:    B   
M $H    *    -@   'X   !N    :    %X   !6    0    #(    L    
M(@   !H        #\@   ^H    !         _(   /I   !@$Y6  !.N0  
M  !*K@ (:R0@+@ (L+D     ;!AR!DZY     "! T?P     $! (   '9@YP
M"2/      '  3EY.=2 N  AR!DZY     "! T?P     ( A.7DYU3E;_]$*N
M__P@+O_\L+D     ;!QR!DZY     "! T?P     $!!* &<&4J[__&#8("[_
M_+"Y     &8.<!@CP     !P_TY>3G4@+O_\<@9.N0     @0-'\     " Y
M      *   "  "(N  RS@"U   PM2/_T"   #V<$<!!@ G   (    " (&[_
M]!" ("X # *      PR      F<\#(     !9Q)*@&92(&[_]! 0    0!" 
M8%@(+@ #  ]G!' (8 )P  "     ('( (&[_]!(0@H 0@6 V""X  P /9P1P
M"& "<   @    &!R "!N__02$(* $(%@%"!N__1"$' 6(\      </].7DYU
M""X  0 .9PPO+@ (3KD   "D6(\@+@ , H    , 2H!G"BU\   #[O_X8 @M
M?    ^W_^"\N__@O+@ (3KD     4(\@;O_T(4   DJ 9B!.N0   / CP   
M !AP B/      "!N__1"$'#_3EY.=2 N__Q.7DYU3E8  " N  P"@   @   
M@    P$B+@ , H'__W__+P$O "\N  AA /Y,3^\ #$Y>3G5.5O_X2JX $&L2
M+RX "&$ _=98CRU __A*@&8.<!8CP     !P_TY>3G4O+@ 0+RX #"!N__@O
M*  "3KD    P3^\ #"U __Q2@&843KD   #P(\     8< 4CP      @+O_\
M3EY.=4Y6__A*K@ 0:Q(O+@ (80#];EB/+4#_^$J 9@YP%B/      '#_3EY.
M=2!N__@0$ @   -G$' "+P!"IR\N  AA0D_O  PO+@ 0+RX #"!N__@O*  "
M3KD   !,3^\ #"U __Q2@&843KD   #P(\     8< 4CP      @+O_\3EY.
M=4Y6__PO+@ (80#\\%B/+4#__$J 9PH,K@    ( $&,.<!8CP     !P_TY>
M3G4@+@ 0Y8 @0-'\     "\0+RX #")N__PO*0 "3KD   "(3^\ #%* 9A1.
MN0   / CP    !AP%B/      '  +P O "!N__PO*  "3KD   "(3^\ #$Y>
M3G5.5O_X+RX "&$ _&A8CRU __A*@&8&</].7DYU<  @;O_X$A M0/_\" $ 
M F<$3EY.=2!N__@O*  "3KD    <6(].N0   / CP    !A*@&<.< 4CP   
M  !P_RU __P@;O_X0A @+O_\3EY.=4Y6   O+@ (3KD   "D6(]*@&8:3KD 
M  #P(\     8< (CP     !P_TY>3G5P $Y>3G5.5@  +RX "&'"6(].7DYU
M3E8  "\N  PO+@ (3KD   "X4(]*@&8:3KD   #P(\     8< 4CP     !P
M_TY>3G5P $Y>3G4O/    ^U(>0    U.N0    !0CR/     ($YU3E;__DZY
M     $JY    (&8"8=!*.0    QG'! Y    #!U __]".0    QR !(N__\@
M 4Y>3G5P 2\ 2&[__R\Y    ($ZY    ,$_O  QP ! N__].7DYU3E;__DHY
M    #&<:$#D    ,0CD    ,'4#__P*     _TY>3G5A /]^3EY.=4Y6  !.
MN0    !*N0   "!F!&$ _TAP 2\ 2&X "R\Y    ($ZY    3$_O  QP ! N
M  M.7DYU3E8  $HY    #&<&</].7DYU("X "!/     #$Y>3G5.5O_\3KD 
M    2KD    @9@1A /[P+SP   #_+RX ""\Y    ($ZY    ,$_O  PM0/_\
M2H!J!$*N__P@;@ (T>[__$(0("X "$Y>3G5.5@  3KD     2KD    @9@1A
M /ZB+RX "$ZY     %B/+P O+@ (+SD    @3KD   !,3^\ #$Y>3G4     
M ^P    0     0  !>P   7.   %E@  !8    4\   %*   !-8   2@   $
MC@  !&    08   #V    V8   +R   ";@   <@    -    (   !&@   0@
M   #Y    VX   ,J   "^@   J(   )V   ".@   =    %F    G    #@ 
M   !    )@   +P    *    *   !6P   5:   % @  !/P   3T   $O   
M!+(   2J   $@    SX    !    ,@  !=X    #    ,P   )(   !J    
M%@    0    T    M@   'P   !2    *     0   !#    K@   '0   !*
M    (     4   !(   %R   !7H   4B   $F@    8    5    2@  !$X 
M  /*   #@@   U(   7R   %0@   MH   6<   $W    E8   1:   $$@  
M ](   -@   "[    F@   '"   $A@   :X   0&   !?@        /R   #
MZ@    3_____          $ *@     #\@   ^D   #\3E;_^"!N  @0*  0
M @  ,$H 9P9P_TY>3G4@;@ (2J@ $F8<$"@ $ @   )F$B\(80 #4%B/2H!G
M!G#_3EY.=2!N  @0*  0"    F<(< $M0/_X8"H@;@ ($"@ $ @   %G!G#_
M3EY.=2!N  @0*  0     1%  ! M:  2__AP "!N  @0*  1+R[_^"\H  PO
M $ZY   "&D_O  PM0/_\2H!J$"!N  @0*  0    (!%  !!*KO_\9A @;@ (
M$"@ $    ! 10  02J[__&\.(&X ""%N__P !""H  P@;@ ($"@ $ (  #!*
M &<&</].7DYU(&X "" H  13@"%   1*@&L*(E!2D'  $!%@"B\N  AA /[H
M6(].7DYU3E;_\BUN  C_]B!N  P0*  0 @  ,$H 9P9P_TY>3G4@;@ ,2J@ 
M$F9V$"@ $ @   )F; RN_____P (9@9P $Y>3G4O+@ ,80 "&%B/2H!G!G#_
M3EY.=2!N  P0*  0     A%  ! @*  2(4  "%. (4  "$J :Q B4%*0("X 
M"!* <@ 2$6 0+RX #"\N  AA /]L4(\B " !3EY.=2!N  P0*  0"    F=(
M#*[_____  AF!G  3EY.=2 N  @=0/__<  @;@ ,$"@ $7(!+P%(;O__+P M
M0?_R3KD   *"3^\ #'+_+4$ ""U __I@  #"(&X #! H ! (    9P9P_TY>
M3G4@;@ ,$"@ $     (10  0#*[_____  AG.DJH  AO-" H  A3@"%   A*
M@&L0(E!2D" N  @2@'( $A%@$"\N  PO+@ (80#^KE"/(@!P_RU   @B;@ ,
M(%&QZ0 ,9T)*J0 (:@@M:0 2__)@$"!N  P@*  2D*@ ""U __)P "!N  P0
M*  1+R[_\B\H  PO $ZY   "@D_O  PM0/_Z8 IP "U __HM0/_R#*[_____
M__IF$B!N  P0*  0    (!%  !!@&B N__JPKO_R9Q @;@ ,$"@ $    ! 1
M0  0(&X #" H !(A0  ((F@ #"")("X " R _____V<J(B@ "%.!(4$ "$J!
M:PPB4%*0$H!R !(18! O+@ ,+RX "&$ _=)0CR( (&X #! H ! "   P2@!G
M!G#_3EY.=0RN_______V9@9P $Y>3G4@+O_V3EY.=4Y6   @;@ (2J@ $F<0
M$"@ $ @   -F!G  3EY.=2\Y     $ZY    $%B/(&X """ (4  #$J 9@YP
M#"/      '#_3EY.=2!N  @A>0      $A H ! "  #S$4  $'  (4  ""% 
M  1.7DYU   #[     (    >   #T    Z(    !    (    \     #    
M)P   KX   (     E@    $    M   #J         /R   #Z0   %M.5O_\
M("X " :     #$*G+P!.N0    !0CRU __Q*@&8&< !.7DYU(&[__,&( D#_
M_L&(("X " :     #"%   @O+O_\2'D     80  FE"/(&[__-#\  P@"$Y>
M3G5.5O_\+RX "&&66(\M0/_\2H!G!$Y>3G4@?/____\@"$Y>3G5A+G  (\  
M   ,(\     $(\     ((\     ((\      (\     ,(\     $3G5.5O_X
M+7D     __Q*KO_\9QX@;O_\+5#_^"\H  @O"$ZY    &%"/+6[_^/_\8-Q.
M7DYU3E8  ")N  @@:0 $(FX #"-(  21R"*((&X "$JH  1G!B!H  0@B2!N
M  PB;@ ((T@ !$J19@(BB$Y>3G5.5@  (&X #$J09@PB;@ ((V@ !  $8 PB
M;@ ,(%$A:0 $  0@;@ ,2J@ !&8((FX ""*08 HB;@ ,(&D !""13EY.=0  
M   #[     ,    !    E@   )    "*     @   "L   "Z    2     0 
M   [    K@   *(   "H    G     (   !+    U@   !0        #\@  
M ^L    #   #\@   ^D   !D3E8  '  $"X "R\ 82)8CTJ 9A9P ! N  LO
M &$  #!8CTJ 9@1P & "< %.7DYU3E8  ! N  L,  !!90H,  !:8@1P 6 "
M< !.7DYU3E8  ! N  L,  !A90H,  !Z8@1P 6 "< !.7DYU3E8  ! N  L,
M   P90H,   Y8@1P 6 "< !.7DYU3E8  '  $"X "R\ 80#_:%B/2H!F%'  
M$"X "R\ 8<)8CTJ 9@1P & "< %.7DYU3E8  '  $"X "W(P!($    (:T"P
MNQ@(9O).^Q@&    "V   "H    ,8   (@    U@   :    "F   !(    )
M8   "@   "!@   "< %.7DYU< !.7DYU3E8  ! N  L,   @90H,  !_9P1P
M & "< %.7DYU3E8  '  $"X "R\ 80#_#EB/2H!G#G  $"X "P2     (& &
M<  0+@ +3EY.=4Y6  !P ! N  LO &$ _L)8CTJ 9PYP ! N  L&@    "!@
M!G  $"X "TY>3G4      _(   /I    H4Y6__P@.0    SG@$Y>3G5.5O_\
M("X ""\ +4#__&$&6(].7DYU3E;_[$JN  AN!G  3EY.=2 N  A>@'((3KD 
M    +7P    (__@@;O_X+5#__"U __!*KO_\9U8@+O_P(&[__"(H  2R@&4V
MLH!F"")N__@BD& 6(&[__" H  20KO_P(4  !.> T:[__" N__"1N0    P@
M;O_\( A.7DYU+6[__/_X(&[__"U0__Q@I" N__#G@"(Y    $-"!4X!.N0  
M   B.0   !!.N0     O "U _^Q.N0    !8CRU __1*@&<8+R[_["\ 8190
MCR\N  AA /\J6(].7DYU< !.7DYU3E;__" N  PO "\N  @M0/_\8090CTY>
M3G5.5O_D2JX #&X&</].7DYU(&X ",&( D#__L&(("X #%Z <@A.N0     M
M0/_DYX M2/_LT< @+O_DT;D    ,+7P    (__0B;O_T+5'__"U(_^A*KO_\
M9P  Z"!N__P@*  $YX#1P"U(__@@;O_\L>[_Z&,8(F[_["*((V[_Y  $(&[_
M]"")< !.7DYU(&[__+'N_^AF'B)N_^PBD" N_^30J  $(T  !"!N__0@B7  
M3EY.=2!N_^RQ[O_X9! @+O_DD;D    ,</].7DYU(&[_[+'N__AF4"!N__Q*
MD&<<(&[_Z")N__RQT6,0("[_Y)&Y    #'#_3EY.=2 N_^0@;O_\T:@ !$J0
M9Q8@;O_H(F[__+'19@H@*  $T:D !"*0< !.7DYU+6[__/_T+6[_^/_P(&[_
M_"U0__Q@ /\4(&[_]""N_^R1R")N_^PBB"-N_^0 !" (3EY.=0     #[   
M  (    !    S    +P    !    *@   -X    '    .P   A@   'J   !
M9@   6    "6    1@    8    #    0    4H   #&    0     $   !#
M    T@        /R   #Z0   %A.5O[L0>X #"U(_^P@;@ ($!!* &<  31(
M@$C 4H@M0/_X+4@ " R     )68  -H0$ P  "5F1DB 2,!2K@ ((CD    @
M4X$CP0   " M0/_X2H%K%"!Y    &%*Y    &!" 2(!(P&"B2'D    8+R[_
M^$ZY   !(%"/8(Y(;O_T2&[_[$AN_NPO+@ (3KD     3^\ $"U __!*@&< 
M_VQ"KO_\+4  "" N__RPKO_T; #_6"(Y    (%.!(\$    @2H%K'"!Y    
M&%*Y    &$/N_NS3P! 1$(!(@$C 8!Y![O[LT>[__! 02(!(P$AY    &"\ 
M3KD   $@4(]2KO_\8*(@.0   "!3@"/     ($J :QH@>0   !A2N0   !@@
M+O_X$(!(@$C 8 #^VDAY    &"\N__A.N0   2!0CV  _L1(>0   !AP_R\ 
M3KD   $@4(].7DYU   #[     0    I   !5@   4    #\    =@   !  
M   V   !3    38   $B   !'    1(   $*    ]    -    #*    P   
M +@   !L    7@   %@   !*    0@    $    Y    D         /R   #
MZ0   "].5O[H0>X $"U(_^@M;@ (_^P@;@ ,$!!* &<  (QR !(04H@M0?_X
M+4@ # R!    )69B$! ,   E9A B;@ ($H!2K@ ,4JX "&#&2&[_]$AN_^A(
M;O[H+RX #$ZY     $_O ! M0/_P2H!GI$*N__PM0  ,("[__+"N__1LDD'N
M_NC1P")N  @2D%*N  A2KO_\8. @;@ (4JX "" N__@0@&  _VP@;@ (0A @
M")"N_^PM0/_T3EY.=0   ^P    !    .0   %X        #\@   ^D    >
M3E;__'  (&X "$(0+4#__ RN     @ 0; 1.7DYU2JX #&HB#*X    # !!L
M!G  3EY.=2!N  @0O  M1*X #' !+4#__" N__P@;@ (T< B+@ 0DH!3@2\!
M+RX #"\(3KD     3^\ #"(N__S2@" !3EY.=0     #[     $    Q    
M8@        /R   #Z0   "Q.5O_L2.<@ "!N  A"$ RN     @ 0; IP $S?
M  1.7DYU< LM0/_\4Z[__" N  QR"DZY      :!    ," N__P=@0CM("X 
M#'(*3KD     +4  #$JN  QFS' +(B[__)"!)"X $+2 ;@A2@)""T:[__$*N
M__@@+O_\#(     +;!8@;@ (T>[_^%*N__P0M@CM4J[_^&#>("[_^"!N  C1
MP$(03-\ !$Y>3G4      ^P    "    /P   $X    T         _(   /I
M    "4Y6__Q"KO_\(&X "-'N__P0$$H 9P92KO_\8.P@+O_\3EY.=0   _( 
M  /J     0   !0   /R   #ZP   !X   /R   #Z0    9.5@  +RX #"\N
M  A.N0   0Y0CTY>3G4   /L     0         .         _(   /K    
M>    _(   /I    5TY6__I"N0     ,N0   "      ;   B"!N  @0$$B 
M2,!2@") T_P     $!$(   #9P92K@ (8-X@;@ ($!!* &=:(#D     Y8!2
MN0     @0-'\    !""N  @@;@ ($!!(@$C 2H!G&%* (D#3_      0$0@ 
M  -F!E*N  A@VB!N  @0$'( $(%2K@ ('4#__TH 9@#_<$YQ0CD    1< $3
MP    ! 3P    "EP A/     *!/     01/     0" Y     "(Y     +&!
M" $ #V<$<!!@ G  +4#_^DZY    :"/      B N__H @    ,03P     !.
MN0   '@CP     @@+O_Z (    "D$\     &3KD   !X(\     .("[_^@" 
M    I!/     #$AY    !"\Y     $ZY     %"/0J=.N0    !8CTY>3G4 
M     ^P    !    &P   48    "    'P   '(    H     0   "$   %0
M     0   ",   #.     0   "8   #(    !@   #0   $T   !)    1@ 
M  $(    _    .P    &    -@   ,(   "\    M@   *X   "H    H   
M  <    X   !0    3H   !6    3@   $8    0    !@    ,   !*   !
M'@   0(   #F         _(   /K    (0   _(   /I   "'DY6_[1(YP @
M<  M0/_H<O\M0?_D<B M0?_@(&X "!(0+4#_\"U _]PM0/_L# $ +68*< %2
MK@ (+4#_\'  (&X "! 0+T  !%* ($#1_      0$ @   )G8@RO    ,  $
M9@9P,"U _^!P "!N  @0$%*N  @"@     \M0/_<<  @;@ ($!!2@") T_P 
M    $!$(   "9R(@+O_<<@I.N0    !R !(04JX " *!    #]"!+4#_W&#$
M(&X "! 0#   +F9$4JX "$*N_^1P "!N  @0$%* (D#3_      0$0@   )G
M(B N_^1R"DZY     '( $A!2K@ ( H$    /T($M0/_D8,0@;@ ($! ,  !L
M9@IP 5*N  @M0/_L0J[_T'  (&X "! 0<D@$@0    AK  *&L+L8"&;P3OL8
M!@   &9@  )L    96   EX   !G8  "3@   &-@  (H    <V   =(   !O
M8  !6    'A@  #<    =6   #@   !D8    DJN_^QG#B)N ! @45B1+5#_
MS& ,(FX $"!16)$M4/_,2J[_S&HH< $M0/_H8"!*KO_L9PXB;@ 0(%%8D2U0
M_\Q@#")N ! @45B1+5#_S' ++4#__" N_\QR"DZY     "U!__A*@6H$1*[_
M^%.N__P@+O_X!H     P(B[__!V &+@@+O_,<@I.N0     M0/_,2J[_S&:\
M#*X    !_^AF#E.N__P@+O_\';P +0BX0>[_N" N__S1P'(+DH M0?_T+4C_
MT&   71*KO_L9PXB;@ 0(%%8D2U0_\Q@#")N ! @45B1+5#_S' (+4#__%.N
M__P@+O_, H     /($#1_      @+O_\'9 (N" N_\SH@ * #____RU _\Q*
MKO_,9LQ![O^X("[__-' <@B2@"U!__0M2/_08  ! $JN_^QG#B)N ! @45B1
M+5#_S& ,(FX $"!16)$M4/_,< LM0/_\4Z[__" N_\P"@     <&@    # B
M+O_\'8 8N" N_\SF@ * '____RU _\Q*KO_,9LY![O^X("[__-' <@N2@"U!
M__0M2/_08   C@RN_______D9@@M?    ,C_Y")N ! @45B1(E M2?_0LOP 
M &8(+7P    0_]!"KO_T("[_]+"N_^1L4"!N_]#1P! 02@!G1%*N__1@Y$'N
M_[AP 2U __0D;@ 0(E)8DB 1'4#_N"U(_]!@(' "+4#_U& 80J[_U& 2< $M
M0/_48 IP $S?! !.7DYU2J[_T&<  -)*KO_<9PH@+O_<L*[_]&P&+6[_]/_<
M("[_])&N_]Q"KO_\2J[_\&=(("[_]%. +4#_]$J :Q@@;@ ,T>[__%*N__PB
M;O_0$)%2KO_08-H@+O_<4X M0/_<2H!K7"!N  S1[O_\4J[__" N_^ 0@&#>
M("[_W%. +4#_W$J :Q0@;@ ,T>[__%*N__P@+O_@$(!@WB N__13@"U __1*
M@&L8(&X #-'N__Q2KO_\(F[_T!"14J[_T&#:(&X %""N__P@;@ (4H@@"$S?
M! !.7DYU#*[______^1F!G &+4#_Y RN    %/_D;01P$V $("[_Y"U __12
M@ RN     ?_45\%$ 4B!2,%(;O^X2&[_Z$AN_]@O 2\ (&X $"\03KD     
M3^\ &"!N !!0D$'N_[@B+O_8+4#_]"U!__PM2/_02H%J!$2N__P,K@    +_
MU&8:2J[_]&<.#*X    &__QM!'  8 )P 2U _]1*KO_T9P13KO_8<  M0/_\
M2J[_Z&<$4J[__$JN_]1G*B N_^12@"(N__S0@2U __Q*KO_8:P@@+O_8T:[_
M_$JN_^1G0%*N__Q@.B N_^1<@-&N__Q*KO_8:@@@+O_81(!@!" N_]@M0/_X
M#(    !C;P12KO_\#*X   /G__AO!%*N__Q*KO_P9C0@+O_<L*[__&\J("[_
M_)&N_]P@+O_<4X M0/_<2H!K%"!N  Q2K@ ,("[_X!" 4J[__&#>2J[_Z&<,
M(&X #!"\ "U2K@ ,2J[_U&<  09*KO_8:G @;@ ,$+P ,%*($+P +E*(+4@ 
M#" N_^13@"U _^1*@&L  >0@+O_84H M0/_82H!J#B!N  P0O  P4JX #&#4
M("[_]%. +4#_]$J :Q0@;O_0(FX #!*04J[_T%*N  Q@LB!N  P0O  P4JX 
M#&"D("[_V%.N_]A*@&LP("[_]%. +4#_]$J :Q0@;O_0(FX #!*04J[_T%*N
M  Q@TB!N  P0O  P4JX #&#$2J[_Y&<,(&X #!"\ "Y2K@ ,("[_Y%. +4#_
MY$J :P !.B N__13@"U __1*@&L4(&[_T")N  P2D%*N_]!2K@ ,8,X@;@ ,
M$+P ,%*N  Q@P" N__13@"U __1*@&L4(&[_T")N  P2D%*N_]!2K@ ,8 P@
M;@ ,$+P ,%*N  P@;@ ,$+P +E*N  P@+O_D4X M0/_D2H!K," N__13@"U 
M__1*@&L4(&[_T")N  P2D%*N_]!2K@ ,8- @;@ ,$+P ,%*N  Q@PB!N  P0
MO !%4H@M2  ,2J[_V&H.$+P +5*N  Q$KO_88 P@;@ ,$+P *U*N  QP"RU 
M__13KO_T("[_V'(*3KD     !H$    P("[_]!V!"+@@+O_8<@I.N0     M
M0/_8#*X    )__1NR$JN_]AFPB N__0,@     ML$E*N__0@;@ ,$+8(N%*N
M  Q@X@RN     ?_P9C0@+O_<L*[__&\J("[__)&N_]P@+O_<4X M0/_<2H!K
M%"!N  Q2K@ ,("[_X!" 4J[__&#>(&X %""N__P@;@ (4H@@"$S?! !.7DYU
M   #[     ,    ?    W@   (X   !.     @   #H   -D   "C@    0 
M  !    '[   !](   (6   !Z     (   !#    \@   *(    !    1P  
M!/         #\@   ^H    %,#$R,S0U-C<X.4%"0T1%1@        /R   #
MZ@    0                        #\@   ^D   &83E;_R$AN_^1(;O_H
M2&[_]$*G80 #UD_O !!(;O_8+R[_Y$AN_^A(;O_T80 %-D_O !!P "\ +P!(
M;O_8< (O &$  ZA/[P 0("[_X$ZY     "U _] M0?_4)#Q \   =@!.N0  
M   M0/_(("[_W"U!_\Q.N0     M0/_0+4'_U"0N_\@F+O_,3KD     )#Q 
M\   =@!.N0     M0/_(("[_V"U!_\Q.N0     M0/_0+4'_U"0N_\@F+O_,
M3KD     )#Q \   =@!.N0    !.7DYU3E;_U$AN__!(;O_T0J=P 2\ 80 "
M_D_O !!(;O_D+R[_\$AN__0O+@ (80 $7D_O ! @+O_D(&X """ 6(@@+O_H
M((!8B" N_^P@@" N_^Q.N0     M0/_<+4'_X"0\0/   '8 3KD     +4#_
MU" N_^@M0?_83KD     +4#_W"U!_^ D+O_4)B[_V$ZY     "0\0/   '8 
M3KD     +4#_U" N_^0M0?_83KD     +4#_W"U!_^ D+O_4)B[_V$ZY    
M "0\0/   '8 3KD     3EY.=4Y6_]1(;O_D2&[_Z$AN__1"IV$  B)/[P 0
M2&[_V"\N_^1(;O_H2&[_]&$  X)/[P 0<  O "\ 2&[_V' "+P!A  'T3^\ 
M$" N_]QR$"U _]3CH("N_^ "@'____].7DYU3E;_X$AN__!(;O_T0J=P 2\ 
M80 !P$_O !!(;O_D+R[_\$AN__0O+@ (80 #($_O ! @;@ ((*[_Y%B(("[_
MZ"" 6(@@+O_L(( @+O_H<A M0/_@XZ" KO_L H!_____3EY.=4Y6_]1(;O_D
M2&[_Z$AN__1"IV$  5Q/[P 02&[_V"\N_^1(;O_H2&[_]&$  KQ/[P 0<  O
M "\ 2&[_V' "+P!A  $N3^\ $" N_]QR$"U _]3CH("N_^!.7DYU3E;_X$AN
M__!(;O_T0J=P 2\ 80 ! $_O !!(;O_D+R[_\$AN__0O+@ (80 "8$_O ! @
M;@ ((*[_Y%B(("[_Z"" 6(@@+O_L(( @+O_H<A M0/_@XZ" KO_L3EY.=4Y6
M__1P$"(N  C@H0*!  #__RU!__0@+@ ( H   /__+4#_^"U\   S#O_\<  O
M "\ +P!P!2\ 80  ?$_O !!P "\ +P!(;O_T< (O &$  &9/[P 03EY.=4Y6
M  !P "\ +P O ' %+P!A  !*3^\ $'  +P O "\N  AP!"\ 80  -$_O !!.
M7DYU3E8  "!N  C0_  ,(FX "-+\ !@O"2\(+RX "' #+P!A"$_O !!.7DYU
M3E8  $CG "!P ! N  L,@     9D  %,Y8!.^P@"8   %F   %Q@  "L8   
M@&   ,1@  $((&X #""Y    #%B((+D    06(@@N0   !0B;@ 0(KD    8
M6(DBN0   !Q8B2*Y    ("1N !0DN0   "0M2  ,+4D $&   /(@;@ 0(+D 
M   86(@@N0   !Q8B""Y    (")N !0BN0   "0M2  08   QB!N ! CT   
M !A8B"/0    '%B((]     @(FX %"/1    )"U( ! @;@ ,(]     ,6(@C
MT    !!8B"/0    %"U(  Q@?"/Y    #      C^0   !     $(_D    4
M    ""!N  PCT     Q8B"/0    $%B((]     40_D     ( E,WP0 3EY.
M=7 %(\     8(_P  -[L    '"/\  #F;0   "!P"R/     )& .2'D    H
M3KD     6(],WP0 3EY.=4Y6__!(YS  (&X #" H  @B;@ ((BD "$ZY    
M -"N !!T$"U __3DH *   #__R0N__0"@@  __\M0/_P("@ !$ZY     -"N
M__!V$"U __CFH *   #__R8N__@"@P  __\M0/_P(!!.N0    #0KO_P H  
M#___+4#__" H  @B*0 $3KD     T(-V$"U __CFH *   #__R8N__@"@P  
M__\M0/_P("@ !$ZY     "(N__S2@-*N__ "@0  __\@$2U!__PB*  (3KD 
M    (B[__-*  H$  /__ H$  /__(&X %""!(4, !"%"  A,WP ,3EY.=0  
M   #[     $    N   %5    "$    ]   %3@  !48   4^   %-   !2H 
M  48   %$@  !0H   4"   $^   !/0   3N   $Z@  !.0   3@   $U   
M!,P   3$   $M@  !*P   2D   $G   !(H   2    $>   !'    1:   $
M4   !$@   1    $-@  !"X   0F    !    #X   &>   !:    ,(   ",
M    !@   $$   &L   !=@   4    #0    F@   &0    &    0@  !C( 
M  82   %Z@  !<X   6F   %?     8   !&   !B    5(   $J    K   
M '8   !.         _(   /J    $                               
M      4  -[L  #F;0    L*7W9A;&)A;FLZ($EM<"X@17)R;W(       /R
M   #Z0   #!(YS\ 0H=@"DCG/P N/(     H @B$ !\O!(>?9P  G"@ "(0 
M'R\$@Y]F"B "(@._@&   (8O DZY     "@ *@$L B ?(@-.N0     F!C8"
MED9L'D1##$, 0&T(( 0B!20&8$Y30^*(XI%1R__Z-@9@&&<4#$, 0&T$OX)@
M-%-#XHSBE5'+__HV K6&OX9K#M*%T81D&N*0XI%20V 2FH&9@&0("$, 'T2%
M0(0@!"(%) -.N0   #9,WP#\3G4   /L     P   $4   "V    2@   #H 
M       #\@   ^D    -+P(O TJ!9R)*@&<<0H)V'^. XY*T@64(E('0O   
M  %1R__N(@)@!$*!0H F'R0?3G4      _(   /I    $4CG/  J 6<R:@)$
M@2@ 9RAJ D2 0H)V'^. XY*T@64$E(%2@%'+__(B KF%:@)$@+.$:@A$@6 $
M0H%"@$S? #Q.=0     #\@   ^D    H2.<_ "\" E=__X>?9A8O/     -.
MN0    !/[P $0H!"@6!$+P "5W__@Y]G.B\"3KD     *  J 2P"(!\B TZY
M     ,5&E$9(1DA"O4)(0BP +@%"@$*!0H-A$" !80Q.N0   #9,WP#\3G4_
M/  @<@#CB4J#9@JXAF409@2ZAV4*FH>9AF0"4X-2@>.-XY3CDU-79MQ/[P "
M3G4      ^P    !    1    !8    #    10   &0   !"    ,@      
M  /R   #Z0    Q(YW  ) !G($J!9@1"@& 8)@#&P4A"Q,%(0D)"UH)(0<#!
M2$!"0-"#3-\ #DYU      /R   #Z0   !%(YW@ * "SA$J 9S!J D2 ) !*
M@68$0H!@(FH"1($F ,;!2$+$P4A"0D+6@DA!P,%(0$) T(-*A&H"1(!,WP >
M3G4      _(   /I    !$Y6   C[@ (    '$Y>3G4   /L     0    $ 
M   (         _(   /I    -B0 P+Q_____9@AP '( = !@(DA"2,+H0L2\
M@  '_Y1\ _\O G0*XXGCD%'*__H(P  ?)!].=2\#+P"#GV=DE'P "TJ 9@@@
M 4*!E'P ("\  I__X   9R120N*(XI'BDR\  I__X   9NY*@VH.4H%D"E* 
M8-A30N.)XY (   49_34? /_;QZT? ?_;"C O  /___I2C\"0D)(0H1?2$* 
M@B8?3G4O/     %.N0    !P & 8+SP    "3KD     ,#Q_\$A"@$)(0$) 
M3^\ !'( 8,P      ^P    "    1    +X   "N         _(   /I    
M!"\"0H%T'TZY    -B0?3G4   /L     0   $4    (         _(   /I
M    Y4Y0_^).40  2.=_,"1H  @@&B(23KD     0FD "$)I  8O (.?9@XD
M:  <)B@ #%.#8   ^%)",T( !$A",T( "$)&-"D !&=<:A)60FL8"D(  ]5I
M  1A  $ 8$AA  $R4FD !F 2= 35:0 $80  ZF$  /)3:0 &2H!KQ%-I  3C
MB>.08/)"0D)&+P"#GV<480  TDI&9@P,0@ !9@93:0 &8.P&!@ P$X8@"E)"
MM'P %&O4=@$D*  ,2J@ $&<.*#P    !U&D !E-":SIX% Q" !)L,C@"&C$@
M"P8%  4,!0 Y;R(3O  P( M2,2 *&C$H"E-":NA2:0 &4T-Z +JH !!G E*$
M)&@ '$?Q, H@!&<>4T0V! 1# !1K G@3%-M1S/_\2D-K"!3\ #!1R__Z)&@ 
M&$*22FD "&<"4Y(D:  40H$R*0 &2,$D@4S?#/Y.64Y83G7BB.*1E'P  6;V
M3G5\ $CG,  D "8!XXGCD..6XXGCD..6TH/1@F0   12AN.)XY#CEDS?  Q.
M=2\"=  _/ ! XXGCD..2#$( "FT(!((    *4H%35V;H3^\  B0?3G5.4/_T
M3E$  $CG?C!P '( ,T   #-   (S0  $,T  !F$  78,!@ P9@@ :2    1@
M[@P& "UF"@!I@   !&$  5@,!@ P;3X,!@ Y;C@ :2    0S1@ */"D !IUI
M  (O  *?\    &<&4FD  F#.80#_.CPI  H"A@    _2AD*&T89@N P& "YF
M#$II  9F8E)I  9@I@P& $5G!@P& &5F4&$  /(,!@ K9PP,!@ M9@H :1  
M  1A  #<# 8 ,&TP# 8 .6XJ.BD  .'I  #AZ0  VVD  .'I   "1@ /W6D 
M  QI#_\  &W,X.D  &#R/RD ! )?( !F"B1H !1"DF   ((T*0  /RD ! )?
M$ !G D1"U6D  B\ @Y]G5#-\ #\  $J :PKCB>.04VD  &#R2FD  F<@:Q1T
M!-5I  !A /Y:80#^8E-I  )@UF$ _H12:0 "8,QT #0I   _*0 $ E^  &<$
M",( 'TZY    -B1H !@DP"2!)&@ %"2\     7  ,"D "$S?!'Y.64Y83G4L
M*  (9PHA?       "$YU2.?\X"1H !!.DCP 3-\'/S-&  A3J  ,9@@ :0@ 
M  1.=3\I  0"7P@ 9P)\_TYU      /L     @   $4   ,L    %@      
M  /R   #Z0   "A.5O_\+SP  #  0J=.N0   $10CP*    P "U __Q*@&8&
M< !.7DYU2KD     9V)P7B\ 3KD   4<6(\,K@  ( #__&8$<$1@ G!#+P!.
MN0  !1Q8CW *+P!.N0  !1Q8CT*N__P@+O_\L+D     ;! O $ZY   #CEB/
M4J[__&#D<  O "\ 3KD     4(]@"" N__Q.7DYU3EY.=0     #[     0 
M   G    =@   %P   !0    -@    $    S    ;     $    U    B@  
M  $   !)    *@    $   !+    #@        /R   #Z@    $        #
M\@   ^D   !%2.<@ DSO  8 #"QY    *$ZN_^),WT $3G4  "\.(B\ ""QY
M    *$ZN_]PL7TYU2.<P DSO  X $"QY    *$ZN_]9,WT ,3G4  $CG, ),
M[P . ! L>0   "A.KO_03-] #$YU   O#BQY    *$ZN_\HL7TYU+PXL>0  
M "A.KO_$+%].=4CG, ),[P . ! L>0   "A.KO^^3-] #$YU   O#B(O  @L
M>0   "A.KO^X+%].=4CG( ),[P &  PL>0   "A.KO^R3-] !$YU  !(YR "
M3.\ !@ ,+'D    H3J[_K$S?0 1.=0  +PXL>0   "A.KO]\+%].=2\.(B\ 
M""QY    *$ZN_SHL7TYU   #[     P    !   !"    /0   #@    Q   
M *P   "4    ?    &P   !8    /    "0    ,         _     "7T1E
M;&%Y\M0   $      E]);T5R<O+4    \     )?3&]C:_+4M@   -0    "
M7U)E;F%M9?(   "X     U]$96QE=&5&:6QE\@   *0    "7U-E96ORU+8 
M  "(     E]/=71P=73R    >     )?26YP=73RU    &@    "7U=R:71E
M\M0   !,     E]296%D\M2V    ,     )?0VQO<V7RU    !P    "7T]P
M96[RU+8              _(   /I    9B\.3.\  P (+'D    D3J[_.BQ?
M3G4  "\.(F\ "" O  PL>0   "1.KO\N+%].=2\.(F\ ""QY    )$ZN_MHL
M7TYU+PY,[P #  @L>0   "1.KO[.+%].=0  +PX@+P (+'D    D3J[^MBQ?
M3G4O#B O  @L>0   "1.KOZP+%].=2\.(F\ ""QY    )$ZN_IXL7TYU+PXB
M;P (+'D    D3J[^F"Q?3G4O#B!O  @L>0   "1.KOZ,+%].=2\.(F\ ""QY
M    )$ZN_H8L7TYU+PX@;P (+'D    D3J[^@"Q?3G4O#B)O  @@+P ,+'D 
M   D3J[^:"Q?3G4O#B)O  @L>0   "1.KOYB+%].=2\.(&\ "$SO @$ #"(O
M !0L>0   "1.KOY$+%].=0  +PXB;P (+'D    D3J[^/BQ?3G4O#B)O  @L
M>0   "1.KOXX+%].=2\.(F\ ""QY    )$ZN_C(L7TYU+PXB;P (+'D    D
M3J[^+"Q?3G4O#B)O  @L>0   "1.KOX@+%].=0   ^P    3     0   8P 
M  %X   !9    5    $\   !)@   0@   #T    W    ,@   "T    H   
M (P   !X    9    $X    X    )     H        #\     )?06)O<G1)
M3P   80    "7T-H96-K24\   %P     E]396YD24_R   !7     )?1&])
M3_+4M@   4@    #7T-L;W-E1&5V:6-E   !-     -?3W!E;D1E=FEC9?( 
M  $4    !%]#;&]S94QI8G)A<GGRU+8   $      U]/<&5N3&EB<F%R>0  
M .@    #7U=A:710;W)T\M2V    U     -?4F5P;'E-<V?RU+8   #     
M E]'971-<V?R    K     )?4F5M4&]R=    )@    "7T%D9%!O<G0   "$
M     U]&<F5E4VEG;F%L\@   '     #7T%L;&]C4VEG;F%L    7     -?
M4V5T4VEG;F%L\M0   !$     U]&:6YD5&%S:_+4M@   #     "7T9R965-
M96T    8     U]!;&QO8TUE;?+4M@             #\@   ^D    %(&\ 
M!""(6)!"J  $(4@ "$YU      /P     E].97=,:7-T              /R
M   #Z0   #Q(YS\@*"\ (!8O "<O//____].N0   %PD !P"&@9T !0&#(+_
M____6(]F!G  8   <B\\  $  4AX ").N0     D0,^*2H?/BE"/9A)T !0%
M+P).N0   '!P %B/8$(E1  *%4, "15\  0 "$(J  X510 /0J=.N0   # E
M0  02H18CV<,+PI.N0   (18CV ,2&H %$ZY     %B/( I,WP3\3G5(YR @
M)&\ #$JJ  IG"B\*3KD   "86(\5? #_  AT_R5" !1T !0J  \O DZY    
M<$AX "(O"DZY    &$_O  Q,WP0$3G4   /L    "    $L    ^    %   
M 'H   #6    5@   (P   "Z    X@    $   !,    F@        /P    
M 2Y,.?(    ,     2Y,./(    R     2Y,-_(   !@     2Y,-O(   "4
M     2Y,-?(   "(     2Y,-/(   "@     2Y,,_(   !.     2Y,,O( 
M   L     2Y,,?(   "B     2Y,,3<   "L     2Y,,38   "H     2Y,
M,34   "P     2Y,,30   "V     2Y,,3,   #      2Y,,3(   #J    
M 2Y,,3$    $     2Y,,3           U]$96QE=&50;W)T\@   *@    #
M7T-R96%T95!O<G3R              /R   #Z0   !Q(YS  )"\ #$J"9@1P
M & P+SP  0 !2'@ ,$ZY     "! QXA*@\>(4(]F!'  8! 1?  %  A"*  )
M(4( #B (3-\ #$YU+P(@;P ($7P _P (=/\A0@ 4=/\A0@ 82'@ ,"\(3KD 
M   84(\D'TYU   #[     (   !+    '    &8        #\     $N3#GR
M    ;     $N3#CR    !     $N3#?R          $N3#;R    "     $N
M3#7R    $     $N3#3R    ,     $N3#/R    +     $N3#+R    #   
M  $N3#'R    0     $N3#$R    2     $N3#$Q    1@    $N3#$P    
M3     -?1&5L971E4W1D24\   !&     U]#<F5A=&53=&1)3P          
M   #\@   ^D    \+PY,[P,   @@+P 0+'D    H3J[_UBQ?3G4  "\.(&\ 
M""QY    *$ZN_[XL7TYU+PX@;P (+'D    H3J[_N"Q?3G5(YP B3.\'   ,
M+'D    H3J[_1DS?1 !.=0  +PX@;P (+'D    H3J[_.BQ?3G4O#B!O  @L
M>0   "A.KO\T+%].=4CG "),[P<   PL>0   "A.KO\B3-]$ $YU   O#DSO
M P  ""QY    *$ZN_O@L7TYU  !(YS R(&\ &")O !PD;P @)F\ )" O "@B
M+P L)"\ ,"8O #0L>0   "A.KOZD3-],#$YU   #[     D    $    X@  
M *X   "4    ?    &@   !0    .    "0    .         _     #7T%U
M=&]297%U97-T    O     1?4V5T365N=5-T<FEP\M2V    I     1?4F5F
M<F5S:$=A9&=E='/R    B     -?3W!E;E=I;F1O=_(   !T     U]/<&5N
M4V-R965N\@   &     #7T]N1V%D9V5T\M2V    1     -?0VQO<V57:6YD
M;W<    P     U]#;&]S95-C<F5E;@   !P    #7T%D9$=A9&=E=/+4    
)          /R
 
end
@@@End of ogre.uue
-- 
 Hobie Orris				| 	
 SoftQuad Inc., Toronto, Ont.		|"There'll be no more giant leeches
 {ihnp4 | decvax | ? }!utzoo!sq!hobie	| When you find the good Lord Jesus"

hobie@sq.UUCP (02/22/87)

# Amiga Ogre Part 2: The source
# This file contains:
#	README
#	linkfile - Alink WITH file
#	ogre.h ext.h
# 	termcap.c initround.c main.c init.c help.c map.c move.c
#	attack.c resolve.c ogrecom.c ogrestat.c	
: To unbundle, sh this file
echo x - README 1>&2
cat >README <<'@@@End of README'

   This file describes the programs comprising the Ogre game, and
instructions for making it.  For instructions on how to play it, read the
file `Instructions'.

   Building the Ogre program:

      Compile the individual files, making sure that the compiler can find
      ext.h and ogre.h in the current directory.

      Link the files to form ogre by typing: 'lc:c/alink with linkfile',
      assuming your linker is on volume lc: and the modules to be linked
      are in the current directory.

      Type `ogre' to run the game, or use the icon.

      The Instructions menu will not work unless the Instructions file
      is on the volume `Ogre:'.

   The Files:

      ext.h - external variables such as the ogre and the friendly units.
      ogre.h - typedefs and defines of the global structures and constants.
      main.c - the main() routine.
      termcap.c - all console I/O routines for the Amiga.
      map.c - all the map handling routines for displaying units and craters,
               and stuff. Also contains the range calculating routine.
      attack.c - collect attack orders and display odds. Doesn't actually
               execute the attacks.
      init.c - initializes all the units and executes the initial deployment
               orders. A notable deviation from the original program is that
               I used the K&R shell sort, where the original used the Unix
               qsort(), for which I had no source.
      initround.c - does the initializations required every game turn, such
               as updating hexes, calculating ranges to the ogre and more.
      move.c - does the player's movements.
      ogrecom.c - the routines behind the ogre's "strategy". See below.
      ogrestat.c - handles the status display at the bottom of the screen.
      resolve.c  - resolve all attacks and rammings.

   The Ogre's Strategy

      Movement:   Weights are assigned to all the directions in which the
                  ogre can move. The primary consideration is the distance
                  to the CP; in the absence of other factors the Ogre will
                  take the fastest route to it. However, it will crush any
                  unit it can (best attacker first) and moves towards units
                  that are in range of its missiles and batteries.  It tries
                  to weight so that dangerous, immobile units (howitzers)
                  are attacked first.

      Fire:       The basic strategy here is to fire at the next unit in
                  range. Since the units are sorted by value, this will
                  usually resuly in reasonable choices for targets, although
                  the Ogre tends to overkill.


   Suggested improvements:
   -----------------------

   Some things you may like to add to the game are additional units.  The
following are units from the game GEV:

   Mobile Howitzer   (6/6 M1 D2)

   Ogre Mark IV
   ------------

   Main Batteries: 1    (4/3 D4)
   Missile Racks:  3    (D4)      Each contains 5 missiles and can be
                                  attacked instead of the missiles themselves
   Missiles:       15   (6/5)     Only one missile per rack can be fired per
                                  turn
   Secondary Bats: 2    (3/2 D3)
   Anti-personnel: 8    (1/1 D1)
   Treads:         60             These treads are in groups of 4 instead of
                                  3.  The initial movement is 4, and is
                                  reduced by 1 per 15 treads destroyed.

-----------------------------------------------------------------------------

   Any comments, suggestions or enhancements are welcome.

        Hobie Orris
        9 Ferrier Ave.
        Toronto, Ont.,
        M4K 3H5



@@@End of README
echo x - attack.c 1>&2
cat >attack.c <<'@@@End of attack.c'
#include "ext.h"

static OGRE allocated;

#define PASS      'p'
#define NOPASS    '\0'
#define RESOLVE   'r'
#define MISSILE   'm'
#define MAIN      'b'
#define SECONDARY 's'
#define AP        'a'
#define TREAD     't'

attack_def()
{
        char moreunits;
        int i;

        moreunits = TRUE;
        zero(&allocated, sizeof(allocated));
        init_def_attack();

        while (moreunits)
        {
                moreunits = FALSE;
                for (i = 0; i < n_units; i++)
                {
                        /*
                         * Don't bother attacking if Ogre is immobile - H.O.
                         */
                        if (ogre.movement == 0)
                           check_over();

                        if (unit[i].status == OK && !unit[i].fired &&
                                unit[i].attack > 0 &&
                                unit[i].range_to_ogre <= unit[i].range)
                        {
                                describe_action("Fire",i);
                                if (get_target(i) == PASS) moreunits = TRUE;
                                else unit[i].fired = TRUE;
                        }
                }
        }
        ogre_resolve(&allocated);
}

get_target(i)
int i;
{
        char action, invalid;

        movecur_unit(i);

        do
        {
                invalid = FALSE;
                action = Amiga_getchar();

                switch (action)
                {
                        case PASS:
                                return(PASS);

                        case MISSILE:
                                if (ogre.missiles > 0)
                                {
                                       allocated.missiles += unit[i].attack;
                                        update_odds(action);
                                }
                                else
                                        invalid = TRUE;
                                break;

                        case MAIN:
                                if (ogre.main_bats > 0)
                                {
                                       allocated.main_bats +=unit[i].attack;
                                        update_odds(action);
                                }
                                else
                                        invalid = TRUE;
                                break;

                        case SECONDARY:
                                if (ogre.sec_bats > 0)
                                {
                                       allocated.sec_bats +=unit[i].attack;
                                        update_odds(action);
                                }
                                else
                                        invalid = TRUE;
                                break;

                        case AP:
                                if (ogre.ap > 0)
                                {
                                        allocated.ap += unit[i].attack;
                                        update_odds(action);
                                }
                                else
                                        invalid = TRUE;
                                break;

                        case TREAD:
                                if (ogre.treads > 0)
                                {
                                        allocated.treads += unit[i].attack;
                                        update_odds(action);
                                }
                                else
                                        invalid = TRUE;
                                if (invalid) break;
                                ogre_resolve(&allocated);
                                zero(&allocated,sizeof(allocated));
                                break;

                        case RESOLVE:
                                ogre_resolve(&allocated);
                                zero(&allocated, sizeof(allocated));
                                return(PASS);
                                break;

                        default:
                                invalid = TRUE;
                                break;
                }
        } while (invalid);

        return(NOPASS);
}

zero(area, size)
char *area;
int size;
{
        int i;

        for (i = 0; i < size; i++) area[i] = '\0';
}

update_odds(weapon)
char weapon;
{
        char c[80];
        static char blanks[10] = {"          "};
        char *odd_str();

        switch (weapon)
        {
                case MAIN:
                       movecur(18, 40);
                       Amiga_puts(blanks);
                       movecur(18, 40);
                       sprintf(c,"%d %d (%s)",allocated.main_bats,
                          DEF_MAIN, odd_str(allocated.main_bats, DEF_MAIN));
                       Amiga_puts(c);
                       break;

                case SECONDARY:
                       movecur(19, 40);
                       Amiga_puts(blanks);
                       movecur(19,40);
                       sprintf(c,"%d %d (%s)",allocated.sec_bats,
                          DEF_SECONDARY, odd_str(allocated.sec_bats,
                          DEF_SECONDARY));
                       Amiga_puts(c);
                       break;

                case MISSILE:
                        movecur(20, 40);
                        Amiga_puts(blanks);
                        movecur(20,40);
                        sprintf(c,"%s", odd_str(allocated.missiles,
                           DEF_MISSILES));
                        Amiga_puts(c);
                        break;

                case AP:
                       movecur(21, 40);
                       Amiga_puts(blanks);
                       movecur(21,40);
                       sprintf(c,"%s",odd_str(allocated.ap,DEF_AP));
                       Amiga_puts(c);
                       break;

                case TREAD:
                        movecur(22, 40);
                        Amiga_puts(blanks);
                        movecur(22,40);
                        sprintf(c,"1/1 (%d)     ", allocated.treads);
                        Amiga_puts(c);
                        break;
        }
}
@@@End of attack.c
echo x - ext.h 1>&2
cat >ext.h <<'@@@End of ext.h'
#include "ogre.h"

#ifdef MAIN

UNIT unit[N_UNITS];
OGRE ogre;
int n_units;

#else

extern UNIT unit[N_UNITS];
extern OGRE ogre;
extern int n_units;

#endif

@@@End of ext.h
echo x - help.c 1>&2
cat >help.c <<'@@@End of help.c'
#include <exec/types.h>
#include <exec/io.h>
#include <exec/exec.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <devices/console.h>
#include <devices/keymap.h>
#include <intuition/intuition.h>
#include <lattice/stdio.h>


struct NewWindow hw =
{
            0, 0, 640, 200, 3, 1, NULL, ACTIVATE,
            0, NULL,"Ogre Help",  NULL, NULL, 100, 45,
            640, 200, CUSTOMSCREEN
};

#define FULLPAGE  21
#define NUMCHAR   100

extern struct Screen *scrn;
struct IOStdReq *HelpMsg, *MoreMsg;
struct MsgPort *HelpPort, *MorePort;
struct Window *helpwin;

char fname[] = "Ogre:Instructions";

char buf[NUMCHAR];
UBYTE response;


/* Open a window and a console for printing game instructions, and
 * open the instructions file.  Note that the game volume name MUST
 * be "Ogre" for this to work.
 */

get_help()
{
   FILE *fp, *fopen();
   int error;

   /* read, write ports for the help window */
      /* Can't open it. Complain. */


   HelpPort = CreatePort("con2.write",0);
   if (HelpPort == NULL)
      return(-1);

   HelpMsg = CreateStdIO(HelpPort);
   if (HelpMsg == NULL)
      return(-1);

   MorePort = CreatePort("con2.read",0);
   if (MorePort == NULL)
      return(-2);

   MoreMsg = CreateStdIO(MorePort);
   if (MoreMsg == NULL)
      return(-2);

   hw.Screen = scrn;

   helpwin = (struct Window *) OpenWindow(&hw);
   if (helpwin == NULL)
      return(-1);

   error = OpenConsole(HelpMsg, MoreMsg, helpwin);
   if (error != 0)
   {
      end_help();
      return(-3);
   }

   QueueRead(MoreMsg, &response);

   /* open the instructions file */
    if (Lock(fname, ACCESS_READ) == NULL)
    {
         ConPutStr(HelpMsg,
           "\nCan't open Ogre:Instructions. Check your volume name.\n");
         Delay(250);
         error = end_help();
         return(-4);
    }

   fp = fopen(fname,"r");
   if (fp == NULL)
   {
      return(-4);
   }

   put_help(fp);
   error = end_help();
   close(fp);
   return(error);
}


/* cleanup and exit
 */

int end_help()
{
   int error;

   DeletePort(HelpPort);
   DeleteStdIO(HelpMsg);
   DeletePort(MorePort);
   DeleteStdIO(MoreMsg);
   error = CloseWindow(helpwin);
   return(error);
}

/* write help file to window and read for more */


put_help(fp)
FILE *fp;
{
   int nomore = 0, numlines = 0;

   while ((nomore = fgets(&buf[0], NUMCHAR, fp)) != NULL)
   {
      ConPutStr(HelpMsg, buf);
      numlines += 1;

      /* when a full page has been written, pause for a keystroke */

      if (numlines == FULLPAGE)
      {
         response = ConGetChar(MorePort, MoreMsg, &response);
         numlines = 0;
      }
   }
   /* get one last key to clear the remaining text from the screen */

   response = ConGetChar(MorePort, MoreMsg, &response);
}

@@@End of help.c
echo x - init.c 1>&2
cat >init.c <<'@@@End of init.c'
#include "ext.h"

static char a,b;
static int cp_set;
static int infantry_points, armor_points;

init_units(mark)
{
   char s[80];
   int i,j;
   int unitcmp();

   a = b = 10;

   switch (mark)
   {
      case 3:
         armor_points = 16;
         infantry_points = 18;
         break;

      case 5:
         armor_points = 22;
         infantry_points = 27;
         break;
   }

   n_units = 0;
   cp_set = FALSE;

   while (armor_points > 0 || infantry_points > 0 || !cp_set)
   {
      sprintf(s, "left to place: %d armor, %d infantry%s", armor_points,
         infantry_points, (cp_set) ? "." : ", CP");
      movecur(16,0);
      eeol(16);
      Amiga_puts(s);
      getunit();
   }

   sort(&unit[0], n_units, sizeof(UNIT), unitcmp);

}

sort(unit, n, size, comp)
UNIT *unit;
int n, size;
int (*comp)();
{
   int gap, i, j;
   UNIT tmp;

   for (gap = n/2; gap > 0; gap /= 2)
      for (i = gap; i < n; ++i)
         for (j = i - gap; j >= 0; j -= gap)
         {
            if ((*comp)(unit[j], unit[j + gap]) <= 0)
               break;
            tmp = unit[j];
            unit[j] = unit[j + gap];
            unit[j + gap] = tmp;
         }
}

getunit()
{
   char no_new, bad_char;
   char olda, oldb;
   char dir;

   no_new = TRUE;
   bad_char = FALSE;
   movecur_hex(a, b);

   while (no_new)
   {
      olda = a;
      oldb = b;

      dir = Amiga_getchar();

      switch (dir)
      {
         case RIGHT:
            --a;
            --b;
            break;

         case UPRIGHT:
            --a;
            break;

         case DOWNRIGHT:
            --b;
            break;

         case LEFT:
            ++a;
            ++b;
            break;

         case UPLEFT:
            ++b;
            break;

         case DOWNLEFT:
            ++a;
            break;

         case SIT:
            break;

         case CP:
            if (cp_set)
               bad_char = TRUE;
            else
            {
               add_unit(a, b, dir);
               no_new = FALSE;
               cp_set = TRUE;
            }
            break;

         case HVYTANK:
         case MSLTANK:
         case GEV:
            if (occupied(a,b) || blocked(a,b) || armor_points == 0)
            {
               bad_char = TRUE;
               break;
            }
            add_unit(a,b,dir);
            no_new = FALSE;
            --armor_points;
            break;

         case '1':
         case '2':
         case '3':
          if (occupied(a,b) || blocked(a,b) || infantry_points < (dir - '0'))
            {
               bad_char = TRUE;
               break;
            }
            add_unit(a, b, dir);
            no_new = FALSE;
            infantry_points -= (dir - '0');
            break;

      case INFANTRY:
            if (occupied(a,b) || blocked(a,b) || infantry_points < 3)
            {
               bad_char = TRUE;
               break;
            }
            add_unit(a, b, '3');
            no_new = FALSE;
            infantry_points -= 3;
            break;

      case HOWITZER:
            if (occupied(a,b) || blocked(a,b) || armor_points <= 1)
            {
               bad_char = TRUE;
               break;
            }
            add_unit(a,b,dir);
            no_new = FALSE;
            armor_points -= 2;
            break;

      default:
            bad_char = TRUE;
            break;
   }
   if (off_obstructed(a,b) || bad_char)
   {
      a = olda;
      b = oldb;
      bad_char = FALSE;
   }
   else
      movecur_hex(a,b);
   }  /* while */
}

add_unit(a, b, c)
char a, b, c;
{
   int i;

   i = n_units;
   ++n_units;

   switch (c)
   {
      case CP:
         unit[i].type = CP;
         unit[i].attack = 0;
         unit[i].range = 0;
         unit[i].defend = 0;
         unit[i].movement = 0;
         break;

      case HVYTANK:
         unit[i].type = HVYTANK;
         unit[i].attack = 4;
         unit[i].range = 2;
         unit[i].defend = 3;
         unit[i].movement = 3;
         break;

      case MSLTANK:
         unit[i].type = MSLTANK;
         unit[i].attack = 3;
         unit[i].range = 4;
         unit[i].defend = 2;
         unit[i].movement = 2;
         break;

      case GEV:
         unit[i].type = GEV;
         unit[i].attack = 2;
         unit[i].range = 2;
         unit[i].defend = 2;
         unit[i].movement = 4;
         break;

      case HOWITZER:
         unit[i].type = HOWITZER;
         unit[i].attack = 6;
         unit[i].range = 8;
         unit[i].defend = 1;
         unit[i].movement = 0;
         break;

      case INFANTRY:
      case '3':
         unit[i].type = INFANTRY;
         unit[i].attack = 3;
         unit[i].range = 1;
         unit[i].defend = 1;
         unit[i].movement = 2;
         break;

      case '1':
         unit[i].type = INFANTRY;
         unit[i].attack = 1;
         unit[i].range = 1;
         unit[i].defend = 1;
         unit[i].movement = 2;
         break;

      case '2':
         unit[i].type = INFANTRY;
         unit[i].attack = 2;
         unit[i].range = 1;
         unit[i].defend = 1;
         unit[i].movement = 2;
         break;
   }

   unit[i].range_to_ogre = 0;
   unit[i].fired = 0;
   unit[i].status = OK;
   unit[i].moves_left = 0;
   unit[i].l_hex = a;
   unit[i].r_hex = b;

   disp_unit(i);
}

occupied(a,b)
char a,b;
{
   int i;

   for (i = 0; i < n_units; ++i)
      if (unit[i].status != DESTROYED && unit[i].l_hex == a &&
         unit[i].r_hex == b)  return(TRUE);
   return(FALSE);
}

init_ogre(mark)
int mark;
{
   long lrand48();

   ogre.l_hex = (char) lrand48() % 7 + 22;
   ogre.r_hex = 50 - ogre.l_hex;

   switch (mark)
   {
      case 3:
         ogre.treads = 45;
         ogre.init_treads = 45;
         ogre.movement = 3;
         ogre.missiles = 2;
         ogre.main_bats = 1;
         ogre.sec_bats = 4;
         ogre.ap = 8;
         break;

      case 5:
         ogre.treads = 60;
         ogre.init_treads = 60;
         ogre.movement = 3;
         ogre.missiles = 5;
         ogre.main_bats = 2;
         ogre.sec_bats = 6;
         ogre.ap = 10;
         break;

   }
   disp_ogre();
}

unitcmp(u1, u2)
UNIT *u1, *u2;
{
   int cmp;

   switch(u1->type)
   {
      case CP:
         switch (u2->type)
         {
            case CP:
               cmp = 0;
               break;
            default:
               cmp = -1;
               break;
         }
         break;

      case HOWITZER:
         switch(u2->type)
         {
            case CP:
               cmp = 1;
               break;
            case HOWITZER:
               cmp = 0;
               break;
            default:
               cmp = -1;
               break;
         }
         break;

      case HVYTANK:
         switch (u2->type)
         {
            case CP:
            case HOWITZER:
               cmp = 1;
               break;
            case HVYTANK:
               cmp = 0;
               break;
            default:
               cmp = -1;
               break;
         }
         break;

      case MSLTANK:
         switch(u2->type)
         {
            case CP:
            case HOWITZER:
            case HVYTANK:
               cmp = 1;
               break;
            case MSLTANK:
               cmp = 0;
               break;
            default:
               cmp = -1;
               break;
         }
         break;

      case GEV:
         switch (u2->type)
         {
            case INFANTRY:
               cmp = -1;
               break;
            case GEV:
               cmp = 0;
               break;
            default:
               cmp = -1;
               break;
         }
         break;

      case INFANTRY:
         switch (u2->type)
         {
            case INFANTRY:
               cmp = 0;
               break;
            default:
               cmp = -1;
               break;
         }
         break;
   }

   return(cmp);
}

@@@End of init.c
echo x - initround.c 1>&2
cat >initround.c <<'@@@End of initround.c'
#include "ext.h"

init_round()
{
   int i;

   for (i = 0; i < n_units; ++i)
   {
      unit[i].moves_left = unit[i].movement;
      if (unit[i].status == DISABLED)
      {
         unit[i].status = OK;
         update_hex(unit[i].l_hex, unit[i].r_hex);
      }
      unit[i].range_to_ogre =
         range(ogre.l_hex, ogre.r_hex, unit[i].l_hex, unit[i].r_hex);
   }
}

init_move_ogre()
{
   int i;

   for (i = 0; i < n_units; ++i)
   {
      unit[i].range_to_ogre =
         range(ogre.l_hex, ogre.r_hex, unit[i].l_hex, unit[i].r_hex);
   }
}

init_def_attack()
{
   int i;

   for (i = 0; i < n_units; ++i)
   {
      if (unit[i].status == OK)
      {
         unit[i].fired = FALSE;
         unit[i].range_to_ogre =
            range(ogre.l_hex, ogre.r_hex, unit[i].l_hex, unit[i].r_hex);
      }
   }
}

init_ogre_attack()
{
   int i;

   for (i = 0; i < n_units; ++i)
   {
      unit[i].fired = 0;
      unit[i].range_to_ogre =
         range(ogre.l_hex, ogre.r_hex, unit[i].l_hex, unit[i].r_hex);
   }
}

init_gev2()
{
   int i;

   for (i = 0; i < n_units; ++i)
      if (unit[i].status == OK && unit[i].type == GEV)
         unit[i].moves_left = 3;
}

display_range(i)
int i;
{
   char c[80];

   movecur(18,0);
   eeol(18);
   sprintf(c,"range from unit %d to Ogre %d.",i,unit[i].range_to_ogre);
   Amiga_puts(c);
   cycle();
}

@@@End of initround.c
echo x - main.c 1>&2
cat >main.c <<'@@@End of main.c'
/*
 *    OGRE - a tactical ground combat game set in 2086.
 *
 *    Written by Michael Caplinger of Rice University 1982
 *    based on the Steve Jackson Microgame (c) 1977.
 *
 *    Ported to Amiga from Unix by Hobie Orris, 1986
 *    (who was too lazy to type in all the comments. Sorry)
 */

#define MAIN 1
#include "ext.h"


main(argc, argv)
int argc;
char **argv;
{
   int mark;

   /* The original program set a trap here: signal(SIGINT, handler)
    * For Amiga, I've chosen to handle close window events instead
    * of breaks; see Amiga_getchar() in termcap.c - H.O.
    */

   init_screen();
   mark = get_mark();
   init_units(mark);
   init_ogre(mark);
   disp_ogre_status(TRUE);

   while (1)
   {
      init_round();

      /* the Ogre fires */

      assign_fire_ogre();
      check_over();

      /* player moves and fires */

      move_def();
      attack_def();
      check_over();

      /* 2nd GEV move */

      init_gev2();
      move_def();

      /* Ogre moves */

      move_ogre();
      check_over();
   }
}


check_over()
{
   char *message, c;
   int over,i;
   static char drawstring[] =
      "The Ogre self-destructs and destroys the CP. Draw!";
   static char youstring[] = "You win!";
   static char ogrestring[] = "The Ogre wins!";

   over = FALSE;

   if (unit[0].status == DESTROYED)
   {
      message = &ogrestring[0];
      over = TRUE;
   }

   /* if the Ogre is immobilized it is beaten */

   else if (ogre.movement == 0 && unit[0].range_to_ogre < 5)
   {
      /*
       * Optional rule 8.05 - the Ogre can self-destruct, destroying
       * everything within 4 hexes, and armor at 5 hexes is disabled.
       * So, if CP is within 4 hexes, blow up - H.O.
       */

         for (i = 0; i < n_units; ++i)
         {
            if (unit[i].range_to_ogre < 5)
            {
               unit[i].status = DESTROYED;
               disp_unit(i);
             }
             else if (unit[i].range_to_ogre == 5 && unit[i].status == OK &&
                unit[i].type != CP && unit[i].type != INFANTRY)
             {
               unit[i].status = DISABLED;
               disp_unit(i);
            }
         }
         disp_hex(ogre.l_hex, ogre.r_hex, '*');
         message = &drawstring[0];
         over = TRUE;
      }
      else if (ogre.movement == 0 && unit[0].range_to_ogre > 4)
      {
         message = &youstring[0];
         over = TRUE;
      }

   if (over)
   {
      puts(message);
      for (i = 16; i < 23; ++i)
      {
         movecur(i,1);
         eeol(i);
      }
      eeol(16);
      movecur(16,1);
      Amiga_puts(message);
      c = Amiga_getchar();
      reset_term();
   }
}

                                                               
@@@End of main.c
echo x - map.c 1>&2
cat >map.c <<'@@@End of map.c'

#include "ext.h"
#include <ctype.h>

init_screen()
{
   int a, b;
   char row, col;

   tc_setup();

   for (a = 1; a <= 28; ++a)
   {
      for (b = 1; b <= 28; ++b)
         if (!off_map(a,b))
            disp_hex(a, b, '7');
   }

   disp_craters();

   /* refresh the screen */

   refresh();
}

to_xy(lhex, rhex, row, col)
char lhex, rhex, *row, *col;
{
   *row = (lhex - rhex) + 7;
   *col = 50 - (lhex + rhex);
}

off_map(a, b)
char a, b;
{
   char row, col;

   to_xy(a, b, &row, &col);
   if (col < 0 || col > 38 || row < 0 || row > 14) return(TRUE);
   else return(FALSE);
}

off_obstructed(a, b)
char a, b;
{
   char row, col;

   to_xy(a, b, &row, &col);
   if (col < 10 || col > 38 || row < 0 || row > 14) return(TRUE);
   else return(FALSE);
}

disp_hex(a, b, c)
char a, b, c;
{
   char row, col;

   to_xy(a, b, &row, &col);
   movecur(row, col * 2 + 1);
   Amiga_putchar(c);
}

update_hex(a, b)
char a, b;
{
   int i;

   if (ogre.l_hex == a && ogre.r_hex == b)
   {
      disp_ogre();
      return;
   }

   for (i = 0; i < n_units; ++i)
      if (unit[i].l_hex == a && unit[i].r_hex == b && unit[i].status !=
         DESTROYED)
      {
         disp_unit(i);
         return;
      }

   if (blocked(a, b))
   {
      disp_hex(a, b, '*');
      return;
   }
   disp_hex(a, b, '7');
}

disp_unit(i)
int i;
{
   char a, b;

   a = unit[i].l_hex;
   b = unit[i].r_hex;
   switch(unit[i].status)
   {
      case OK:
         switch (unit[i].type)
         {
            case INFANTRY:
               disp_hex(a, b, '0' + unit[i].attack);
               break;
            default:
               disp_hex(a, b, unit[i].type);
               break;
         }
         break;

      case DISABLED:
         disp_hex(a, b, tolower(unit[i].type));
         break;

      case DESTROYED:
         disp_hex(a, b, '7');
         break;
   }
}

disp_ogre(i)
int i;
{
   /* these are Amiga console control strings for changing colour */

   static char  black_on[] =
   {
       0x9b, '1', ';', '3', '2', ';', '4', '0', 'm', '\0'
   };
   static char black_off[] =
   {
       0x9b, '0', ';', '3', '1', ';', '4', '0', 'm', '\0'
   };
   char a, b;

   a = ogre.l_hex;
   b = ogre.r_hex;

   Amiga_puts(black_on);
   disp_hex(a, b, 'O');
   Amiga_puts(black_off);
}

movecur_hex(a, b)
char a, b;
{
   char row, col;

   to_xy(a, b, &row, &col);
   movecur(row, col * 2 + 1);
}

movecur_unit(i)
int i;
{
   movecur_hex(unit[i].l_hex, unit[i].r_hex);
}

#define ABS(i) (((i) < 0) ? -(i) : (i))
#define BIGINT 32767

range(a1, b1, a2, b2)
char a1, a2, b1, b2;
{
   char diff1, diff2, temp;
   int subrange[3], min, i, rangesum;

   diff1 = a1 - b1;
   diff2 = a2 - b2;

   subrange[0] = ABS(a1 - a2);
   subrange[1] = ABS(b1 - b2);
   subrange[2] = ABS(diff1 - diff2);

   min = 0;
   for (i = 1; i < 3; ++i)
      if (subrange[i] < subrange[min]) min = i;

   rangesum = subrange[min];
   temp = subrange[min];
   subrange[min] = subrange[2];
   subrange[2] = temp;
   min = 0;
   for (i = 1; i < 2; ++i)
      if (subrange[i] < subrange[min]) min = i;

   rangesum += subrange[min];
   return(rangesum);
}

static struct
{
   char l_hex, r_hex;
}
craters[] =
{
   17, 16,
   19, 13,
   13, 18,
   14, 15,
   13, 15,
   15, 10,
   9,  15,
   10, 12,
   7,  14,
   11, 10,
   14, 7,
   12, 6,
   7, 10,
   8, 6,
   4, 9,
   9, 4,
   9, 3,
};

#define NCRATERS (sizeof(craters) / 2 * sizeof(char))

blocked(a, b)
char a, b;
{
   int i;

   for (i = 0; i < NCRATERS; ++i)
      if (craters[i].l_hex == a && craters[i].r_hex == b) return(TRUE);
   return(FALSE);
}

disp_craters()
{
   int i;

   for (i = 0; i < NCRATERS; ++i)
      disp_hex(craters[i].l_hex, craters[i].r_hex, '*');
}

describe_action(action, i)
char *action;
int i;
{
   char c[80];

   switch(unit[i].type)
   {
      case HOWITZER:
         movecur(16, 1);
         eeol(16);
         sprintf(c, "%s howitzer (%d/%d D%d M%d)", action,
            unit[i].attack, unit[i].range, unit[i].defend,
            unit[i].moves_left);
         Amiga_puts(c);
         break;

      case MSLTANK:
         movecur(16, 1);
         eeol(16);
         sprintf(c, "%s missile tank (%d/%d D%d M%d)", action,
            unit[i].attack, unit[i].range, unit[i].defend,
            unit[i].moves_left);
         Amiga_puts(c);
         break;

      case GEV:
         movecur(16, 1);
         eeol(16);
         sprintf(c, "%s GEV (%d/%d D%d M%d)", action,
            unit[i].attack, unit[i].range, unit[i].defend,
            unit[i].moves_left);
         Amiga_puts(c);
         break;

      case HVYTANK:
         movecur(16, 1);
         eeol(16);
         sprintf(c, "%s heavy tank (%d/%d D%d M%d)", action,
            unit[i].attack, unit[i].range, unit[i].defend,
            unit[i].moves_left);
         Amiga_puts(c);
         break;

      case INFANTRY:
         movecur(16, 1);
         eeol(16);
         sprintf(c, "%s infantry (%d/%d D%d M%d)", action,
            unit[i].attack, unit[i].range, unit[i].defend,
            unit[i].moves_left);
         Amiga_puts(c);
         break;

   }
}

/* routines display() and display_xy() have been removed */
@@@End of map.c
echo x - move.c 1>&2
cat >move.c <<'@@@End of move.c'
#include "ext.h"

move_def()
{
   int i;

   for (i = 0; i < n_units; ++i)
      if (unit[i].status == OK)
      {
         if (unit[i].moves_left > 0) describe_action("Move",i);
         while (unit[i].moves_left > 0 && unit[i].status == OK)
            getmove(i);
      }
}

getmove(i)
int i;
{
   char nomove, bad_char, a, b, dir, olda, oldb;

   nomove = TRUE;
   while (nomove)
   {
      a = unit[i].l_hex;
      b = unit[i].r_hex;
      movecur_hex(a, b);
      bad_char = FALSE;

      dir = Amiga_getchar();
      switch (dir)
      {
         case RIGHT:
            --a;
            --b;
            break;
         case UPRIGHT:
            --a;
            break;
         case DOWNRIGHT:
            --b;
            break;
         case LEFT:
            ++a;
            ++b;
            break;
         case UPLEFT:
            ++b;
            break;
         case DOWNLEFT:
            ++a;
            break;
         case SIT:
         case ' ':
            unit[i].moves_left = 0;
            return(0);
         default:
            bad_char = TRUE;
            break;
      }

      if (off_map(a, b) || (occupied(a, b) && unit[i].moves_left == 1) ||
         blocked(a, b) || bad_char)
      {
         bad_char = FALSE;
      }
      else
      {
         olda = unit[i].l_hex;
         oldb = unit[i].r_hex;
         unit[i].l_hex = a;
         unit[i].r_hex = b;
         update_hex(olda, oldb);
         nomove = FALSE;
         unit[i].moves_left -= 1;
         def_ram(i);
         update_hex(unit[i].l_hex, unit[i].r_hex);
      }
   }
}

@@@End of move.c
echo x - ogre.h 1>&2
cat >ogre.h <<'@@@End of ogre.h'
/*
 * ogre.h
 */

typedef struct
{
   char type;
   char attack;
   char range;
   char defend;
   char movement;
   char range_to_ogre;
   char fired;
   char moves_left;
   char status;
   char l_hex;
   char r_hex;
}  UNIT;

typedef struct
{
   char missiles;
   char main_bats;
   char sec_bats;
   char ap;
   char treads;
   char movement;
   char moves_left;
   char l_hex;
   char r_hex;
   char init_treads;
}  OGRE;

/* unit types */

#define CP        'C'
#define HVYTANK   'T'
#define MSLTANK   'M'
#define GEV       'G'
#define HOWITZER  'H'
#define INFANTRY  'I'

/* unit statuses */

#define OK        1
#define DISABLED  2
#define DESTROYED 3

/*directions */

#define RIGHT     'd'
#define UPRIGHT   'e'
#define DOWNRIGHT 'x'
#define LEFT      'a'
#define UPLEFT    'w'
#define DOWNLEFT  'z'
#define SIT       's'
#define HELPKEY   '?'

#define TRUE      1
#define FALSE     0

#define N_UNITS   30

/* ogre weapon stats */

#define DEF_MISSILES 3
#define DEF_MAIN  4
#define DEF_SECONDARY   3
#define DEF_AP    1

#define ATK_MISSILES 6
#define ATK_MAIN  4
#define ATK_SECONDARY   3
#define ATK_AP    1

#define RANGE_MISSILES 5
#define RANGE_MAIN   3
#define RANGE_SECONDARY 2
#define RANGE_AP  1

@@@End of ogre.h
echo x - ogrecom.c 1>&2
cat >ogrecom.c <<'@@@End of ogrecom.c'
#include "ext.h"

move_ogre()
{
   init_move_ogre();
   ogre.moves_left = ogre.movement;
   while (ogre.moves_left > 0)
   {
      move_ogre1();
      ogre_ram();
      cycle();
   }
}

#define INFINITY 32767

move_ogre1()
{
   int weight[7];
   int i, max;
   char a, b, olda, oldb;

   a = ogre.l_hex;
   b = ogre.r_hex;

   weight[0] = - INFINITY;
   weight[1] = getweight(a - 1, b - 1);
   weight[2] = getweight(a - 1, b);
   weight[3] = getweight(a, b + 1);
   weight[4] = getweight(a + 1, b + 1);
   weight[5] = getweight(a + 1, b);
   weight[6] = getweight(a, b - 1);
   max = 0;
   for (i = 1; i < 7; ++i)
      if (weight[i] > weight[max]) max = i;

   switch (max)
   {
      case 0:
         break;
      case 1:
         --a;
         --b;
         break;
      case 2:
         --a;
         break;
      case 3:
         ++b;
         break;
      case 4:
         ++a;
         ++b;
         break;
      case 5:
         ++a;
         break;
      case 6:
         --b;
         break;
   }
   olda = ogre.l_hex;
   oldb = ogre.r_hex;
   ogre.l_hex = a;
   ogre.r_hex = b;
   update_hex(olda, oldb);
   disp_ogre();
   ogre.moves_left -= 1;
}

getweight(a, b)
char a, b;
{
   int weight, total_attacks, to_target, i;

   weight = - range(a, b, unit[0].l_hex, unit[0].r_hex);
   total_attacks = ogre.missiles + ogre.main_bats + ogre.sec_bats;

   for (i = 0; i < n_units; ++i)
   {
      if (unit[i].status == DESTROYED) continue;
      to_target = range(a, b, unit[i].l_hex, unit[i].r_hex);
      if (to_target == 0)
      {
         if (unit[i].type == CP) weight = 50;
         else weight = 10 * unit[i].attack;
         break;
      }
      if (total_attacks <= 0) continue;
      if (to_target <= RANGE_MISSILES && ogre.missiles > 0)
      {
         weight += unit[i].attack;
         weight += 4 - unit[i].movement;
         total_attacks -= 1;
         continue;
      }

      if (to_target <= RANGE_MAIN && ogre.main_bats > 0)
      {
         weight += unit[i].attack;
         weight += 4 - unit[i].movement;
         total_attacks -= 1;
         continue;
      }

      if (to_target <= RANGE_SECONDARY && ogre.sec_bats > 0)
      {
         weight += unit[i].attack;
         weight += 4 - unit[i].movement;
         total_attacks -= 1;
         continue;
      }

      if (to_target <= RANGE_AP && ogre.ap > 0 && unit[i].type == INFANTRY ||
       unit[i].type == CP)
      {
         weight += unit[i].attack;
         weight += 4 - unit[i].movement;
         total_attacks -= 1;
         continue;
      }
   }

   if (off_map(a, b) || blocked(a, b)) weight = - INFINITY;

   return(weight);
}

#define INCR(i) i = (i == n_units - 1) ? 0 : i + 1
#define MIN(a, b) (((a) > (b)) ? (a) : (b))

assign_fire_ogre()
{
   int i, unitno, nmissiles;

   init_ogre_attack();

   unitno = nextunit(RANGE_AP, 0);
   for (i = 0; i < ogre.ap; ++i)
   {
      if (unit[unitno].range_to_ogre <= RANGE_AP &&
         (unit[unitno].type == CP || unit[unitno].type == INFANTRY))
      {
         unit[unitno].fired += ATK_AP;
         display_attack("AP", unitno);
      }
      unitno = nextunit(RANGE_AP, unitno);
   }
   unitno = nextunit(RANGE_SECONDARY, unitno);
   for (i = 0; i < ogre.sec_bats; ++i)
   {
      if (unit[unitno].range_to_ogre <= RANGE_SECONDARY)
      {
         unit[unitno].fired += ATK_SECONDARY;
         display_attack("secondary battery", unitno);
      }
      unitno = nextunit(RANGE_SECONDARY, unitno);
   }

   unitno = nextunit(RANGE_MAIN, unitno);
   for (i = 0; i < ogre.main_bats; ++i)
   {
      if (unit[unitno].range_to_ogre <= RANGE_MAIN)
      {
         unit[unitno].fired += ATK_MAIN;
         display_attack("main battery", unitno);
      }
      unitno = nextunit(RANGE_MAIN, unitno);
   }

   unitno = nextunit(RANGE_MISSILES, unitno);

   nmissiles  = ogre.missiles;
   for (i = 0; i < nmissiles; ++i)
   {
      if (unit[unitno].status != DESTROYED && unit[unitno].type != INFANTRY
         && unit[unitno].range_to_ogre <= RANGE_MISSILES)
      {
         unit[unitno].fired += ATK_MISSILES;
         ogre.missiles -= 1;
         display_attack("missile", unitno);
         disp_ogre_status(FALSE);
      }
      unitno = nextunit(RANGE_MISSILES, unitno);
   }
}

cycle()
{
   Delay(60);
}

display_attack(weapon, target)
char *weapon;
int target;
{
   char c[80];

   if (unit[target].status == DESTROYED) return;
   sprintf(c, "Ogre fires %s at unit at hex %d%d      ", weapon,
     unit[target].l_hex, unit[target].r_hex);
   movecur(16, 0);
   Amiga_puts(c);
   movecur_hex(unit[target].l_hex, unit[target].r_hex);
   cycle();
   def_resolve(target);
}

nextunit(range, unitno)
int range, unitno;
{
   int start;

   start = unitno;
   INCR(unitno);
   while (unitno != start)
   {
      if (range == 1)
      {
         if (unit[unitno].status != DESTROYED &&
            (unit[unitno].type == CP || unit[unitno].type == INFANTRY) &&
            unit[unitno].range_to_ogre <= range)
               return(unitno);
      }
      else
      {
         if (unit[unitno].status != DESTROYED && unit[unitno].range_to_ogre
            <= range)   return(unitno);
      }
      INCR(unitno);
   }
   return(unitno);
}

@@@End of ogrecom.c
echo x - ogrestat.c 1>&2
cat >ogrestat.c <<'@@@End of ogrestat.c'
#include "ext.h"

disp_ogre_status(redraw)
int redraw;
{
   static OGRE last;
   char s[80];

   if (redraw || last.main_bats != ogre.main_bats)
      if (ogre.main_bats > 0)
      {
         sprintf(s, "Main Batteries:      %d (4/3 D4)", ogre.main_bats);
         movecur(18, 0);
         eeol(18);
         Amiga_puts(s);
      }
      else
      {
         movecur(18, 0);
         eeol(18);
         Amiga_puts(" ");
      }

   if (redraw || last.sec_bats != ogre.sec_bats)
      if (ogre.sec_bats > 0)
      {
         sprintf(s, "Secondary Batteries: %d (3/2 D3)", ogre.sec_bats);
         movecur(19, 0);
         eeol(19);
         Amiga_puts(s);
      }
      else
      {
         movecur(19, 0);
         eeol(19);
         Amiga_puts(" ");
      }

   if (redraw || last.missiles != ogre.missiles)
      if (ogre.missiles > 0)
      {
         sprintf(s, "Missiles:            %d (6/5 D3)", ogre.missiles);
         movecur(20, 0);
         eeol(20);
         Amiga_puts(s);
      }
      else
      {
         movecur(20, 0);
         eeol(20);
         Amiga_puts(" ");
      }

   if (redraw || last.ap != ogre.ap)
      if (ogre.ap > 0)
      {
         sprintf(s, "Anti-Personnel:      %d (1/1 D1)", ogre.ap);
         movecur(21, 0);
         eeol(21);
         Amiga_puts(s);
      }
      else
      {
         movecur(21, 0);
         eeol(21);
         Amiga_puts(" ");
      }

   if (redraw || last.treads != ogre.treads)
      if (ogre.treads > 0)
      {
         sprintf(s, "Treads:              %d (1/* D1)",
             ogre.treads);
         movecur(22, 0);
         eeol(22);
         Amiga_puts(s);
         movecur(22, 40);
         sprintf(s, "Movement: %d",ogre.movement);
         Amiga_puts(s);
      }
      else
      {
         movecur(22, 0);
         eeol(22);
         Amiga_puts(" ");
      }

/*      if (redraw || last.movement != ogre.movement)
      {
         sprintf(s, "Movement:            %d", ogre.movement);
         movecur(23, 0);
         eeol(23);
         Amiga_puts(s);
      }
*/
      /* Lattice allows structure copying! */

      last = ogre;
}



@@@End of ogrestat.c
echo x - resolve.c 1>&2
cat >resolve.c <<'@@@End of resolve.c'

#include "ext.h"

static char *odd_names[] =
{
   "0/1", "1/2", "1/1", "2/1", "3/1", "4/1", "+",
};

static char crt[6][7] =
{
   OK, OK,        OK,        OK,        DISABLED,  DISABLED,  DESTROYED,
   OK, OK,        OK,        DISABLED,  DISABLED,  DESTROYED, DESTROYED,
   OK, OK,        DISABLED,  DISABLED,  DESTROYED, DESTROYED, DESTROYED,
   OK, OK,        DISABLED,  DESTROYED, DESTROYED, DESTROYED, DESTROYED,
   OK, DISABLED,  DESTROYED, DESTROYED, DESTROYED, DESTROYED, DESTROYED,
   OK, DESTROYED, DESTROYED, DESTROYED, DESTROYED, DESTROYED, DESTROYED,
};

odds(attack, defend)
int  attack, defend;
{
   int result;

   result = (defend > 0) ? attack / defend + 1 : 6;

   if (result > 6) result = 6;
   if (result == 1)
      result = (2 * attack < defend) ? 0 : 1;
   return(result);
}

char *odd_str(attack, defend)
int attack, defend;
{
   return(odd_names[odds(attack, defend)]);
}

ogre_resolve(allocations)
OGRE *allocations;
{
   static char blanks[12] = {"           "};

   eeol(16);
   Amiga_puts("Resolving...");
   cycle();

   if (allocations->missiles > 0)
   {
      if (crt[roll()][odds(allocations->missiles, DEF_MISSILES)] ==
         DESTROYED) ogre.missiles -= 1;
   }

   if (allocations->main_bats > 0)
   {
      if (crt[roll()][odds(allocations->main_bats, DEF_MAIN)] ==
         DESTROYED) ogre.main_bats -= 1;
   }

   if (allocations->sec_bats > 0)
   {
      if (crt[roll()][odds(allocations->sec_bats, DEF_SECONDARY)] ==
         DESTROYED) ogre.sec_bats -= 1;
   }

   if (allocations->ap > 0)
   {
      if (crt[roll()][odds(allocations->ap, DEF_AP)] ==
         DESTROYED) ogre.ap -= 1;
   }

   if (allocations->treads > 0)
   {
      if (crt[roll()][odds(1,1)] == DESTROYED)
         decrease_treads(allocations->treads);
   }
   movecur(18, 40);
   Amiga_puts(blanks);
   movecur(19, 40);
   Amiga_puts(blanks);
   movecur(19, 40);
   Amiga_puts(blanks);
   movecur(20, 40);
   Amiga_puts(blanks);
   movecur(21, 40);
   Amiga_puts(blanks);
   movecur(22, 40);
   Amiga_puts(blanks);

   disp_ogre_status(FALSE);
}

def_resolve(i)
int i;
{
   char result;

   if (unit[i].status != DESTROYED && unit[i].fired > 0)
   {
      result = crt[roll()][odds(unit[i].fired, unit[i].defend)];
      if (unit[i].type == INFANTRY)
         if (result == DISABLED)
         {
            unit[i].attack -= 1;
            if (unit[i].attack == 0) unit[i].status = DESTROYED;
            update_hex(unit[i].l_hex, unit[i].r_hex);
            return;
         }
         switch (unit[i].status)
         {
            case OK:
               unit[i].status = result;
               break;
            case DISABLED:
               if (result != OK) unit[i].status = DESTROYED;
               break;
         }
         if (unit[i].status != OK)
            update_hex(unit[i].l_hex, unit[i].r_hex);
    }
}

roll()
{
   long lrand48(), k = 0;

   while (k == 0)
      k = (lrand48()) % 6;
   return(k);
}

ogre_ram()
{
   int i;

   for (i = 0; i < n_units; ++i)
      if (unit[i].l_hex ==  ogre.l_hex &&
      unit[i].r_hex == ogre.r_hex &&
      unit[i].status != DESTROYED)

      switch (unit[i].type)
      {
         case  INFANTRY:
            if (ogre.ap > 0)
            {
               unit[i].attack -= 1;
               if (unit[i].attack == 0)
                  unit[i].status = DESTROYED;
            }
            break;
         default:
            if (unit[i].movement == 0 || unit[i].status == DISABLED)
            {
               unit[i].status = DESTROYED;
               decrease_treads((unit[i].type == HVYTANK) ? 2 : 1);
               disp_ogre_status(FALSE);
            }
            else
            {
               unit[i].status = (roll() > 3) ? DESTROYED : DISABLED;
               decrease_treads((unit[i].type == HVYTANK) ? 2 : 1);
               disp_ogre_status(FALSE);
            }
            break;
      }
}

def_ram(i)
int i;
{
   if (unit[i].l_hex == ogre.l_hex && unit[i].r_hex == ogre.r_hex &&
     unit[i].type != INFANTRY)
   {
      if (unit[i].type == HVYTANK)
         decrease_treads(2);
      else
         decrease_treads(1);
      unit[i].status = DESTROYED;
      disp_ogre_status(FALSE);
   }
}

decrease_treads(attack)
int attack;
{
   ogre.treads -= attack;
   ogre.movement = 0;
   if (ogre.treads > 0) ogre.movement = 1;
   if (ogre.treads > ogre.init_treads / 3) ogre.movement = 2;
   if (ogre.treads > 2 * ogre.init_treads / 3) ogre.movement = 3;
}
@@@End of resolve.c
echo x - termcap.c 1>&2
cat >termcap.c <<'@@@End of termcap.c'
/*
 * This file contains all the console I/O stuff, most of which is cribbed
 * from the ROM Kernel Manual. Some of the routines here are not used, like
 * clear_screen() and the cursor movement defines.  The idea behind the
 * apparently redundant routines Amiga_putchar(), Amiga_getchar(), etc, is
 * to avoid having external pointers to windows and message ports in all the
 * other files.
 */

#include <exec/types.h>
#include <exec/io.h>
#include <exec/exec.h>
#include <exec/memory.h>
#include <graphics/gfx.h>
#include <hardware/dmabits.h>
#include <hardware/custom.h>
#include <hardware/blit.h>
#include <graphics/gfxmacros.h>
#include <graphics/copper.h>
#include <graphics/view.h>
#include <graphics/gels.h>
#include <graphics/regions.h>
#include <graphics/clip.h>
#include <graphics/text.h>
#include <graphics/gfxbase.h>
#include <libraries/dos.h>
#include <devices/console.h>
#include <devices/keymap.h>
#include <intuition/intuition.h>

#define HELPKEY   '?'

struct TextAttr MyFont =
{
            "topaz.font", TOPAZ_EIGHTY,
             FS_NORMAL,FPF_ROMFONT
};

struct NewWindow nw =
{
            0, 0, 640, 200, 3, 1, CLOSEWINDOW|MENUPICK|GADGETUP|GADGETDOWN,
            WINDOWCLOSE|SMART_REFRESH|ACTIVATE|GIMMEZEROZERO|BORDERLESS,
            0, NULL,"Ogre 2.0 by Hobie Orris", NULL, NULL, 100, 45,
            640, 200, CUSTOMSCREEN
};

struct NewScreen ns =
{
            0, 0, 640, 200, 2, 0, 1, HIRES, CUSTOMSCREEN,
            &MyFont, NULL, 0, 0
};



extern struct MsgPort *CreatePort();
extern struct IOStdReq *CreateStdIO();

struct Screen *scrn;
struct Window *w;
struct RastPort *rp;
struct IOStdReq *WriteMsg, *ReadMsg;
struct MsgPort *WritePort, *ReadPort;
struct IntuiMessage *Imsg;

ULONG DosBase, GfxBase, IntuitionBase;

/************************************************************************/
/*                                                                      */
/*                            Gadget Stuff                              */
/*                                                                      */
/************************************************************************/

/* The gadgets look like this:
 *
 *                            Gadget0     Gadget1
 *                      Gadget2     Gadget6     Gadget3
 *                            Gadget4     Gadget5
 *
 * All have plane 0 as below, and plane 1 as zeroes.
 */

/* offsets of gadget 0 from the window top left */

#define BASEPTX   450      /* x offset */
#define BASEPTY   123      /* y offset */

/* the pictures themselves */

USHORT Imgadget0[36] =
{
   0xffff, 0xf000,
   0x8000, 0x1000,
   0xbff0, 0x1000,
   0xbfe0, 0x1000,
   0xbfc0, 0x1000,
   0xbf80, 0x1000,
   0xbfc0, 0x1000,
   0xbfe0, 0x1000,
   0xbbf0, 0x1000,
   0xb1f8, 0x1000,
   0xa0fc, 0x1000,
   0x807e, 0x1000,
   0x803f, 0x1000,
   0x801f, 0x9000,
   0x800f, 0x1000,
   0x8006, 0x1000,
   0x8000, 0x1000,
   0xffff, 0xf000
};

USHORT Imgadget1[36] =
{
   0xffff, 0xf000,
   0x8000, 0x1000,
   0x80ff, 0xd000,
   0x807f, 0xd000,
   0x803f, 0xd000,
   0x801f, 0xd000,
   0x803f, 0xd000,
   0x807f, 0xd000,
   0x80fd, 0xd000,
   0x81f8, 0xd000,
   0x83f0, 0x5000,
   0x87e0, 0x1000,
   0x8fc0, 0x1000,
   0x9f80, 0x1000,
   0x8f00, 0x1000,
   0x8600, 0x1000,
   0x8000, 0x1000,
   0xffff, 0xf000
};

USHORT Imgadget2[36] =
{
   0xffff, 0xf000,
   0x8000, 0x1000,
   0x8080, 0x1000,
   0x8180, 0x1000,
   0x8380, 0x1000,
   0x8700, 0x1000,
   0x8fff, 0xd000,
   0x9fff, 0xd000,
   0xbfff, 0xd000,
   0x9fff, 0xd000,
   0x8fff, 0xd000,
   0x8700, 0x1000,
   0x8380, 0x1000,
   0x8180, 0x1000,
   0x8080, 0x1000,
   0x8000, 0x1000,
   0x8000, 0x1000,
   0xffff, 0xf000
};

USHORT Imgadget3[36] =
{
   0xffff, 0xf000,
   0x8000, 0x1000,
   0x8010, 0x1000,
   0x8018, 0x1000,
   0x801c, 0x1000,
   0x801e, 0x1000,
   0xbfff, 0x1000,
   0xbfff, 0x9000,
   0xbfff, 0xd000,
   0xbfff, 0x9000,
   0xbfff, 0x1000,
   0x801e, 0x1000,
   0x801c, 0x1000,
   0x8018, 0x1000,
   0x8010, 0x1000,
   0x8000, 0x1000,
   0x8000, 0x1000,
   0xffff, 0xf000,
};

USHORT Imgadget4[36] =
{
   0xffff, 0xf000,
   0x8000, 0x1000,
   0x8006, 0x1000,
   0x800f, 0x1000,
   0x801f, 0x9000,
   0x803f, 0x1000,
   0x807e, 0x1000,
   0xa0fc, 0x1000,
   0xb1f8, 0x1000,
   0xbbf0, 0x1000,
   0xbfe0, 0x1000,
   0xbfc0, 0x1000,
   0xbf80, 0x1000,
   0xbfc0, 0x1000,
   0xbfe0, 0x1000,
   0xbff0, 0x1000,
   0x8000, 0x1000,
   0xffff, 0xf000
};

USHORT Imgadget5[36] =
{
   0xffff, 0xf000,
   0x8000, 0x1000,
   0x8600, 0x1000,
   0x8f00, 0x1000,
   0x9f80, 0x1000,
   0x8fc0, 0x1000,
   0x87e0, 0x1000,
   0x83f0, 0x5000,
   0x81f8, 0xd000,
   0x80fd, 0xd000,
   0x807f, 0xd000,
   0x803f, 0xd000,
   0x801f, 0xd000,
   0x803f, 0xd000,
   0x807f, 0xd000,
   0x80ff, 0xd000,
   0x8000, 0x1000,
   0xffff, 0xf000
};

USHORT Imgadget6[36] =
{
   0xffff, 0xf000,
   0x8000, 0x1000,
   0x81fc, 0x1000,
   0x83fe, 0x1000,
   0x8706, 0x1000,
   0x8e00, 0x1000,
   0x8c00, 0x1000,
   0x8e00, 0x1000,
   0x87fc, 0x1000,
   0x83fe, 0x1000,
   0x8007, 0x1000,
   0x8003, 0x1000,
   0x8007, 0x1000,
   0x860e, 0x1000,
   0x87fc, 0x1000,
   0x83f8, 0x1000,
   0x8000, 0x1000,
   0xffff, 0xf000
};

#define PLNUM  0x01  /* number of planes in image */
#define PLPICK 0x02  /* display in plane 1 */
#define PLOFF  0x01  /* plane 0 turned on */

struct Image Gadgpic[7] =
{
   /* image 0 */
   0, 0, 20, 18, PLNUM, &Imgadget0[0], PLPICK, PLOFF, NULL,

   /* image 1 */
   0, 0, 20, 18, PLNUM, &Imgadget1[0], PLPICK, PLOFF, NULL,

   /* image 2 */
   0, 0, 20, 18, PLNUM, &Imgadget2[0], PLPICK, PLOFF, NULL,

   /* image 3 */
   0, 0 , 20, 18, PLNUM, &Imgadget3[0], PLPICK, PLOFF, NULL,

   /* image 4 */
   0, 0, 20, 18, PLNUM, &Imgadget4[0], PLPICK, PLOFF, NULL,

   /* image 5 */
   0, 0, 20, 18, PLNUM, &Imgadget5[0], PLPICK, PLOFF, NULL,

   /* image 6 */
   0, 0, 20, 18, PLNUM, &Imgadget6[0], PLPICK, PLOFF, NULL
};


struct Gadget Arrow[7] =
{
   /* Up left arrow 0 */
   NULL, BASEPTX, BASEPTY, 20, 18,
   GADGHCOMP|GADGIMAGE, GADGIMMEDIATE|RELVERIFY,
   BOOLGADGET, &Gadgpic[0], NULL, NULL, NULL, NULL, NULL, NULL,

   /* Up right arrow 1 */
   NULL, BASEPTX + 20, BASEPTY, 20, 18,
   GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE,
   BOOLGADGET, &Gadgpic[1], NULL, NULL, NULL, NULL, NULL, NULL,


   /* left arrow 2 */
   NULL, BASEPTX - 10, BASEPTY + 18, 20, 18,
   GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE,
   BOOLGADGET, &Gadgpic[2], NULL, NULL, NULL, NULL, NULL, NULL,

   /* right arrow 3 */
   NULL, BASEPTX + 30, BASEPTY + 18, 20, 18,
   GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE,
   BOOLGADGET, &Gadgpic[3], NULL, NULL, NULL, NULL, NULL, NULL,

   /* down left arrow 4 */
   NULL, BASEPTX, BASEPTY + 36, 20, 18,
   GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE,
   BOOLGADGET, &Gadgpic[4], NULL, NULL, NULL, NULL, NULL, NULL,

   /* down right arrow 5 */
   NULL, BASEPTX + 20, BASEPTY + 36, 20, 18,
   GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE,
   BOOLGADGET, &Gadgpic[5], NULL, NULL, NULL, NULL, NULL, NULL,

   /* sit 6 */
   NULL, BASEPTX + 10, BASEPTY + 18, 20, 18,
   GADGHCOMP|GADGIMAGE, RELVERIFY|GADGIMMEDIATE,
   BOOLGADGET, &Gadgpic[6], NULL, NULL, NULL, NULL, NULL, NULL,
};

/*  These are the command characters returned to Amiga_getchar()
 *  when a gadget is selected.
 */

char Gadtbl[] =
{
               'w', 'e', 'a', 'd', 'z', 'x', 's', '\0'
};

/*************************************************************************/
/*                                                                       */
/*                           Menu Stuff                                  */
/*                                                                       */
/*************************************************************************/

/* Main menu structure which has three entries: Deploy, Target and Help */

#define WID  112
#define WID2 130

struct Menu mymenu[3] = { NULL, 1, 0, WID, 0, MENUENABLED, NULL, NULL,
                          0, 0, 0, 0,
                          NULL, WID + 1, 0, WID, 0, MENUENABLED, NULL, NULL,
                          0, 0, 0, 0,
                          NULL, WID * 2 + 2, 0, WID, 0, MENUENABLED, NULL,
                          NULL, 0, 0, 0, 0
};

/* Menu entries for the Deploy menu */

struct MenuItem Menu1[6] = { /* 1st item */
                             NULL, 0, 0, WID, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0,

                             /* 2nd item */
                             NULL, 0, 10, WID, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0,

                             /* 3rd item */
                             NULL, 0, 20, WID, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0,

                             /* 4th item */
                             NULL, 0, 30, WID, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0,

                             /* 5th item */
                             NULL, 0, 40, WID, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0,

                             /* 6th item */
                             NULL, 0, 50, WID, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0
                        };


struct MenuItem Menu2[7] = { NULL, 0, 0, WID2, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0,

                             /* 2nd item */
                             NULL, 0, 10, WID2, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0,0,0,

                             /* 3rd item */
                             NULL, 0, 20, WID2, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0,

                             /* 4th item */
                             NULL, 0, 30, WID2, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0,

                             /* 5th item */
                             NULL, 0, 40, WID2, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0,

                             /* 6th item */
                             NULL, 0, 50, WID2, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0,0,

                             /* 7th item */
                             NULL, 0, 60, WID2, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0
};

struct MenuItem Menu3[1] = {
                             /* 1st item */
                             NULL, 0, 0, WID2, 8,
                             ITEMENABLED|HIGHCOMP|ITEMTEXT, 0, 0, 0, 0, 0, 0
                           };

/* deploy menu titles */

UBYTE *Depstr[6] = { "C Command Post",
                     "H Howitzer",
                     "T Heavy Tank",
                     "M Missile Tank",
                     "G GEV",
                     "I Infantry"
                   };

/* target menu titles */

UBYTE *Tarstr[7] = { "t Treads",
                     "b Main Battery",
                     "s Secondary Batt",
                     "m Missile",
                     "a Anti-Personnel",
                     "p Pass now",
                     "r Resolve now"
                    };

/* help menu title */

UBYTE *Helpstr = "? Instructions";

/* Menu strip titles */

UBYTE *Titles[] = { "Deploy", "Target", "Help" };

/* Menu item text message descriptors */

struct IntuiText MenuText[14] = {3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0,
                                 3, 0, JAM1, 0, 0, &MyFont, 0, 0 };

/* These are the command characters associated with menu selections */

char Mentbl[3][7] =
{               {'C', 'H', 'T', 'M', 'G', 'I', '\0'},  /* deploy cmds */
                {'t', 'b', 's', 'm', 'a', 'p', 'r'},   /* target cmds */
                {'?', '\0', '\0', '\0', '\0', '\0', '\0'} /* help */
};

/***********************************************************************/
/*                                                                     */
/*                         Requester Stuff                             */
/*                                                                     */
/***********************************************************************/


char BodyText[] = "Choose an Ogre type";
char PosText[] = "Mark III";
char NegText[] = "Mark V";

struct IntuiText Body =
{
   3, 1, JAM1, 60, 10, NULL, &BodyText[0], NULL
};

struct IntuiText Pos =
{
   3, 1, JAM1, 7, 4, NULL, &PosText[0], NULL
};

struct IntuiText Neg =
{
   3, 1, JAM1, 7, 4, NULL, &NegText[0], NULL
};


/***********************************************************************/
/*                                                                     */
/*                            Toys Code                                */
/*                                                                     */
/***********************************************************************/


/* getevent pulls a message off the program's message queue and checks if
 * it's a menu-related or gadget-related message.  If it is, the appropriate
 * handler is called.
 */

char getevent()
{
   char GadgetServe(), MenuServe(), result;
   struct IntuiMessage  *GetMsg(), Tmpmsg;

   /* check queue for incoming messages */

   Imsg = GetMsg(w->UserPort);
   if (Imsg == NULL)
      return('\0');
   else
      Tmpmsg = *Imsg;
   ReplyMsg(Imsg);

   /* if message available, decode it */

   if (Tmpmsg.Class != 0)
   {
      switch (Tmpmsg.Class)
      {
         /* could be a close window event */

         case CLOSEWINDOW:
            endit();
            break;

      /* or a menu selection */

         case MENUPICK:
            result = MenuServe(&Tmpmsg);
            return(result);
            break;

         case GADGETUP:
            result = GadgetServe(&Tmpmsg);
            return (result);
            break;

      /* if no selection was made, return a null */

         default:
            return('\0');
            break;
      }
   }
}     /* checkmenu */

/* This routine invokes the requester that asks for Ogre type
 */

int get_mark()
{
   int x;

   x = AutoRequest(w, &Body, &Pos, &Neg, 0L, 0L, 300L, 60L);
   if (x)
      x = 3;
   else
      x = 5;
   return(x);
}

/* Initmenu sets up the menus at the start of the program.
 * Nobody said this would be easy.
 */

InitMenu()
{
   int i;

   /* link the three menus */

   mymenu[0].NextMenu = &mymenu[1];
   mymenu[1].NextMenu = &mymenu[2];
   mymenu[2].NextMenu = NULL;

   /* point to first items on the menus */

   mymenu[0].FirstItem = &Menu1[0];
   mymenu[1].FirstItem = &Menu2[0];
   mymenu[2].FirstItem = &Menu3[0];

   /* initialize titles */

   mymenu[0].MenuName = Titles[0];
   mymenu[1].MenuName = Titles[1];
   mymenu[2].MenuName = Titles[2];

   /* link menu items */

   for (i = 0; i < 6; ++i)
      Menu1[i].NextItem = &Menu1[i + 1];
   Menu1[5].NextItem = NULL;

   for (i = 0; i < 7; ++i)
      Menu2[i].NextItem = &Menu2[i + 1];
   Menu2[6].NextItem = NULL;

   Menu3[0].NextItem = NULL;

   /* link item names to text descriptors */

   for (i = 0; i < 6; ++i)
      MenuText[i].IText = Depstr[i];
   for (i = 0; i < 7; ++i)
      MenuText[6 + i].IText = Tarstr[i];
   MenuText[13].IText = Helpstr;

   /* link text descriptors to item structures */

   for (i = 0; i < 6; ++i)
      Menu1[i].ItemFill = &MenuText[i];
   for (i = 0; i < 7; ++i)
      Menu2[i].ItemFill = &MenuText[6 + i];
   Menu3[0].ItemFill = &MenuText[13];

   SetMenuStrip(w, &mymenu[0]);
}

/*  InitGad sets up the gadgets before the game starts
 */

InitGad()
{
   int i;

   /* link Image structures to Gadget structures */

   for (i = 0; i < 6; ++i)
      Arrow[i].GadgetRender = (APTR) &Gadgpic[i];

   /* link image data to Image structures */

   Gadgpic[0].ImageData = &Imgadget0[0];
   Gadgpic[1].ImageData = &Imgadget1[0];
   Gadgpic[2].ImageData = &Imgadget2[0];
   Gadgpic[3].ImageData = &Imgadget3[0];
   Gadgpic[4].ImageData = &Imgadget4[0];
   Gadgpic[5].ImageData = &Imgadget5[0];
   Gadgpic[6].ImageData = &Imgadget6[0];

   Arrow[6].NextGadget = NULL;

}


refresh()
{
   int i;

   RefreshGadgets(&Arrow[0], w, NULL);

   /* Add the gadgets to the window's gadget list and activate them */
   for (i = 0; i < 7; ++i)
   {
      AddGadget(w, &Arrow[i], -1);
      OnGadget(&Arrow[i], w, NULL);
   }
}

/* MenuServe decodes menu request messages and translates them into the
 * proper character to hand to main program.
 */

char MenuServe(Menmsg)
struct IntuiMessage *Menmsg;
{
   USHORT menusel, itemsel;      /* menu and item selected */
   char selection;

   /* extract the menu and item numbers */

   menusel = MENUNUM(Menmsg->Code);
   itemsel = ITEMNUM(Menmsg->Code);
   if (menusel == MENUNULL)
      return(NULL);

   /* get the command character from the table */

   selection = Mentbl[menusel][itemsel];
   return(selection);
}

/* GadgetServe translates a gadget selection into a command character
 * and returns that character.
 */

char GadgetServe(GadMsg)
struct IntuiMessage *GadMsg;
{
   int i;

   for (i = 0; i < 7; ++i)
      if (GadMsg->IAddress == (APTR) &Arrow[i])
         break;
   return (Gadtbl[i]);
}

/*
 * These are the calls known to the rest of the Ogre program
 */

tc_setup()
{
   make_console();
}

/* This is not a true erase to end of line routine, since we want
 * to preserve the gadget display.  It erases to column 55.
 */

eeol(row)
int row;
{
   static char s[55] =
   {"                                                      "};

   movecur(row,0);
   Amiga_puts(s);
   movecur(row,0);
}

clear_screen()
{
   static char ff = 0x0c;

   ConPutChar(WriteMsg,&ff);
}

/*
 *    Move the cursor to row, col by building a CSI sequence
 */

movecur(row, col)
int row, col;
{
   char seq[8];
   int n,i;

   row += 1;  /* Kludge city! The Amiga display is shorter than a terminal */

   /* CSI character */

   seq[0] = 0x9b;

   /* convert row to ASCII */

   n = stci_d(&seq[1], row, 4);
   i = n + 1;

   /* field separator */

   seq[i] = 0x3b;
   i++;

   /* convert column to ASCII */

   n = stci_d(&seq[i], col, 4);
   i += n;

   /* terminator */

   seq[i] = 0x48;
   seq[i+1] = '\0';
   ConPutStr(WriteMsg, &seq[0]);
}

set_term()
{
   cursoff(WriteMsg);
}

reset_term()
{
   endit();
}

/*
 * These are mine. They insulate the rest of the files from knowing anything
 * about message ports and other messy stuff.
 */

Amiga_puts(s)
char *s;
{
   ConPutStr(WriteMsg, s);
}

/* Put a single char out.  This is weird: take away the static, and it no
 * longer works!
 */

Amiga_putchar(c)
char c;
{
   static char x;

   x = c;
   ConPutChar(WriteMsg, &x);
}

/*    Get a character from the keyboard or a close window event from the
 *    mouse. A close window event ends the program.
 *    If you want to add menus then this is the place to do it.
 */

char Amiga_getchar()
{
   static char c;
   BYTE MayGetChar();
   struct IntuiMessage *GetMsg();
   char checkmenu(), event;
   BYTE ret;

   FOREVER
   {
      ret = 0;

      /* first, check for keyboard input */

      ret = MayGetChar(ReadPort, ReadMsg, &c);
      if (ret != -1)
      {
         /* Trap help requests here, so that help can be obtained
          * from anywhere in the program.
          */

         if (ret == HELPKEY)
            ret = get_help();
         else
            return((char) ret);
      }

      /* if no keyboard chars are ready, check our message port for
       * menus and gadgets.
       */

      if ((event = getevent()) != '\0')
      {
         if (event == HELPKEY)
            ret = get_help();
         else
            return(event);
      }
   }
}

endit()
{
   err(7);
   exit(0);
}

/*
 * This stuff is from the ROM Kernel Manual
 */
make_console()
{
   int error;
   UBYTE c;

   if ((DosBase = OpenLibrary("dos.library", 0)) == NULL)
      err(1);
   if ((IntuitionBase = OpenLibrary("intuition.library", 0)) == NULL)
      err(2);
   if ((GfxBase = OpenLibrary("graphics.library", 0)) == NULL)
      err(3);

   WritePort = CreatePort("con1.write", 0);
   if (WritePort == 0)
      err(4);
   WriteMsg = CreateStdIO(WritePort);
   if (WriteMsg == 0)
      err(19);

   ReadPort = CreatePort("con1.read", 0);
   if (ReadPort == 0)
      err(5);

   ReadMsg = CreateStdIO(ReadPort);
   if (ReadMsg == 0)
      err(12);

   scrn = (struct Screen *) OpenScreen(&ns);
   if (scrn == NULL)
   {
      printf("Can't open window");
      exit(20);
   }

   nw.Screen = scrn;

   w = (struct Window *) OpenWindow(&nw);
   if (w == NULL)
      err(6);

   /* link gadgets into window */

   InitGad();

   /* link menus into window */

   InitMenu();

   error = OpenConsole(WriteMsg, ReadMsg, w);
   if (error != 0)
      err(7);

   QueueRead(ReadMsg, &c);

   c = CheckIO(ReadMsg);
   if (c == FALSE) AbortIO(ReadMsg);
   else GetMsg(ReadPort);

}

/*
 * This routine is ugly. Please fix it.
 */

static err(n)
int n;
{
   switch (n)
   {
      case 7: CloseDevice(WriteMsg);
      case 6: CloseWindow(w);
      case 10: CloseScreen(scrn);
      case 5: DeletePort(ReadPort);
      case 12: DeleteStdIO(ReadMsg);
      case 4: DeletePort(WritePort);
      case 19: DeleteStdIO(WriteMsg);
      case 3: CloseLibrary(GfxBase);
      case 2: CloseLibrary(IntuitionBase);
      case 1: CloseLibrary(DosBase);
   }
   exit(n);                                  /* return error code to CLI */
}


OpenConsole(wreq, rreq, win)
struct IOStdReq *wreq, *rreq;
struct Window *win;
{
   int error;
   wreq->io_Data = (APTR) win;
   wreq->io_Length = sizeof(*win);
   error = OpenDevice("console.device", 0, wreq, 0);
   rreq->io_Device = wreq->io_Device;
   rreq->io_Unit = wreq->io_Unit;
   return(error);
}


ConPutChar(request, ch)
struct IOStdReq *request;
char *ch;
{
   request->io_Command = CMD_WRITE;
   request->io_Data = ch;
   request->io_Length = 1;
   DoIO(request);
   return(0);
}


ConWrite(request, string, len)
struct IOStdReq *request;
char *string;
int len;
{
   request->io_Command = CMD_WRITE;
   request->io_Data = (APTR) string;
   request->io_Length = len;
   DoIO(request);
   return(0);
}


ConPutStr(request, string)
struct IOStdReq *request;
char *string;
{
   request->io_Command = CMD_WRITE;
   request->io_Data = (APTR) string;
   request->io_Length = -1;
   DoIO(request);
   return(0);
}


QueueRead(request, buf)
struct IOStdReq *request;
UBYTE *buf;
{
   request->io_Command = CMD_READ;
   request->io_Data = (APTR)buf;
   request->io_Length = 1;
   SendIO(request);
   return(0);
}


char ConGetChar(console, request, buf)
struct IOStdReq *request;
struct MsgPort *console;
char *buf;
{
   char temp;

   while ((GetMsg(console) == NULL)) WaitPort(console);
   QueueRead(request, buf);
   temp = *buf;
   return(temp);
}

BYTE MayGetChar(console,rreq, buf)
struct IOStdReq *rreq;
struct MsgPort *console;
char *buf;
{
   register BYTE *temp;

   if (GetMsg(console) == NULL) return(-1);
   temp = (char *) rreq->io_Data;
   QueueRead(rreq, buf);
   return(*temp);
}
@@@End of termcap.c
echo x - linkfile 1>&2
cat >linkfile <<'@@@End of linkfile'
from lc:lib/Lstartup.obj termcap.o map.o resolve.o attack.o move.o *
help.o init.o ogrecom.o initround.o ogrestat.o main.o
to ogre
library  lc:lib/lc.lib lc:lib/amiga.lib


@@@End of linkfile
-- 
 Hobie Orris				| 	
 SoftQuad Inc., Toronto, Ont.		|"There'll be no more giant leeches
 {ihnp4 | decvax | ? }!utzoo!sq!hobie	| When you find the good Lord Jesus"

mwm@eris.UUCP (02/24/87)

In article <1987Feb22.120108.9220@sq.uucp> hobie@sq.uucp (Hobie Orris) writes:
>I would also like it if someone who knows the commercial version
>would mail me a comparative review.  I'd like to know if we both used the same
>source code as a basis.

I looked at your version long enough to decide you probably started
with the Unix version that I hacked on 3 or 4 years ago (and you
started with the original! Gack! Lots of missing, near vital
features). I've also got the Origin Systems game. I haven't played
your version, so I a comparative review isn't in the works. If it
shows up on a Fish disk, I'll do one. 

In any case, Origin Systems Inc. probably didn't start with the Unix
source code.  They are much truer to the original Ogre: same board,
infantry handled correctly, etc. If they did start with the Unix
source code, they did far more work turning it into what they're
selling (besides the misfeature fixes, they also put in good graphics
& sound effects) than any of the three people who worked on the latest
version to be found on the net (not including Hobie's, which I haven't
looked at).

I meant to post a review of the game, recommending it. The _only_ flaw
is that it's copy-protected. Would-be-nice things they left out are
optional features from the game (where's my mobil command post!?!?).

	<mike



But I'll survive, no you won't catch me,		Mike Meyer
I'll resist the urge that is tempting me,		ucbvax!mwm
I'll avert my eyes, keep you off my knee,		mwm@berkeley.edu
But it feels so good when you talk to me.		mwm@ucbjade.BITNET