groff
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Groff] improved html.cc


From: Gaius Mulley
Subject: [Groff] improved html.cc
Date: Sat, 25 Sep 99 22:00 BST

Hi Werner,

Here are the updates to the html driver. I've included
a complete copy of grohtml/html.cc as it creates many
diffs and checked that there are no conflicts with
html.cc. I've merged the changes in the manual page.

I temporarily removed the -P-a switch as I've not
yet got this to work :-( (next on the to do list).
However the good news is that the normal text routines
have been rewritten, text superscript and subscript
implemented, arcs, polygon fill and splines have been added.
Nevertheless the text handling could be impoved and this
remains a high priority of mine. But it is much better than
before IMHO.

Also a change log has been included in the grohtml directory
which probably repeats most of the above :-)

many many thanks for all your work and patience,

cheers Gaius

the rest of the email contains:

   diffs
   uuencoded files

----------------------- diffs  -------------------------------
Only in groff-html/grohtml/: .gdbinit
Only in groff-html/grohtml/: .gdbinit~
Only in groff-html/grohtml/: ChangeLog
Only in groff-html/grohtml/: design.ms
diff -r -c groff-cvs/grohtml/grohtml.man groff-html/grohtml/grohtml.man
*** groff-cvs/grohtml/grohtml.man       Sun Sep 12 08:30:03 1999
--- groff-html/grohtml/grohtml.man      Sat Sep 25 21:20:06 1999
***************
*** 66,76 ****
--- 66,78 ----
  option.
  .SH OPTIONS
  .TP
+ .ig
  .B \-a
  generate html utilizing the html automatic paragraph and formatting feature.
  Without this option
  .B grohtml
  generates static text which is preformatted.
+ ..
  .TP
  .B \-d
  turn on internal debugging.
***************
*** 108,115 ****
  and
  .B BI
  mounted at font positions 1 to 4.
  .SH BUGS
! This is very alpha, use at your peril, nevertheless I find it useful.
  .SH "SEE ALSO"
  .BR afmtodit (@MAN1EXT@),
  .BR groff (@MAN1EXT@),
--- 110,121 ----
  and
  .B BI
  mounted at font positions 1 to 4.
+ .SH DEPENDENCIES
+ grohtml is dependent upon grops, gs, ppmtogif and ppmquant which are invoked 
to
+ generate all gif files. Gif files are generated whenever a table, picture,
+ equation or line is encountered.
  .SH BUGS
! This is still fairly alpha, nevertheless I find it useful.
  .SH "SEE ALSO"
  .BR afmtodit (@MAN1EXT@),
  .BR groff (@MAN1EXT@),
Only in groff-html/grohtml/: grohtml.man~
diff -r -c groff-cvs/grohtml/html.cc groff-html/grohtml/html.cc
*** groff-cvs/grohtml/html.cc   Sun Sep 12 08:30:10 1999
--- groff-html/grohtml/html.cc  Sat Sep 25 20:34:48 1999
***************
*** 4,70 ****
   *  Gaius Mulley (address@hidden) wrote grohtml
   *  but it owes a huge amount of ideas and raw code from
   *  James Clark (address@hidden) grops/ps.cc.
-  *
-  *  To do:
-  *
-  *   o  finish splines and filled in areas
-  *   o  correct the character descriptions in devhtml
-  *      (originally taken from devX100)
-  *   o  write some better macros for the html device
   */
  
  /*
- Description/Design
- 
- The html device driver works as follows:
-   (i)   it creates a linked list of all words on a page
-   (ii)  works out the left most margin (which it later removes)
-   (iii) builds two kinds of regions ascii text and graphical.
-         The graphical regions consist of tbl's, eqn's, pic's
-         (basically anything that cannot be textually displayed).
-         It will scan through a page to find lines (such as footer etc)
-         and places these into tiny graphical regions. Certain fonts
-         also are treated as a graphical region - as html has no easy
-         equivalent. For example Greek math symbols.
-   (iv)  To give grohtml a sporting chance of accuratly deciding which
-         is a graphical region and which is text, the front end programs
-         tbl, eqn, pic have all been tweeked to encapsulate pictures, tables
-         and equations with the following lines:
- 
-         .if '\*(.T'html' \X(graphic-start(\c
- 
-         .if '\*(.T'html' \X(graphic-end(\c
- 
-         these appear to grohtml as:
-         x X graphic-start
- 
-         and
- 
-         x X graphic-end
- 
-   (v)   in addition to graphic-start and graphic-end there are two
-         other "special characters" which are used.
- 
-         x X index:N
- 
-         where N is a number. The purpose of this sequence is to stop
-         devhtml from automatically producing links to headings which
-         have a header level >N
- 
-         x X html:STRING
- 
-         allows a STRING to be passed through to the output file with
-         no processing whatsoever. Ie it allows users to include html
-         commands, via macro, such as:
- 
-         .LINK "the classic blue text" "" "ftp://somewonderful.gnu.software";
- 
-         where the LINK macro bundles the info into STRING above.
- 
-         For more info consult the end of tmac/tmac.html
- */
- 
- /*
  This file is part of groff.
  
  groff is free software; you can redistribute it and/or modify it under
--- 4,12 ----
***************
*** 101,108 ****
  #   define FALSE (1==0)
  #endif
  
- #undef USE_FIG2DEV
- 
  #define MAX_TEMP_NAME      1024
  #define MAX_STRING_LENGTH  4096
  
--- 43,48 ----
***************
*** 113,121 ****
  
  
  static int debug_on   = FALSE;
- static int auto_on    = FALSE;
  static int guess_on   =  TRUE;
  static int margin_on  = FALSE;
  
  static int linewidth = -1;
  
--- 53,61 ----
  
  
  static int debug_on   = FALSE;
  static int guess_on   =  TRUE;
  static int margin_on  = FALSE;
+ static int auto_on    = FALSE;
  
  static int linewidth = -1;
  
***************
*** 349,357 ****
  
  int text_glob::is_less (text_glob *a, text_glob *b)
  {
!   return( (a->minv < b->minv) || ((a->minv == b->minv) && (a->minh < 
b->minh)) );
  }
  
  class graphic_glob {
  public:
    int             is_less (graphic_glob *a, graphic_glob *b);
--- 289,306 ----
  
  int text_glob::is_less (text_glob *a, text_glob *b)
  {
!   if (is_intersection(a->minv, a->maxv, b->minv, b->maxv)) {
!     return( a->minh < b->minh );
!   } else {
!     return( a->maxv < b->maxv );
!   }
  }
  
+ struct xycoord {
+   int x;
+   int y;
+ };
+ 
  class graphic_glob {
  public:
    int             is_less (graphic_glob *a, graphic_glob *b);
***************
*** 360,382 ****
    ~graphic_glob   (void);
  
    int             minv, maxv, minh, maxh;
-   int             x1, y1, x2, y2, x3, y3;
    int             xc, yc;
    int             size;
    int             code;
  };
  
  graphic_glob::graphic_glob ()
!   : minv(-1), maxv(-1), minh(-1), maxh(-1), code(0), size(0)
  {
  }
  
  graphic_glob::~graphic_glob ()
  {
  }
  
  graphic_glob::graphic_glob (int troff_code)
!   : minv(-1), maxv(-1), minh(-1), maxh(-1), code(troff_code), size(0)
  {
  }
  
--- 309,336 ----
    ~graphic_glob   (void);
  
    int             minv, maxv, minh, maxh;
    int             xc, yc;
+   int             nopoints;           // number of points allocated in array 
below
+   struct xycoord *point;
    int             size;
+   int             fill;
    int             code;
  };
  
  graphic_glob::graphic_glob ()
!   : minv(-1), maxv(-1), minh(-1), maxh(-1), code(0), size(0), nopoints(0), 
point(0)
  {
  }
  
  graphic_glob::~graphic_glob ()
  {
+   if (point != 0) {
+     free(point);
+   }
  }
  
  graphic_glob::graphic_glob (int troff_code)
!   : minv(-1), maxv(-1), minh(-1), maxh(-1), code(troff_code), size(0), 
nopoints(0), point(0)
  {
  }
  
***************
*** 420,429 ****
    void                        add_special_char         (style *s, char 
*string, unsigned int length,
                                                        int min_vertical, int 
min_horizontal,
                                                        int max_vertical, int 
max_horizontal);
!   void                        add_line                 (int code, int x1, int 
y1, int x2, int y2, int size);
!   void                        add_arc                  (int code,
!                                                       int x1, int y1, int x2, 
int y2, int x3, int y3,
!                                                       int xc, int xy, int 
size);
    void                        calculate_region         (void);
    int                         is_in_region             (graphic_glob *g);
    int                         can_grow_region          (graphic_glob *g);
--- 374,383 ----
    void                        add_special_char         (style *s, char 
*string, unsigned int length,
                                                        int min_vertical, int 
min_horizontal,
                                                        int max_vertical, int 
max_horizontal);
!   void                        add_line                 (int code, int x1, int 
y1, int x2, int y2, int size, int fill);
!   void                        add_arc                  (int code, int xc, int 
yc, int *p, double *c, int size, int fill);
!   void                        add_polygon              (int code, int np, int 
*p, int oh, int ov, int size, int fill);
!   void                        add_spline               (int code, int xc, int 
yc, int np, int *p, int size, int fill);
    void                        calculate_region         (void);
    int                         is_in_region             (graphic_glob *g);
    int                         can_grow_region          (graphic_glob *g);
***************
*** 500,522 ****
    }
  }
  
! void page::add_line (int code, int x1, int y1, int x2, int y2, int size)
  {
    graphic_glob *g = new graphic_glob(code);
  
!   g->minh = min(x1, x2);
!   g->maxh = max(x1, x2);
!   g->minv = min(y1, y2);
!   g->maxv = max(y1, y2);
!   g->x1   = x1;
!   g->y1   = y1;
!   g->x2   = x2;
!   g->y2   = y2;
!   g->x3   = 0;
!   g->y3   = 0;
!   g->xc   = 0;
!   g->yc   = 0;
!   g->size = size;
  
    if (is_in_graphic) {
      region_lines.add(g);
--- 454,477 ----
    }
  }
  
! void page::add_line (int code, int x1, int y1, int x2, int y2, int size, int 
fill)
  {
    graphic_glob *g = new graphic_glob(code);
  
!   g->minh       = min(x1, x2);
!   g->maxh       = max(x1, x2);
!   g->minv       = min(y1, y2);
!   g->maxv       = max(y1, y2);
!   g->point      = (struct xycoord *)malloc(sizeof(xycoord)*2);
!   g->nopoints   = 2;
!   g->point[0].x = x1 ;
!   g->point[0].y = y1 ;
!   g->point[1].x = x2 ;
!   g->point[1].y = y2 ;
!   g->xc         = 0;
!   g->yc         = 0;
!   g->size       = size;
!   g->fill       = fill;
  
    if (is_in_graphic) {
      region_lines.add(g);
***************
*** 525,549 ****
    }
  }
  
! void page::add_arc (int code,
!                   int x1, int y1, int x2, int y2, int x3, int y3,
!                   int xc, int xy, int size)
  {
    graphic_glob *g = new graphic_glob(code);
  
!   g->minh = min(x1, min(x2, x3));
!   g->maxh = max(x1, max(x2, x3));
!   g->minv = min(y1, min(y2, y3));
!   g->maxv = max(y1, max(y2, y3));
!   g->x1   = x1;
!   g->y1   = y1;
!   g->x2   = x2;
!   g->y2   = y2;
!   g->x3   = x3;
!   g->y3   = y3;
!   g->xc   = xc;
!   g->yc   = xy;
    g->size = size;
  
    if (is_in_graphic) {
      region_lines.add(g);
--- 480,695 ----
    }
  }
  
! /*
!  *  assign_min_max_for_arc - works out the smallest box that will encompass an
!  *                           arc defined by:  origin: g->xc, g->xc
!  *                           and vector (p[0], p[1]) and (p[2], p[3])
!  */
! 
! void assign_min_max_for_arc (graphic_glob *g, int *p, double *c)
! {
!   int radius = (int) sqrt(c[0]*c[0]+c[1]*c[1]);
!   int xv1    = p[0];
!   int yv1    = p[1];
!   int xv2    = p[2];
!   int yv2    = p[3];
!   int x1     = g->xc+xv1;
!   int y1     = g->yc+yv1;
!   int x2     = g->xc+xv1+xv2;
!   int y2     = g->yc+yv1+yv2;
! 
!   // firstly lets use the 'circle' limitation
!   g->minh = x1-radius;
!   g->maxh = x1+radius;
!   g->minv = y1-radius;
!   g->maxv = y1+radius;
! 
!   // incidentally I'm sure there is a better way to do this, but I don't know 
it
!   // please can someone let me know or "improve" this function
! 
!   // now see which min/max can be reduced and increased for the limits of the 
arc
!   //
!   //
!   //       Q2   |   Q1
!   //       -----+-----
!   //       Q3   |   Q4
!   //
! 
! 
!   if ((xv1>=0) && (yv1>=0)) {
!     // first vector in Q3
!     if ((xv2>=0) && (yv2>=0)) {
!       // second in Q1
!       g->maxh = x2;
!       g->minv = y1;
!     } else if ((xv2<0) && (yv2>=0)) {
!       // second in Q2
!       g->maxh = x2;
!       g->minv = y1;
!     } else if ((xv2>=0) && (yv2<0)) {
!       // second in Q4
!       g->minv = min(y1, y2);
!     } else if ((xv2<0) && (yv2<0)) {
!       // second in Q3
!       if (x1>=x2) {
!       g->minh = x2;
!       g->maxh = x1;
!       g->minv = min(y1, y2);
!       g->maxv = max(y1, y2);
!       } else {
!       // xv2, yv2 could all be zero?
!       }
!     }
!   } else if ((xv1>=0) && (yv1<0)) {
!     // first vector in Q2
!     if ((xv2>=0) && (yv2>=0)) {
!       // second in Q1
!       g->maxh = max(x1, x2);
!       g->minh = min(x1, x2);
!       g->minv = y1;
!     } else if ((xv2<0) && (yv2>=0)) {
!       // second in Q2
!       if (x1<x2) {
!       g->maxh = x2;
!       g->minh = x1;
!       g->minv = min(y1, y2);
!       g->maxv = max(y1, y2);
!       } else {
!       // otherwise almost full circle anyway
!       }
!     } else if ((xv2>=0) && (yv2<0)) {
!       // second in Q4
!       g->minv = y2;
!       g->minh = x1;
!     } else if ((xv2<0) && (yv2<0)) {
!       // second in Q3
!       g->minh = min(x1, x2);
!     }
!   } else if ((xv1<0) && (yv1<0)) {
!     // first vector in Q1
!     if ((xv2>=0) && (yv2>=0)) {
!       // second in Q1
!       if (x1<x2) {
!       g->minh = x1;
!       g->maxh = x2;
!       g->minv = min(y1, y2);
!       g->maxv = max(y1, y2);
!       } else {
!       // nearly full circle
!       }
!     } else if ((xv2<0) && (yv2>=0)) {
!       // second in Q2
!       g->maxv = max(y1, y2);
!     } else if ((xv2>=0) && (yv2<0)) {
!       // second in Q4
!       g->minv = min(y1, y2);
!       g->maxv = max(y1, y2);
!       g->minh = min(x1, x2);
!     } else if ((xv2<0) && (yv2<0)) {
!       // second in Q3
!       g->minh = x2;
!       g->maxv = y1;
!     }
!   } else if ((xv1<0) && (yv1>=0)) {
!     // first vector in Q4
!     if ((xv2>=0) && (yv2>=0)) {
!       // second in Q1
!       g->maxh = max(x1, x2);
!     } else if ((xv2<0) && (yv2>=0)) {
!       // second in Q2
!       g->maxv = max(y1, y2);
!       g->maxh = max(x1, x2);
!     } else if ((xv2>=0) && (yv2<0)) {
!       // second in Q4
!       if (x1>=x2) {
!       g->minv = min(y1, y2);
!       g->maxv = max(y1, y2);
!       g->minh = min(x1, x2);
!       g->maxh = max(x2, x2);
!       } else {
!       // nearly full circle
!       }
!     } else if ((xv2<0) && (yv2<0)) {
!       // second in Q3
!       g->maxv = max(y1, y2);
!       g->minh = min(x1, x2);
!       g->maxh = max(x1, x2);
!     }
!   }
!   // this should *never* happen but if it does it means a case above is 
wrong..
! 
!   // this code is only present for safety sake
!   if (g->maxh < g->minh) {
!     if (debug_on) {
!       fprintf(stderr, "assert failed minh > maxh\n");
!       stop();
!     }
!     g->maxh = g->minh;
!   }
!   if (g->maxv < g->minv) {
!     if (debug_on) {
!       fprintf(stderr, "assert failed minv > maxv\n");
!       stop();
!     }
!     g->maxv = g->minv;
!   }
! }
! 
! void page::add_arc (int code, int xc, int yc, int *p, double *c, int size, 
int fill)
  {
    graphic_glob *g = new graphic_glob(code);
  
!   g->point      = (struct xycoord *)malloc(sizeof(xycoord)*2);
!   g->nopoints   = 2;
!   g->point[0].x = p[0] ;
!   g->point[0].y = p[1] ;
!   g->point[1].x = p[2] ;
!   g->point[1].y = p[3] ;
!   g->xc         = xc;
!   g->yc         = yc;
!   g->size       = size;
!   g->fill       = fill;
! 
!   assign_min_max_for_arc(g, p, c);
! 
!   if (is_in_graphic) {
!     region_lines.add(g);
!   } else {
!     lines.add(g);
!   }
! }
! 
! 
! void page::add_polygon (int code, int np, int *p, int oh, int ov, int size, 
int fill)
! {
!   graphic_glob *g = new graphic_glob(code);
!   int           j = 0;
!   int           i;
! 
!   g->point      = (struct xycoord *)malloc(sizeof(xycoord)*np/2);
!   g->nopoints   = np/2;
! 
!   for (i=0; i<g->nopoints; i++) {
!     g->point[i].x = p[j];
!     j++;
!     g->point[i].y = p[j];
!     j++;
!   }
!   // now calculate min/max
!   g->minh = g->point[0].x;
!   g->minv = g->point[0].y;
!   g->maxh = g->point[0].x;
!   g->maxv = g->point[0].y;
!   for (i=1; i<g->nopoints; i++) {
!     g->minh = min(g->minh, g->point[i].x);
!     g->minv = min(g->minv, g->point[i].y);
!     g->maxh = max(g->maxh, g->point[i].x);
!     g->maxv = max(g->maxv, g->point[i].y);
!   }
    g->size = size;
+   g->xc   = oh;
+   g->yc   = ov;
+   g->fill = fill;
  
    if (is_in_graphic) {
      region_lines.add(g);
***************
*** 552,557 ****
--- 698,764 ----
    }
  }
  
+ void page::add_spline (int code, int xc, int yc, int np, int *p, int size, 
int fill)
+ {
+   graphic_glob *g = new graphic_glob(code);
+   int           j = 0;
+   int           i;
+ 
+   g->point      = (struct xycoord *)malloc(sizeof(xycoord)*np/2);
+   g->nopoints   = np/2;
+ 
+   for (i=0; i<g->nopoints; i++) {
+     g->point[i].x = p[j];
+     j++;
+     g->point[i].y = p[j];
+     j++;
+   }
+   // now calculate min/max
+   g->minh = min(g->point[0].x, g->point[0].x/2);
+   g->minv = min(g->point[0].y, g->point[0].y/2);
+   g->maxh = max(g->point[0].x, g->point[0].x/2);
+   g->maxv = max(g->point[0].y, g->point[0].y/2);
+ 
+   /* tnum/tden should be between 0 and 1; the closer it is to 1
+      the tighter the curve will be to the guiding lines; 2/3
+      is the standard value */
+   const int tnum = 2;
+   const int tden = 3;
+ 
+   for (i=1; i<g->nopoints-1; i++) {
+     g->minh = min(g->minh, g->point[i].x*tnum/(2*tden));
+     g->minv = min(g->minv, g->point[i].y*tnum/(2*tden));
+     g->maxh = max(g->maxh, g->point[i].x*tnum/(2*tden));
+     g->maxv = max(g->maxv, g->point[i].y*tnum/(2*tden));
+ 
+     g->minh = min(g->minh, 
g->point[i].x/2+(g->point[i+1].x*(tden-tden))/(2*tden));
+     g->minv = min(g->minv, 
g->point[i].y/2+(g->point[i+1].y*(tden-tden))/(2*tden));
+     g->maxh = max(g->maxh, 
g->point[i].x/2+(g->point[i+1].x*(tden-tden))/(2*tden));
+     g->maxv = max(g->maxv, 
g->point[i].y/2+(g->point[i+1].y*(tden-tden))/(2*tden));
+ 
+     g->minh = min(g->minh, (g->point[i].x-g->point[i].x/2) + 
g->point[i+1].x/2);
+     g->minv = min(g->minv, (g->point[i].y-g->point[i].y/2) + 
g->point[i+1].y/2);
+     g->maxh = max(g->maxh, (g->point[i].x-g->point[i].x/2) + 
g->point[i+1].x/2);
+     g->maxv = max(g->maxv, (g->point[i].y-g->point[i].y/2) + 
g->point[i+1].y/2);
+   }
+   i = g->nopoints-1;
+ 
+   g->minh = min(g->minh, (g->point[i].x-g->point[i].x/2)) + xc;
+   g->minv = min(g->minv, (g->point[i].y-g->point[i].y/2)) + yc;
+   g->maxh = max(g->maxh, (g->point[i].x-g->point[i].x/2)) + xc;
+   g->maxv = max(g->maxv, (g->point[i].y-g->point[i].y/2)) + yc;
+ 
+   g->size = size;
+   g->xc   = xc;
+   g->yc   = yc;
+   g->fill = fill;
+ 
+   if (is_in_graphic) {
+     region_lines.add(g);
+   } else {
+     lines.add(g);
+   }
+ }
  
  /*
   *  the classes and methods for simple_output manipulation
***************
*** 859,869 ****
    simple_output html;
    simple_output troff;
    int           res;
- #if defined(USE_FIG2DEV)
-   int           fig2dev_res;
- #else
    int           postscript_res;
- #endif
    int           space_char_index;
    int           no_of_printed_pages;
    int           paper_length;
--- 1066,1072 ----
***************
*** 910,964 ****
    struct text_glob    *start_text;
  
  
!   void flush_sbuf               ();
!   void set_style                (const style &);
!   void set_space_code           (unsigned char c);
!   void do_exec                  (char *, const environment *);
!   void do_import                (char *, const environment *);
!   void do_def                   (char *, const environment *);
!   void do_mdef                  (char *, const environment *);
!   void do_file                  (char *, const environment *);
!   void set_line_thickness       (const environment *);
!   void change_font              (text_glob *g, int is_to_html);
!   void position_text            (text_glob *g, int is_to_html);
!   void flush_font               (void);
!   void flush_page               (void);
!   void display_word             (text_glob *g, int is_to_html);
!   void display_line             (graphic_glob *g, int is_to_html);
!   void calculate_margin         (void);
!   void traverse_page_regions    (void);
!   void dump_page                (void);
!   int  is_within_region         (graphic_glob *g);
!   int  is_within_region         (text_glob *t);
!   int  is_less                  (graphic_glob *g, text_glob *t);
!   void display_globs            (int is_to_html);
!   void html_change_font         (const char *fontname, int size);
!   void html_position_text       (text_glob *g);
!   void html_position_region     (void);
!   void troff_change_font        (const char *fontname, int size, int font_no);
!   void troff_position_text      (text_glob *g);
!   void convert_to_gif           (char *name);
!   void write_title              (int in_head);
!   void find_title               (void);
!   int  is_bold                  (text_glob *g);
!   void write_header             (void);
!   void determine_header_level   (void);
!   void build_header             (text_glob *g);
!   int  is_whole_line_bold       (text_glob *g);
!   int  processed_header         (text_glob *g);
!   void make_new_gif_name        (void);
!   void create_temp_name         (char *name, char *extension);
!   void calculate_region_margins (region_glob *r);
!   void remove_redundant_regions (void);
!   void remove_duplicate_regions (void);
!   void move_region_to_page      (void);
!   void calculate_region_range   (graphic_glob *r);
!   void flush_graphic            (void);
!   void write_string             (graphic_glob *g, int is_to_html);
!   void prologue                 (void);
!   int  gs_x                     (int x);
!   int  gs_y                     (int y);
!   void display_regions          (void);
  
  public:
    html_printer();
--- 1113,1176 ----
    struct text_glob    *start_text;
  
  
!   void  flush_sbuf               ();
!   void  set_style                (const style &);
!   void  set_space_code           (unsigned char c);
!   void  do_exec                  (char *, const environment *);
!   void  do_import                (char *, const environment *);
!   void  do_def                   (char *, const environment *);
!   void  do_mdef                  (char *, const environment *);
!   void  do_file                  (char *, const environment *);
!   void  set_line_thickness       (const environment *);
!   void  change_font              (text_glob *g, int is_to_html);
!   void  terminate_current_font   (void);
!   void  flush_font               (void);
!   void  flush_page               (void);
!   void  display_word             (text_glob *g, int is_to_html);
!   void  html_display_word        (text_glob *g);
!   void  troff_display_word       (text_glob *g);
!   void  display_line             (graphic_glob *g, int is_to_html);
!   void  display_fill             (graphic_glob *g);
!   void  calculate_margin         (void);
!   void  traverse_page_regions    (void);
!   void  dump_page                (void);
!   int   is_within_region         (graphic_glob *g);
!   int   is_within_region         (text_glob *t);
!   int   is_less                  (graphic_glob *g, text_glob *t);
!   void  display_globs            (int is_to_html);
!   void  move_horizontal          (text_glob *g);
!   void  write_html_font_face     (const char *fontname, const char *left, 
const char *right);
!   void  write_html_font_type     (const char *fontname, const char *left, 
const char *right);
!   void  html_change_font         (text_glob *g, const char *fontname, int 
size);
!   char *html_position_text (text_glob *g);
!   void  html_position_region     (void);
!   void  troff_change_font        (const char *fontname, int size, int 
font_no);
!   void  troff_position_text      (text_glob *g);
!   int   is_on_same_line          (text_glob *g);
!   int   looks_like_subscript     (text_glob *g);
!   int   looks_like_superscript   (text_glob *g);
!   void  convert_to_gif           (char *name);
!   void  write_title              (int in_head);
!   void  find_title               (void);
!   int   is_bold                  (text_glob *g);
!   void  write_header             (void);
!   void  determine_header_level   (void);
!   void  build_header             (text_glob *g);
!   int   is_whole_line_bold       (text_glob *g);
!   int   processed_header         (text_glob *g);
!   void  make_new_gif_name        (void);
!   void  create_temp_name         (char *name, char *extension);
!   void  calculate_region_margins (region_glob *r);
!   void  remove_redundant_regions (void);
!   void  remove_duplicate_regions (void);
!   void  move_region_to_page      (void);
!   void  calculate_region_range   (graphic_glob *r);
!   void  flush_graphic            (void);
!   void  write_string             (graphic_glob *g, int is_to_html);
!   void  prologue                 (void);
!   int   gs_x                     (int x);
!   int   gs_y                     (int y);
!   void  display_regions          (void);
  
  public:
    html_printer();
***************
*** 1021,1031 ****
      paper_length = 11*font::res;
    page_contents   = new page;
  
- #if defined(USE_FIG2DEV)
-   fig2dev_res  = 1200;
- #else
    postscript_res = 72000;
- #endif
  }
  
  
--- 1233,1239 ----
***************
*** 1068,1082 ****
        if (sbuf_len < SBUF_SIZE - 1 && env->hpos >= sbuf_end_hpos
          && (sbuf_kern == 0 || sbuf_end_hpos - sbuf_kern != env->hpos)) {
        if (sbuf_space_code < 0) {
!         if (auto_on) {
!           sbuf_space_code = ' ';
!           sbuf_space_count++;
!           sbuf_space_width = env->hpos - sbuf_end_hpos;
!           sbuf_end_hpos = env->hpos + w + sbuf_kern;
!           sbuf[sbuf_len++] = ' ';
!           sbuf[sbuf_len++] = code;
!           return;
!         }
        } else {
          int diff = env->hpos - sbuf_end_hpos - sbuf_space_width;
          if (diff == 0) {
--- 1276,1290 ----
        if (sbuf_len < SBUF_SIZE - 1 && env->hpos >= sbuf_end_hpos
          && (sbuf_kern == 0 || sbuf_end_hpos - sbuf_kern != env->hpos)) {
        if (sbuf_space_code < 0) {
! #if 0
!         sbuf_space_code = ' ';
!         sbuf_space_count++;
!         sbuf_space_width = env->hpos - sbuf_end_hpos;
!         sbuf_end_hpos = env->hpos + w + sbuf_kern;
!         sbuf[sbuf_len++] = ' ';
!         sbuf[sbuf_len++] = code;
!         return;
! #endif
        } else {
          int diff = env->hpos - sbuf_end_hpos - sbuf_space_width;
          if (diff == 0) {
***************
*** 1673,1696 ****
    }
  }
  
- #if defined(USE_FIG2DEV)
- void html_printer::convert_to_gif (char *name)
- {
-   char buffer[1024];
- 
-   sprintf(buffer, "fig2dev -Lgif %s %s.gif\n", name, gif_name);
-   if (debug_on) {
-     fprintf(stderr, "%s", buffer);
-   }
-   system(buffer);
-   sprintf(buffer, "/bin/rm -f %s\n", name);
-   if (debug_on) {
-     fprintf(stderr, "%s", buffer);
-   } else {
-     system(buffer);
-   }
- }
- #else
  void html_printer::convert_to_gif (char *name)
  {
    char buffer[1024];
--- 1881,1886 ----
***************
*** 1718,1738 ****
      system(buffer);
    }
  }
- #endif
  
  void html_printer::prologue (void)
  {
- #if defined(USE_FIG2DEV)
-   troff.put_string("#FIG 3.2\nLandscape\nFlush Left\nInches\nLetter\n");
-   troff.put_number(100);  // scaling
-   troff.put_string(".00\nSingle\n-2\n");
-   troff.put_number(fig2dev_res);
-   troff.put_string(" 2\n");   // resolution not used 2 upper left
- #else
    troff.put_string("x T ps\nx res ");
    troff.put_number(postscript_res);
    troff.put_string(" 1 1\nx init\np1\n");
- #endif
  }
  
  void html_printer::create_temp_name (char *name, char *extension)
--- 1908,1919 ----
***************
*** 1751,1757 ****
    int           r=font::res;
    int           something=FALSE;
  
!   output_style.f = 0;   // will force the style to be restated
  
    if (! is_to_html) {
      html_position_region();
--- 1932,1938 ----
    int           r=font::res;
    int           something=FALSE;
  
!   terminate_current_font();
  
    if (! is_to_html) {
      html_position_region();
***************
*** 1785,1791 ****
        t = page_contents->words.move_right_get_data();
      } else {
        if ((g == 0) || (t == 0)) {
!       // hmm nothing to print out anyway... which may happen
        } else if (is_less(g, t)) {
        if (is_within_region(g)) {
          display_line(g, is_to_html);
--- 1966,1972 ----
        t = page_contents->words.move_right_get_data();
      } else {
        if ((g == 0) || (t == 0)) {
!       // hmm nothing to print out...
        } else if (is_less(g, t)) {
        if (is_within_region(g)) {
          display_line(g, is_to_html);
***************
*** 1809,1815 ****
    
        html.put_string("<img src=\"");
        html.put_string(gif_name);
!       html.put_string(".gif\">\n");
  
        output_vpos = end_region_vpos;
        output_hpos = 0;
--- 1990,1996 ----
    
        html.put_string("<img src=\"");
        html.put_string(gif_name);
!       html.put_string(".gif\"><br>\n");
  
        output_vpos = end_region_vpos;
        output_hpos = 0;
***************
*** 1833,1839 ****
    find_title();
  
    traverse_page_regions();
! 
    // move onto a new page
  
    delete page_contents;
--- 2014,2022 ----
    find_title();
  
    traverse_page_regions();
!   terminate_current_font();
!   html.put_string("<br>\n");
!   
    // move onto a new page
  
    delete page_contents;
***************
*** 1895,1901 ****
  
    case 'H':  html.put_symbol("helvetica;");
               break;
!   case 'T':  html.put_symbol("roman;");   // roman does not work under 
netscape 4.0 ?!?
               break;
    default:   html.put_symbol("helvetica;");
               break;
--- 2078,2084 ----
  
    case 'H':  html.put_symbol("helvetica;");
               break;
!   case 'T':  html.put_symbol("roman;");
               break;
    default:   html.put_symbol("helvetica;");
               break;
***************
*** 1946,2026 ****
  }
  #endif
  
! void html_printer::html_change_font (const char *fontname, int size)
  {
!   char        buffer[1024];
  
-   html.put_string("<span style=\"font-family:");
  
    switch (fontname[0]) {
  
!   case 'C':  html.put_symbol("courier;");
!              break;
!   case 'H':  html.put_symbol("helvetica;");
!              break;
!   case 'T':  html.put_symbol("roman;");   // roman does not work under 
netscape 4.0 ?!?
!              break;
!   default:   html.put_symbol("helvetica;");
               break;
! 
    }
!   sprintf(buffer, "font-size: %dpt;", size);
!   html.put_symbol(buffer);
!   html.put_symbol("font-style:");
  
!   switch (fontname[1]) {
!     
!   case 'I':  html.put_symbol("italic;");
!              break;
!   case 'B':  html.put_symbol("bold;");
!              break;
!   default :  html.put_symbol("normal;");
!              break;
    }
-   html.put_string("\"></span>");
  }
  
  
! static struct figfonts {
!   int   num;
!   char *name;
! } fig_font_list[] = { {0, "TR"},
!                     {1, "TI"},
!                     {2, "TB"},
!                     {3, "TBI"},
!                     {12, "C"},
!                     {13, "CI"},
!                     {14, "CB"},
!                     {-1, ""}};
!       
! 
! void html_printer::change_font (text_glob *g, int is_to_html)
  {
!   if (output_style != g->text_style) {
!     int         size     = 
(font::res/(72*font::sizescale))*g->text_style.point_size;
!     if (g->text_style.f != 0) {
!       const char *fontname = g->text_style.f->get_name();
  
!       if (fontname == 0) {
!       fatal("no internalname specified for font");
!       }
!       output_style = g->text_style;  // remember style for next time
  
!       if (is_to_html) {
!       html_change_font(fontname, size);
!       } else {
!       troff_change_font(fontname, size, g->text_style.font_no);
!       }
      }
    }
  }
  
! void html_printer::position_text (text_glob *g, int is_to_html)
  {
    if (is_to_html) {
!     html_position_text(g);
    } else {
!     troff_position_text(g);
    }
  }
  
--- 2129,2245 ----
  }
  #endif
  
! static int convertSizeToHTML (int size)
  {
!   if (size < 6) {
!     return( 0 );
!   } else if (size < 8) {
!     return( 1 );
!   } else if (size < 10) {
!     return( 2 );
!   } else if (size < 12) {
!     return( 3 );
!   } else if (size < 14) {
!     return( 4 );
!   } else if (size < 16) {
!     return( 5 );
!   } else if (size < 18) {
!     return( 6 );
!   } else {
!     return( 7 );
!   }
! }
  
  
+ void html_printer::write_html_font_face (const char *fontname, const char 
*left, const char *right)
+ {
    switch (fontname[0]) {
  
!   case 'C':  html.put_string(left) ; html.put_string("tt"); 
html.put_string(right);
               break;
!   case 'H':  break;
!   case 'T':  break;
!   default:   break;
    }
! }
  
! 
! void html_printer::write_html_font_type (const char *fontname, const char 
*left, const char *right)
! {
!   if (strcmp(&fontname[1], "B") == 0) {
!     html.put_string(left) ; html.put_string("B"); html.put_string(right);
!   } else if (strcmp(&fontname[1], "I") == 0) {
!     html.put_string(left) ; html.put_string("I"); html.put_string(right);
!   } else if (strcmp(&fontname[1], "BI") == 0) {
!     html.put_string(left) ; html.put_string("EM"); html.put_string(right);
    }
  }
  
  
! void html_printer::html_change_font (text_glob *g, const char *fontname, int 
size)
  {
!   char        buffer[1024];
  
!   if (output_style.f != 0) {
!     const char       *oldfontname = output_style.f->get_name();
  
!     // firstly terminate the current font face and type
!     if ((oldfontname != 0) && (oldfontname != fontname)) {
!       write_html_font_face(oldfontname, "</", ">");
!       write_html_font_type(oldfontname, "</", ">");
      }
    }
+   if ((! g->is_raw_command) && (fontname != 0)) {
+     // now emit the size if it has changed
+     if ((output_style.f == 0) || (output_style.point_size != size)) {
+       sprintf(buffer, "<font size=%d>", convertSizeToHTML(size));
+       html.put_string(buffer);
+     }
+ 
+     // now emit the new font
+     write_html_font_face(fontname, "<", ">");
+   
+     // now emit the new font type
+     write_html_font_type(fontname, "<", ">");
+ 
+     output_style = g->text_style;  // remember style for next time
+   } else {
+     output_style.f = 0;   // no style at present
+   }
  }
  
! 
! void html_printer::change_font (text_glob *g, int is_to_html)
  {
    if (is_to_html) {
!     if (output_style != g->text_style) {
!       const char *fontname=0;
!       int   size=0;
! 
!       if ((! g->is_raw_command) && (g->text_style.f != 0)) {
!       fontname = g->text_style.f->get_name();
!       size     = (font::res/(72*font::sizescale))*g->text_style.point_size;
! 
!       html_change_font(g, fontname, size);
!       } else {
!       html_change_font(g, fontname, size);
!       }
!     }
    } else {
!     // is to troff
!     if (output_style != g->text_style) {
!       if (g->text_style.f != 0) {
!       const char *fontname = g->text_style.f->get_name();
!       int size             = 
(font::res/(72*font::sizescale))*g->text_style.point_size;
! 
!       if (fontname == 0) {
!         fatal("no internalname specified for font");
!       }
! 
!       troff_change_font(fontname, size, g->text_style.font_no);
!       output_style = g->text_style;  // remember style for next time
!       }
!     }
    }
  }
  
***************
*** 2041,2046 ****
--- 2260,2275 ----
    }
  }
  
+ void html_printer::terminate_current_font (void)
+ {
+   text_glob g;
+ 
+   // we create a dummy glob just so we can tell html_change_font not to start 
up
+   // a new font
+   g.is_raw_command = TRUE;
+   html_change_font(&g, "", 0);   
+ }
+ 
  void html_printer::write_header (void)
  {
    if (strlen(header.header_buffer) > 0) {
***************
*** 2049,2055 ****
      }
  
      if (cutoff_heading+2 > header.header_level) {
!       // firstly we generate a tag
        html.put_string("<a name=\"");
        html.put_string(header.header_buffer);
        html.put_string("\"></a>");
--- 2278,2287 ----
      }
  
      if (cutoff_heading+2 > header.header_level) {
!       // firstly we must terminate any font and type faces
!       terminate_current_font();
! 
!       // secondly we generate a tag
        html.put_string("<a name=\"");
        html.put_string(header.header_buffer);
        html.put_string("\"></a>");
***************
*** 2067,2079 ****
      }
      
      // and now we issue the real header
!     html.put_string("</pre><h");
      html.put_number(header.header_level);
      html.put_string(">");
      html.put_string(header.header_buffer);
      html.put_string("</h");
      html.put_number(header.header_level);
!     html.put_string("><p><pre>");
      header.written_header = TRUE;
    }
  }
--- 2299,2311 ----
      }
      
      // and now we issue the real header
!     html.put_string("</p><h");
      html.put_number(header.header_level);
      html.put_string(">");
      html.put_string(header.header_buffer);
      html.put_string("</h");
      html.put_number(header.header_level);
!     html.put_string("><p>");
      header.written_header = TRUE;
    }
  }
***************
*** 2183,2195 ****
          );
  }
  
! void html_printer::html_position_text (text_glob *g)
  {
    int  height;
    int  temp_vpos;
    int  r        =font::res;
  
!   if (output_vpos != g->minv) {
      // we have found a new line
      if (output_vpos == -1) {
        temp_vpos = g->minv;
--- 2415,2492 ----
          );
  }
  
! /*
!  *  move_horizontal - moves right into the position, g.
!  */
! 
! void html_printer::move_horizontal (text_glob *g)
! {
!   if (! g->is_raw_command) {
!     int w = g->text_style.f->get_space_width(g->text_style.point_size);
! 
!     if (w == 0) {
!       fatal("space width is zero");
!     }
!     if ((w <= g->minh-output_hpos) || (! is_punctuation(g->text_string, 
g->text_length))) {
!       html.put_string(" ");
!       output_hpos += 2*w; //  * 3 / 2;
!       while (output_hpos+w <= g->minh) {
!       html.put_string(" ");
!       output_hpos += w;
!       }
!       output_hpos = g->maxh+(output_hpos-g->minh);   /* --fixme-- */
!       output_vpos = g->minv;
!       change_font(g, TRUE);
!     }
!   }
! }
! 
! int html_printer::looks_like_subscript (text_glob *g)
! {
!   return(((output_vpos < g->minv) && (output_style.point_size != 0) &&
!         (output_style.point_size > g->text_style.point_size)));
! }
! 
! 
! int html_printer::looks_like_superscript (text_glob *g)
! {
!   return(((output_vpos > g->minv) && (output_style.point_size != 0) &&
!         (output_style.point_size > g->text_style.point_size)));
! }
! 
! 
! int html_printer::is_on_same_line (text_glob *g)
! {
!   if (strcmp(g->text_string, "speed") == 0) {
!     stop();
!   }
!   return( is_intersection(output_vpos, 
output_vpos+g->text_style.point_size*font::res/72, g->minv, g->maxv) );
! }
! 
! 
! char *html_printer::html_position_text (text_glob *g)
  {
    int  height;
    int  temp_vpos;
    int  r        =font::res;
+   char *postword=0;
+ 
+   if (is_on_same_line(g)) {
+     if (looks_like_subscript(g)) {
+ 
+       g->text_style.point_size = output_style.point_size;
+ 
+       html.put_string("<sub>");
+       postword = "</sub>";
+     } else if (looks_like_superscript(g)) {
  
!       g->text_style.point_size = output_style.point_size;
! 
!       html.put_string("<sup>");
!       postword = "</sup>";
!     }
!     move_horizontal(g);
!   } else {
      // we have found a new line
      if (output_vpos == -1) {
        temp_vpos = g->minv;
***************
*** 2200,2214 ****
      height = g->text_style.point_size*r/72;
  
      if (need_one_newline) {
!       // must put a new line out when using not using html auto formatting
!       html.put_string("\n");
      } else {
        need_one_newline = TRUE;
      }
!       
!     temp_vpos += height;
      while ((temp_vpos < g->minv) && (more_than_line_break(temp_vpos, g->minv, 
height))) {
!       html.put_string("\n");
        temp_vpos += height;
      }
      if (! processed_header(g)) {
--- 2497,2510 ----
      height = g->text_style.point_size*r/72;
  
      if (need_one_newline) {
!       html.put_string("<br>\n");
!       temp_vpos += height;
      } else {
        need_one_newline = TRUE;
      }
!     
      while ((temp_vpos < g->minv) && (more_than_line_break(temp_vpos, g->minv, 
height))) {
!       html.put_string("<br>\n");
        temp_vpos += height;
      }
      if (! processed_header(g)) {
***************
*** 2217,2254 ****
        html.put_float(((double)(g->minh-left_margin_indent)/((double)r)));
        html.put_string("in;\"></span>");
        }
      }
-   } else {
-     // continuation of same line
- #if 0
-     if (g->minh-output_hpos != 0) {
-       html.put_string("<span style=\" text-indent: ");
-       html.put_float(((double)(g->minh-output_hpos)/((double)r)));
-       html.put_string("in;\"></span>");
-     }
- #else
-     if (! g->is_raw_command) {
-       int w = g->text_style.f->get_space_width(g->text_style.point_size);
-       if (w == 0) {
-       fatal("space width is zero");
-       }
-       if ((w <= g->minh-output_hpos) || (! is_punctuation(g->text_string, 
g->text_length))) {
-       html.put_string(" ");
-       output_hpos += 2*w; //  * 3 / 2;
-       while (output_hpos+w <= g->minh) {
-         html.put_string(" ");
-         output_hpos += w;
-       }
-       //      output_hpos = g->maxh+(g->minh-output_hpos);
-       output_hpos = g->maxh+(output_hpos-g->minh);
-       output_vpos = g->minv;
-       return;
-       }
-     }
- #endif
    }
    output_vpos = g->minv;
    output_hpos = g->maxh;
  }
  
  
--- 2513,2524 ----
        html.put_float(((double)(g->minh-left_margin_indent)/((double)r)));
        html.put_string("in;\"></span>");
        }
+       change_font(g, TRUE);
      }
    }
    output_vpos = g->minv;
    output_hpos = g->maxh;
+   return( postword );
  }
  
  
***************
*** 2269,2276 ****
  
        height = output_style.point_size*r/72;
        if (need_one_newline) {
!       // must put a new line out when using not using html auto formatting
!       html.put_string("\n");
        } else {
        need_one_newline = TRUE;
        }
--- 2539,2545 ----
  
        height = output_style.point_size*r/72;
        if (need_one_newline) {
!       html.put_string("<br>\n");
        } else {
        need_one_newline = TRUE;
        }
***************
*** 2300,2342 ****
  }
  
  
- #if defined(USE_FIG2DEV)
- void html_printer::troff_position_text (text_glob *g)
- {
-   int         i;
-   int         font_index=0;
- 
-   if (g->is_raw_command) {
-     font_index = 1;
-   } else {
-     const char *fontname   = g->text_style.f->get_name();
-  
-     for (i=0; fig_font_list[i].num != -1; i++) {
-       if (strcmp(fontname, fig_font_list[i].name) == 0) {
-       font_index = i;
-       }
-     }
-   }
-   troff.put_string("4 0 0 100 0 ");
-   troff.put_number(font_index);
-   troff.put_string(" ");
-   troff.put_number((font::res/(72*font::sizescale))*g->text_style.point_size);
-   troff.put_string(" 0.0 4 ");
-   troff.put_number((g->maxv-g->minv)*fig2dev_res/100);
-   troff.put_string(" ");
-   troff.put_number((g->maxh-g->minh)*fig2dev_res/100);
-   troff.put_string(" ");
-   troff.put_number((g->minh)*fig2dev_res/100);
-   troff.put_string(" ");
-   troff.put_number((g->maxv-start_region_vpos)*fig2dev_res/100);
-   troff.put_string(" ");
- }
- 
- void html_printer::troff_change_font (const char *fontname, int size)
- {
- }
- #else
- 
  /*
   *  gs_x - translate and scale the x axis
   */
--- 2569,2574 ----
***************
*** 2363,2368 ****
--- 2595,2602 ----
  
  void html_printer::troff_position_text (text_glob *g)
  {
+   change_font(g, FALSE);
+ 
    troff.put_string("V");
    troff.put_number(gs_y(g->maxv));
    troff.put_string("\n");
***************
*** 2384,2390 ****
    troff.put_number(size*1000);
    troff.put_string("\n");
  }
! #endif
  
  void html_printer::set_style(const style &sty)
  {
--- 2618,2624 ----
    troff.put_number(size*1000);
    troff.put_string("\n");
  }
! 
  
  void html_printer::set_style(const style &sty)
  {
***************
*** 2400,2469 ****
  void html_printer::end_of_line()
  {
    flush_sbuf();
!   if (auto_on) {
!     output_hpos = -1;
!   }
! #if 0
!   // this ensures that we do an absolute motion to the beginning of a line
!   output_vpos = output_hpos = -1;
! #endif
  }
  
- void html_printer::display_word (text_glob *g, int is_to_html)
- {
-   // remember we don't know the font for an html command, this could be fixed 
(--fixme--)
-   change_font(g, is_to_html);
  
!   position_text(g, is_to_html);
  
    if (! header.written_header) {
!     if (is_to_html) {
!       if (g->is_raw_command) {
!       html.put_string((char *)g->text_string);
!       } else {
!       html.html_write_string((char *)g->text_string);
!       }
      } else {
! #if defined(USE_FIG2DEV)
!       troff.put_string((const char *)g->text_string);
!       troff.put_string("\\001\n");
! #else
!       if (g->is_raw_command) {
!       int l=strlen((char *)g->text_string);
!       if (l == 1) {
!         troff.put_string("c");
!         troff.put_string((char *)g->text_string);
!         troff.put_string("\n");
!       } else if (l > 1) {
!         troff.put_string("C");
!         troff.put_translated_char((char *)g->text_string);
!         troff.put_string("\n");
!       }
!       } else {
!       troff.put_string("t");
!       troff.put_translated_string((const char *)g->text_string);
!       troff.put_string("\n");
!       }
! #endif
      }
    }
    header.written_header = FALSE;
  }
  
  
  /*
   *  this information may be better placed inside some of the font files
   *  in devhtml - however one must bare in mind that we need the ability
!  *  to write out to TWO devices (gif and html) and gif (fig) actually
!  *  invokes ghostscript. Ideally we should move to ditroff codes - fairly
!  *  easy - and then emit unicode for html and ?unicode? for fig2dev.
!  *
!  *  Currently fig2dev doesn't understand unicode, so we could pragmatically
!  *  generate troff output and run it through groff -Tps and ghostscript..
!  *
!  *  I believe this would work fine - but it is quite alot of work - it maybe
!  *  easier to make fig2dev support unicode - especially if someone else does
!  *  the work!
   */
  
  simple_output &simple_output::html_write_string (const char *s)
--- 2634,2698 ----
  void html_printer::end_of_line()
  {
    flush_sbuf();
!   output_hpos = -1;
  }
  
  
! void html_printer::html_display_word (text_glob *g)
! {
!   char *postword=html_position_text(g);
  
    if (! header.written_header) {
!     if (g->is_raw_command) {
!       html.put_string((char *)g->text_string);
      } else {
!       html.html_write_string((char *)g->text_string);
!     }
!     if (postword != 0) {
!       html.put_string(postword);
      }
    }
    header.written_header = FALSE;
  }
  
  
+ void html_printer::troff_display_word (text_glob *g)
+ {
+   troff_position_text(g);
+   if (g->is_raw_command) {
+     int l=strlen((char *)g->text_string);
+     if (l == 1) {
+       troff.put_string("c");
+       troff.put_string((char *)g->text_string);
+       troff.put_string("\n");
+     } else if (l > 1) {
+       troff.put_string("C");
+       troff.put_translated_char((char *)g->text_string);
+       troff.put_string("\n");
+     }
+   } else {
+     troff_position_text(g);
+     troff.put_string("t");
+     troff.put_translated_string((const char *)g->text_string);
+     troff.put_string("\n");
+   }
+ }
+ 
+ void html_printer::display_word (text_glob *g, int is_to_html)
+ {
+   if (is_to_html) {
+     html_display_word(g);
+   } else {
+     troff_display_word(g);
+   }
+ }
+ 
+ 
  /*
   *  this information may be better placed inside some of the font files
   *  in devhtml - however one must bare in mind that we need the ability
!  *  to write out to TWO devices (gif and html) and gif
!  *  invokes ghostscript.
   */
  
  simple_output &simple_output::html_write_string (const char *s)
***************
*** 2484,2591 ****
    return *this;
  }
  
  
! #if defined(USE_FIG2DEV)
! void html_printer::display_line (graphic_glob *g, int is_to_html)
  {
!   if (is_to_html) {
!     fatal("cannot emit lines in html");
!   }
!   if (g->code == 'l') {
!     // straight line
!     troff.put_string("2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2\n");
!     troff.put_number(g->x1*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number((g->y1-start_region_vpos)*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number(g->x2*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number((g->y2-start_region_vpos)*fig2dev_res/100);
!     troff.put_string("\n");
!     // printf("line %c %d %d %d %d size %d\n", (char)g->code, g->x1, g->y1, 
g->x2, g->y2, g->size);
!   } else if ((g->code == 'c') || (g->code == 'C') || (g->code == 'e') || 
(g->code == 'E')) {
!     // circle defined by radius 1 3 0
!     //                      thickness
!     //                      | color
!     //                      | | bg
!     //                      | | | depth
!     //                      | | | |   style
!     //                      v v v v   v
!     troff.put_string("1 3 0 1 0 7 100 0");
!     if ((g->code == 'c') || (g->code == 'e')) {
!       // not filled
!       troff.put_string(" -1 ");
!     } else {
!       // filled in black
!       troff.put_string(" 0 ");
!     }
!     //                style
!     //                |     direction
!     //                |     | x axis
!     //                v     v v
!     troff.put_string("0.000 1 0.0000 ");
!     int xradius = (g->maxh - g->minh) / 2;
!     int yradius = (g->maxv - g->minv) / 2;
!     // center of circle or elipse
!     troff.put_number((g->minh+xradius)*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number((g->minv+yradius-start_region_vpos)*fig2dev_res/100);
!     troff.put_string(" ");
!     // radius x and y
!     troff.put_number(xradius*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number(yradius*fig2dev_res/100);
!     troff.put_string(" ");
!     // first and last point the user entered, we fabricate these values of 
course
!     // first would be the center
!     troff.put_number((g->minh+xradius)*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number((g->minv+yradius-start_region_vpos)*fig2dev_res/100);
!     // the last is say the left edge
!     troff.put_string(" ");
!     troff.put_number((g->minh)*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number((g->minv+xradius-start_region_vpos)*fig2dev_res/100);
!     troff.put_string("\n");
!     // that is it
!   } else if (g->code == 'a') {
!     // arc
!     //                  open ended
!     //                  | style solid
!     //                  | | thickness
!     //                  | | | color
!     //                  | | | | bg
!     //                  | | | | | depth
!     //                  | | | | | |   style
!     //                  | | | | | |   |  no fill
!     //                  | | | | | |   |  | style_val
!     //                  | | | | | |   |  | |
!     //                  | | | | | |   |  | |  
!     //                  v v v v v v   v  v v    
!     troff.put_string("5 1 0 1 0 7 100 0 -1 0.000 0 0 0 0 ");
!     // center of arc
!     troff.put_float(((float)(g->xc)*fig2dev_res)/100.0);
!     troff.put_string(" ");
!     troff.put_float(((float)(g->yc-start_region_vpos)*fig2dev_res)/100.0);
!     troff.put_string(" ");
!     // first point
!     troff.put_number((g->x1)*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number((g->y1-start_region_vpos)*fig2dev_res/100);
!     troff.put_string(" ");
!     // second point
!     troff.put_number((g->x2)*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number((g->y2-start_region_vpos)*fig2dev_res/100);
!     troff.put_string(" ");
!     // third point
!     troff.put_number((g->x3)*fig2dev_res/100);
!     troff.put_string(" ");
!     troff.put_number((g->y3-start_region_vpos)*fig2dev_res/100);
!     troff.put_string("\n");
!   }
  }
! #else
  /*
   *  display_line - displays a line using troff format
   */
--- 2713,2729 ----
    return *this;
  }
  
+ /*
+  *  display_fill - generates a troff format fill command
+  */
  
! void html_printer::display_fill (graphic_glob *g)
  {
!   troff.put_string("Df ") ;
!   troff.put_number(g->fill);
!   troff.put_string(" 0\n");
  }
! 
  /*
   *  display_line - displays a line using troff format
   */
***************
*** 2599,2617 ****
      // straight line
  
      troff.put_string("V");
!     troff.put_number(gs_y(g->y1));
      troff.put_string("\n");
  
      troff.put_string("H");
!     troff.put_number(gs_x(g->x1));
      troff.put_string("\n");
  
      troff.put_string("Dl ");
!     troff.put_number((g->x2-g->x1)*postscript_res/font::res);
      troff.put_string(" ");
!     troff.put_number((g->y2-g->y1)*postscript_res/font::res);
      troff.put_string("\n");
!     // printf("line %c %d %d %d %d size %d\n", (char)g->code, g->x1, g->y1, 
g->x2, g->y2, g->size);
    } else if ((g->code == 'c') || (g->code == 'C')) {
      // circle
  
--- 2737,2758 ----
      // straight line
  
      troff.put_string("V");
!     troff.put_number(gs_y(g->point[0].y));
      troff.put_string("\n");
  
      troff.put_string("H");
!     troff.put_number(gs_x(g->point[0].x));
      troff.put_string("\n");
  
+     display_fill(g);
+ 
      troff.put_string("Dl ");
!     troff.put_number((g->point[1].x-g->point[0].x)*postscript_res/font::res);
      troff.put_string(" ");
!     troff.put_number((g->point[1].y-g->point[0].y)*postscript_res/font::res);
      troff.put_string("\n");
!     // printf("line %c %d %d %d %d size %d\n", (char)g->code, g->point[0].x, 
g->point[0].y,
!     //                                         g->point[1].x, g->point[1].y, 
g->size);
    } else if ((g->code == 'c') || (g->code == 'C')) {
      // circle
  
***************
*** 2627,2632 ****
--- 2768,2775 ----
      troff.put_number(gs_x(g->minh));
      troff.put_string("\n");
  
+     display_fill(g);
+ 
      if (g->code == 'c') {
        troff.put_string("Dc ");
      } else {
***************
*** 2651,2656 ****
--- 2794,2801 ----
      troff.put_number(gs_x(g->minh));
      troff.put_string("\n");
  
+     display_fill(g);
+ 
      if (g->code == 'e') {
        troff.put_string("De ");
      } else {
***************
*** 2661,2669 ****
      troff.put_string(" ");
      troff.put_number(yradius*2*postscript_res/font::res);
      troff.put_string("\n");
    }
  }
- #endif
  
  
  void html_printer::flush_sbuf()
--- 2806,2885 ----
      troff.put_string(" ");
      troff.put_number(yradius*2*postscript_res/font::res);
      troff.put_string("\n");
+   } else if ((g->code == 'p') || (g->code == 'P')) {
+     // polygon
+     troff.put_string("V");
+     troff.put_number(gs_y(g->yc));
+     troff.put_string("\n");
+ 
+     troff.put_string("H");
+     troff.put_number(gs_x(g->xc));
+     troff.put_string("\n");
+ 
+     display_fill(g);
+ 
+     if (g->code == 'p') {
+       troff.put_string("Dp");
+     } else {
+       troff.put_string("DP");
+     }
+ 
+     int i;
+     for (i=0; i<g->nopoints; i++) {
+       troff.put_string(" ");
+       troff.put_number((g->point[i].x-g->xc)*postscript_res/font::res);
+       troff.put_string(" ");
+       troff.put_number((g->point[i].y-g->yc)*postscript_res/font::res);
+     }
+     troff.put_string("\n");
+   } else if (g->code == 'a') {
+     // arc
+     troff.put_string("V");
+     troff.put_number(gs_y(g->yc));
+     troff.put_string("\n");
+ 
+     troff.put_string("H");
+     troff.put_number(gs_x(g->xc));
+     troff.put_string("\n");
+ 
+     display_fill(g);
+ 
+     troff.put_string("Da");
+ 
+     int i;
+ 
+     for (i=0; i<g->nopoints; i++) {
+       troff.put_string(" ");
+       troff.put_number(g->point[i].x*postscript_res/font::res);
+       troff.put_string(" ");
+       troff.put_number(g->point[i].y*postscript_res/font::res);
+     }
+     troff.put_string("\n");
+   } else if (g->code == '~') {
+     // spline
+     troff.put_string("V");
+     troff.put_number(gs_y(g->yc));
+     troff.put_string("\n");
+ 
+     troff.put_string("H");
+     troff.put_number(gs_x(g->xc));
+     troff.put_string("\n");
+ 
+     display_fill(g);
+ 
+     troff.put_string("D~");
+ 
+     int i;
+ 
+     for (i=0; i<g->nopoints; i++) {
+       troff.put_string(" ");
+       troff.put_number(g->point[i].x*postscript_res/font::res);
+       troff.put_string(" ");
+       troff.put_number(g->point[i].y*postscript_res/font::res);
+     }
+     troff.put_string("\n");
    }
  }
  
  
  void html_printer::flush_sbuf()
***************
*** 2778,2784 ****
      if (np == 2) {
        page_contents->add_line(code,
                              env->hpos, env->vpos, env->hpos+p[0], 
env->vpos+p[1],
!                             env->size);
      } else {
        error("2 arguments required for line");
      }
--- 2994,3000 ----
      if (np == 2) {
        page_contents->add_line(code,
                              env->hpos, env->vpos, env->hpos+p[0], 
env->vpos+p[1],
!                             env->size, fill);
      } else {
        error("2 arguments required for line");
      }
***************
*** 2799,2817 ****
      }
  
    case 'P':
-     // fill_flag = 1;
      // fall through
    case 'p':
      {
- #if 0
-       if (fill_flag) {
-       fill_path();
-       } else {
-       set_line_thickness(env);
-       html.put_symbol("ST");
-       }
- #endif
- 
        if (np & 1) {
        error("even number of arguments required for polygon");
        break;
--- 3015,3023 ----
***************
*** 2820,2875 ****
        error("no arguments for polygon");
        break;
        }
!       // a polygon is a sequence of lines ?
        int oh=env->hpos;
        int ov=env->vpos;
  
!       if (np >= 1) {
!       int lh=p[0]+oh;
!       int lv=p[1]+ov;
!       int sh=oh;
!       int sv=ov;
!       page_contents->add_line('l',
!                               lh, lv, oh, ov, env->size);
! 
!       
!       for (int i = 2; i < np; i += 2) {
!         oh = lh+p[i];
!         ov = lv+p[i+1];
!         page_contents->add_line('l',
!                                  lh, lv, oh, ov, env->size);
!         lh = oh;
!         lv = ov;
!       }
!       page_contents->add_line('l',
!                                lh, lv, sh, sv, env->size);
        }
!       break;
      }
    case 'E':
-     // fill_flag = 1;
      // fall through
    case 'e':
      if (np != 2) {
        error("2 arguments required for ellipse");
        break;
      }
- #if 0
-     html.put_number(p[0])
-        .put_number(p[1])
-        .put_number(env->hpos + p[0]/2)
-        .put_number(env->vpos)
-        .put_symbol("DE");
-     if (fill_flag) {
-       fill_path();
- s    }
-     else {
-       set_line_thickness(env);
-       html.put_symbol("ST");
-     }
- #endif
      page_contents->add_line(code,
!                           env->hpos, env->vpos-p[1]/2, env->hpos+p[0], 
env->vpos+p[1]/2, env->size);
  
      break;
    case 'C':
--- 3026,3055 ----
        error("no arguments for polygon");
        break;
        }
!       // firstly lets add our current position to polygon
        int oh=env->hpos;
        int ov=env->vpos;
+       int i=0;
  
!       while (i<np) {
!       p[i+0] += oh;
!       p[i+1] += ov;
!       i      += 2;
        }
!       // now store polygon in page
!       page_contents->add_polygon(code, np, p, oh, ov, env->size, fill);
      }
+     break;
    case 'E':
      // fall through
    case 'e':
      if (np != 2) {
        error("2 arguments required for ellipse");
        break;
      }
      page_contents->add_line(code,
!                           env->hpos, env->vpos-p[1]/2, env->hpos+p[0], 
env->vpos+p[1]/2,
!                           env->size, fill);
  
      break;
    case 'C':
***************
*** 2883,2889 ****
        break;
        }
        page_contents->add_line(code,
!                             env->hpos, env->vpos-p[0]/2, env->hpos+p[0], 
env->vpos+p[0]/2, env->size);
      }
      break;
    case 'a':
--- 3063,3070 ----
        break;
        }
        page_contents->add_line(code,
!                             env->hpos, env->vpos-p[0]/2, env->hpos+p[0], 
env->vpos+p[0]/2,
!                             env->size, fill);
      }
      break;
    case 'a':
***************
*** 2892,2958 ****
        double c[2];
  
        if (adjust_arc_center(p, c)) {
!         // calculate circle radius
!         double radius=sqrt(c[0]*c[0]+ c[1]*c[1]);
! 
!         // calculate mid coordinates
!         double xv    =((double)(p[0]+p[2]))/2.0-c[0];
!         double yv    =((double)(p[1]+p[3]))/2.0-c[1];
!         double dist  =sqrt(xv*xv+yv*yv);
!         if (debug_on) {
!           printf("radius = %f, dist = %f  c[0] = %f, c[1] = %f, fx = %f, fy = 
%f\n",
!                  radius, dist, c[0], c[1], (double)p[0]+p[2], 
(double)p[1]+p[3]);
!         }
! 
!         // now scale xv, yv by radius/dist
! 
!         int xi = (int)((xv*radius)/dist);
!         int yi = (int)((yv*radius)/dist);
!         if (debug_on) {
!           printf("xv = %f, xi = %d\n", xv, xi);
!           printf("yv = %f, yi = %d\n", yv, yi);
!         }
! #if 1
!         page_contents->add_line('l',
!                                 env->hpos, env->vpos, env->hpos+p[2]+p[0], 
env->vpos+p[3]+p[1], env->size);
! #if 0
!         page_contents->add_line('l',
!                                 env->hpos, env->vpos, env->hpos+xi+c[0], 
env->vpos+yi+c[1], env->size);
! 
!         page_contents->add_line('l',
!                                 env->hpos+xi+c[0]  , env->vpos+yi+c[1],
!                                 env->hpos+p[2]+p[0], env->vpos+p[3]+p[1], 
env->size);
! #endif
! #else
!         page_contents->add_arc('a',
!                                env->hpos, env->vpos,
!                                env->hpos+p[2]+p[0], env->vpos+p[3]+p[1],
!                                env->hpos+p[2]+p[0], env->vpos+p[3]+p[1],
!                                env->hpos+c[0], env->hpos+c[1],
!                                env->size);
! 
!         //                             env->hpos+xi+c[0]  , env->vpos+yi+c[1],
! #endif
! #if 0
!         html.put_number(env->hpos + int(c[0]))
!           .put_number(env->vpos + int(c[1]))
!           .put_number(int(sqrt(c[0]*c[0] + c[1]*c[1])))
!           .put_float(degrees(atan2(-c[1], -c[0])))
!           .put_float(degrees(atan2(p[1] + p[3] - c[1], p[0] + p[2] - c[0])))
!           .put_symbol("DA");
! #endif
        } else {
!         // arc is really a line
!         page_contents->add_line('l',
!                                 env->hpos, env->vpos, env->hpos+p[0]+p[2], 
env->vpos+p[1]+p[3],
!                                 env->size);
        }
        } else {
        error("4 arguments required for arc");
        }
      }
      break;
- #if 0
    case '~':
      {
        if (np & 1) {
--- 3073,3088 ----
        double c[2];
  
        if (adjust_arc_center(p, c)) {
!         page_contents->add_arc('a', env->hpos, env->vpos, p, c, env->size, 
fill);
        } else {
!         // a straignt line
!         page_contents->add_line('l', env->hpos, env->vpos, p[0]+p[2], 
p[1]+p[3], env->size, fill);
        }
        } else {
        error("4 arguments required for arc");
        }
      }
      break;
    case '~':
      {
        if (np & 1) {
***************
*** 2963,2993 ****
        error("no arguments for spline");
        break;
        }
!       html.put_number(env->hpos)
!        .put_number(env->vpos)
!        .put_symbol("MT");
!       html.put_number(p[0]/2)
!        .put_number(p[1]/2)
!        .put_symbol("RL");
!       /* tnum/tden should be between 0 and 1; the closer it is to 1
!        the tighter the curve will be to the guiding lines; 2/3
!        is the standard value */
!       const int tnum = 2;
!       const int tden = 3;
!       for (int i = 0; i < np - 2; i += 2) {
!       html.put_number((p[i]*tnum)/(2*tden))
!          .put_number((p[i + 1]*tnum)/(2*tden))
!          .put_number(p[i]/2 + (p[i + 2]*(tden - tnum))/(2*tden))
!          .put_number(p[i + 1]/2 + (p[i + 3]*(tden - tnum))/(2*tden))
!          .put_number((p[i] - p[i]/2) + p[i + 2]/2)
!          .put_number((p[i + 1] - p[i + 1]/2) + p[i + 3]/2)
!          .put_symbol("RC");
!       }
!       html.put_number(p[np - 2] - p[np - 2]/2)
!        .put_number(p[np - 1] - p[np - 1]/2)
!        .put_symbol("RL");
!       set_line_thickness(env);
!       html.put_symbol("ST");
      }
      break;
    case 'f':
--- 3093,3099 ----
        error("no arguments for spline");
        break;
        }
!       page_contents->add_spline('~', env->hpos, env->vpos, np, p, env->size, 
fill);
      }
      break;
    case 'f':
***************
*** 3003,3026 ****
        }
        break;
      }
- #endif
  
    default:
      error("unrecognised drawing command `%1'", char(code));
      break;
    }
- #if 0
-   output_hpos = output_vpos = -1;
- #endif
  }
  
  
  void html_printer::begin_page(int n)
  {
    page_number            =  n;
!   html.begin_comment("Page:").comment_arg(itoa(page_number));
    no_of_printed_pages++;
!   html.comment_arg(itoa(no_of_printed_pages)).end_comment();
    output_style.f         =  0;
    output_space_code      = 32;
    output_draw_point_size = -1;
--- 3109,3128 ----
        }
        break;
      }
  
    default:
      error("unrecognised drawing command `%1'", char(code));
      break;
    }
  }
  
  
  void html_printer::begin_page(int n)
  {
    page_number            =  n;
!   html.begin_comment("Page:").comment_arg(itoa(page_number)).end_comment();;
    no_of_printed_pages++;
!   
    output_style.f         =  0;
    output_space_code      = 32;
    output_draw_point_size = -1;
***************
*** 3072,3082 ****
    fputs("<body>\n", stdout);
    write_title(FALSE);
    header.write_headings(stdout);
!   if (auto_on) {
!     fputs("<p>\n", stdout);
!   } else {
!     fputs("<pre>\n", stdout);
!   }
    {
      extern const char *version_string;
      html.begin_comment("Creator:")
--- 3174,3180 ----
    fputs("<body>\n", stdout);
    write_title(FALSE);
    header.write_headings(stdout);
!   fputs("<p>\n", stdout);
    {
      extern const char *version_string;
      html.begin_comment("Creator:")
***************
*** 3103,3113 ****
    html.end_line();
    html.copy_file(tempfp);
    putc('\n', stdout);
!   if (auto_on) {
!     fputs("\n</p>\n", stdout);
!   } else {
!     fputs("\n</pre>\n", stdout);
!   }
    fputs("</body>\n", stdout);
    fputs("</html>\n", stdout);
    fclose(tempfp);
--- 3201,3207 ----
    html.end_line();
    html.copy_file(tempfp);
    putc('\n', stdout);
!   fputs("\n</p>\n", stdout);
    fputs("</body>\n", stdout);
    fputs("</html>\n", stdout);
    fclose(tempfp);
***************
*** 3248,3253 ****
--- 3342,3351 ----
        fflush(stderr);
        break;
        }
+     case 'a':
+       auto_on = TRUE;
+       fprintf(stderr, "currently the automatic paragraph feature is not 
implemented\n");
+       break;
      case 'F':
        font::command_line_font_dir(optarg);
        break;
***************
*** 3265,3273 ****
        break;
      case '?':
        usage();
-       break;
-     case 'a':
-       auto_on = TRUE;
        break;
      default:
        assert(0);
--- 3363,3368 ----
diff -r -c groff-cvs/devhtml/TR groff-html/devhtml/TR
*** groff-cvs/devhtml/TR        Sun Sep 12 08:30:00 1999
--- groff-html/devhtml/TR       Fri Sep 24 19:52:12 1999
***************
*** 1,7 ****
  name TR
! spacewidth 5
  charset
! ---   5,1     0       040
  !     5,10    0       041
  "     6,10    0       042
  #     7,10    0       043
--- 1,7 ----
  name TR
! spacewidth 3
  charset
! ---   3,1     0       040
  !     5,10    0       041
  "     6,10    0       042
  #     7,10    0       043
Only in groff-html/devhtml/: TR~
Only in groff-html/tmac/: .#Makefile.sub.1.2
Only in groff-html/tmac/: .#eqnrc.1.1.1.1
diff -r -c groff-cvs/tmac/Makefile.sub groff-html/tmac/Makefile.sub
*** groff-cvs/tmac/Makefile.sub Mon Sep 13 07:18:22 1999
--- groff-html/tmac/Makefile.sub        Tue Sep 21 14:32:14 1999
***************
*** 2,8 ****
  
  NORMALFILES=tmac.andoc tmac.pic tmac.ps tmac.psnew tmac.psold tmac.pspic \
        tmac.psatk tmac.dvi tmac.tty tmac.tty-char tmac.X tmac.Xps tmac.latin1 \
!       tmac.lj4 eqnrc troffrc tmac.safer tmac.html
  SPECIALFILES=tmac.an tmac.s
  STRIPFILES=tmac.e tmac.doc tmac.doc.old
  MDOCFILES=doc-common doc-ditroff doc-nroff doc-syms
--- 2,8 ----
  
  NORMALFILES=tmac.andoc tmac.pic tmac.ps tmac.psnew tmac.psold tmac.pspic \
        tmac.psatk tmac.dvi tmac.tty tmac.tty-char tmac.X tmac.Xps tmac.latin1 \
!       tmac.lj4 eqnrc troffrc tmac.safer tmac.html tmac.arkup
  SPECIALFILES=tmac.an tmac.s
  STRIPFILES=tmac.e tmac.doc tmac.doc.old
  MDOCFILES=doc-common doc-ditroff doc-nroff doc-syms
Only in groff-html/tmac/: tmac.arkup
Only in groff-html/tmac/: tmac.arkup~
diff -r -c groff-cvs/tmac/tmac.html groff-html/tmac/tmac.html
*** groff-cvs/tmac/tmac.html    Sun Sep 12 08:30:11 1999
--- groff-html/tmac/tmac.html   Tue Sep 21 23:50:28 1999
***************
*** 43,92 ****
  .if !c\(aq .tr \(aq'
  .if '\*(.T'html' .char \[radicalex] \h'-\w'\(sr'u'\[radicalex]\h'\w'\(sr'u'
  .if !\n(_C .mso tmac.pspic
! .cp \n(_C
! .\"
! .\" some simple html additions to any macro set
! .\"
! .de HTML
! .if '\*(.T'html' \X^html:\\$*^
! ..
! .de HTMLINDEX
! .if '\*(.T'html' \X^index:\\$*^
! ..
! .\"
! .\"  LINK - $1 is the classical underlined blue text
! .\"         $2 is the textual reference within a document
! .\"         $3 is the URL without the textual reference within a document
! .\"
! .\"         example:  .LINK "a nice heading" "heading123"
! .\"
! .\"                    provides a link from "a nice heading" to the
! .\"                    textual name reference "heading123"
! .\"
! .\"                   .LINK "The GNU FSF" ""  "www.gnu.org"
! .\"
! .\"                    obvious - except notice a dummy second argument
! .\"         
! .\"
! .de LINK
! .HTML <a href="\\$3#\\$2">\\$1</a>
! ..
! .\"
! .\" TAG - generate an html name $1
! .\"
! .de TAG
! .HTML <a name="\\$1"></a>
! ..
! .\"
! .\" IMAGE - reference an image
! .\"
! .de IMAGE
! .   ie '\*(.T'html' \{\
! .      HTML <img src="\\$1" width=400>
! .   \}
! .   el \{\
! .      B1
! <img src=\\$1 width=400>
! .      B2
! .   \}
! ..
--- 43,46 ----
  .if !c\(aq .tr \(aq'
  .if '\*(.T'html' .char \[radicalex] \h'-\w'\(sr'u'\[radicalex]\h'\w'\(sr'u'
  .if !\n(_C .mso tmac.pspic
! .cp \n(_C
\ No newline at end of file
Only in groff-html/tmac/: tmac.html~
----------------------- uuencoded extra files -------------------------------
begin 644 extra-html-files.tar.gz
M'XL("!4O[3<"`V5X=')A+6AT;6PM9FEL97,N=&%R`.P\?W/;MI+Y-_H4B#L7
M4[(D2[*;-/[UGIO8J6X<)\]VKLVU&3V*!"4F%*F2E"RU=3_[[2X`$J`H67;B
MSO7F-+9$+H#%[F*QNU@"',31,!T%V_C5=)Q'#_%IMUK/=G?9(\98N_#+6&=W
M]]GS-F//GC_?Z73:SW=:4-KY]OFS1ZSUZ"_X3)+4CAE[-+#]2;*R'H^31__G
M/MO;K%%KL)=;6_A;V:ZQE]%X'ON#8<JLEU76?O'B!3N-.6>7D9=>VS%GI]$D
M=.W4C\(ZZX9.L\)J\,?8:Y0@>S,)`CYG%LGSGX/`'C5MISGY7&77<91R-A`*
M1RWZDY3Y*8NN><)L-IP,.+-'@!U`'O-=;@,X=%EL7S,G<CGSXFA$#?_3'D&3
MEX$=?V;6IT_./S\Y>-UTHE$5>address@hidden,address@hidden'5,7
M4-/SFI4*_6*!AXPFDM%]-H\FS+%#%G/address@hidden;4<Q&T6N[\T1``+A
M<24=<I;R>)0@;KQY??Z>O>8AC^V`O9OT`]]A9[[#PP3X!"address@hidden
MKI2(>9]Q'address@hidden'O6J3/HWK)3I#!FT1AK58&L.0MLH*`B*^JLY1RXS`^I
MOV$T!H*'address@hidden"M1\$K,\9Z+DW">HT-C]VKWYX^_Z*'9]_J/QX?'%Q?'[U81]J
MIL,(2OF4"SS^:address@hidden;(CNTPG2/[;TXN7OX`]8^_[YYUKSX`O973[M7YR>4E
M.WU[P8[9N^.+J^[+]V?'%^S=^XMW;R]/FHQ=<GZ+X"H>"1[DX_+4]H,$>/P`
MPY0`28'+AO:4PW`YW)\"03:address@hidden(&-")_99(BDAE7GY]MV'[OEK
M(+#KL3!*ZZ#+/JA"&F7CEDV/BCX]OGW!KCA(A[-W@>UPUF"7$VRXL].JL^^C
M),5*;XY9J]-NMQOMG=;S.GM_>=PDK?W&address@hidden<;`3MP<;address@hidden',UP`&J?
M)&:!D_`4(1J(C+M>Z2#U1[PY/,)*GLL]]L/Q?YWTWI]W+Z]>]7[0ZDU"4!L7
M:W[#0]!V'address@hidden)SMP=*K#KTV!/`YH?<M:XNWI]4*]^`A1<address@hidden&K/;A8;NJ
ML!DM3H_/+LTF!*$FK6I.@"Q\<_Q3[^KDS;O>^?&;$W(EK-WJ[!KEEU<7,&Z]
MLY/SUU<_,+;;>O$L1_"A=_K^U>N3WIOCB]?=<T*PU6I^MY-5.-[MO3N&"JHY
M0_+;S6<O=G<;9N-JUN9U][1W<7+)M,]W+:/T^[?'%Z].+GKONC^=G%T"S95*
M!7Q0"address@hidden>7\RZ,$D9^Q0"&!?+QY,>)*H8I*I43RRXX$?4GE9:WN21J)Q
M7JR7!T#DM>_"-#ADC?9^+JM7)Z?'[\^N>F?=\Y,?NZ]`&KNMQ^`LP)+P4;(-
M'KZ%.JO+'JLJT3WO9$6GW;,SD-I/#-M4*M/(=QG,@S&SJNSWFPH9:S3QZ)93
MLC4PC3U^S3Q[&N&L2X1-UYD&address@hidden
M`GS5?0#<,![`W#?+^K*L<F-V8<^6=W%T_RX4MW[22R;]A#MH-\!,B+J)F#30
MB]UN-NT.VG&4"/#;!T"address@hidden"U(MCN2='G?[P@>(`(`1^N#>P%SAF;O
M>LC)VZ3H,N$/#!Z9.<<&\YNS\<2R[#:*MUUE?_S!\.8(D8J;CE[2$2559-QD
M&@@!5[64;7`G&!-(YE5=(805(C"PKBL$&R*64!/%.(address@hidden(1F!V
MC/PTT47`K'*V2SAU_0%XV446G:$=VP[06X?+.LK;9E2W6<:9P&)A(address@hidden:%?4
M`)0=';+-UF:5/7U*MP=P^V*S0`UZSQZX_;"'address@hidden@TPZ0
MY'address@hidden/EB<^*L_&.SQ">WASTPZF&1G5(Z:+2F<G2F<K02_S=N\FKW$VO:
M;DP[U2,L+(B;M!4](U$_`G6.7`CN(')(TGF06Y!XXJ0"1%/4BZ`O^:EY.$?]
M',#8.(+;'G:W4(0M>V&T`!]R#*07P$D`8=)^I2`T08CX6-75Q41JC:13^*HN
M]`917FRGP/SA(2A%%":*YZ=51K?+6SQ9VN*&'`?`]O;HQZH"DCWF62T<J)M"
MH2!W+$?S-_$[E+>!^`TCA6)<K6O"MI+?X%Y(TAK")4G/address@hidden'*WL"address@hidden
MSXJ)PT.3A43RH.D3R!.%DS0]G#AYUP*8WU<>,ZP@:!&address@hidden)8`TJ50R1*"
MGJQ!T!.K1N87T:VKVS$&Q"$$A;"X<'P?EB*SU-!TM!J]?A`YGTG=>address@hidden
M9?>_3\#==[Y]QFY0$\BV9)_^!.?]SUCIXX*>X&address@hidden(70,ZJ&#49]1
M97+(WIY>6MECV`JTITY(,S42K(address@hidden@.!BQORY`!'LU&S7[8F0
M61A/F#N3,/$'(2V'<+#&$&3#XFG/9*<VY':1Q1HN/'1^J#O%D.P;.,*FQ!'6
address@hidden<#W')86%CG'\M%5H8!,"B`L9,T<;H2@(:address@hidden,Z!:IG
M(address@hidden;7$%`\+>#A(I;\A5W380H1&G2AP>T(A9&2$;*,&9RP(`(ST
MM<:-P8"0;"%P4K@:1XB>;address@hidden)62SI4M(C/H=:?5%\4Q'_
M&!JD(address@hidden"NN5AFVJ(address@hidden:2;B'!7R;%;N1[YGIW9@;80<&D`L
M`FLNP`X"*=;?D*$D?"GQ9ZRHR>E&FO@;1W)&YW4^0HOD9__COE8)X5M;`N*K
M"T%WHR$&2.JI`!ZUJC3L*"S7I2R('X*G!XT*)T$>Y&"=%61L_M+:W*\4B9!X
M,1,DK*-8&\"R'H=5"+JB!0=/C1Z47#[*(*%H1_FB)1V!'56V=&P/9`VTIZ`"
MB8]AI0`-8GL,PP\]#Q`FK*TP65B[-PBBOF&P-/,)T1R$(@GH1E:S!JL+[:Y/
address@hidden"4\!LY..4V)]]*Y6D=G1?V(%5)ORF.(O&SI;1$RA/74;^!!`694MF?%
address@hidden@U(E&(Y#"`I6XIA/6.(<J8,4,9$CCL!(!%]T/FCHJ13X7+(YJ+#A>
M=$\,V9S6D7[\]L,A79?6!'YB^UKQ)*Q[1O[>GL;)W0;A;J/P)<-`T5,N3*N6
M5.M,$Y\E?A104"CG;[5>4>*R=#*K0FR626A5B-32212PH642*?&:PK5THLDG
address@hidden:X(@X:!6(;PGZIE:address@hidden@M'50C]_&AUEP:-68YT)FF4!"JM.RVX<
M"=W#"U*_OH+T!:2ZD#.@"D-<0<JKY3D$B576Q2L];4'1WFSN1%'L,N6R9TKK
MYS)T(3,E+=A*2V6:*Z,%"L0$"*-EP'#!0K+%U&H/,_GE=7*[42C2C,?])_C,
MJ;address@hidden'PN,^Q)address@hidden,H&.N>\[Z/(BNR:89,J]1
MB[*^2I>/Z/#]("B#H[3$>.DRV=LS)"1GRGHSH4XX:>address@hidden<-7L
M]L]BOTK_16BDQZOX+$6`<]5<Q4-!0^[.D=9X/=8HGVI0M+Z2FYD7.=NSJ3L5
MZ:`,#D%P5H"IF86IGF6,Q*P4\<3BI"Q^]'KY]"E\_BROM6R"TU34FR#[QGT_
MGXK+IA\J+)9K[33IWH+]H61K$+,HE#MHG-`?`U^)E/45+(:1*X=2_U#ELD\^
M>I0W7Y9]<Y<4W35TH<^ZD4M>^9;`91WZ>_C(address@hidden)?T?ZDS%W?!M8T,/9OQ']
address@hidden)W)-.U<_LYDNG:NI6W%%7JWM;JU8X?=VJTCNY&_F%=T(YA8
M(%GGWCV/HV`^$(_&EO8<CO,>*>,A4YC1]-[=)N,22=_"<)&,.W8+:N%,<)]`
M3YBL$NM2]`T%/P&Z5VA*S4T?.;@5DV.#N8RCZP5DI9A6L32R/_->R-?$M(JF
MH9TLT7W#2<5K(;K&6/!V1'E^`Y,2KIW:E,_1'J^S`ZW1D?+[6<`*K9-?)W;,
M:>=)WT]']G@,address@hidden@$B=5"8,"I<AV(E$H97*-O
M6L"D2_F('OHLQT2E&B8]MUO\"/"address@hidden;E,ALFY\H9+<KKB1UGX0FGG))
MD$CI"$8'D0CM<9^-W8^F_!;AR>%1,@3<F'.-8CN>,]MQ)B.<<(8H<0DAF]TB
M3HE;address@hidden"JFJ$LF4]4LBL97GFM.6)9>+'!R_)=0H?)#P(5?ZQ90;48\^
M,:Q#2>_MX;=<=AAR5;LX*/2A*2OJ8TQR5_>WKN=;R^EE*Q6!GQUI:>E\13\X
MQ)1B!K"2NM3!IO8`09&M4B>ZQ\Z7I1HY!9(+Q!;3.D*"^UGJVY!OGM_650ZI
MLP:RC9$PD//:K%#<?;`0<#5H6UX8S,FR)BRA75)I1*$EUF2R9H*[!4)4.MRR
MACL%_!"?E2][-FRKR08ZQ</43^?RN;"I*B8U=PZ;[I1Q>[QVQBW7(4.)<-'Q
MQ)P%U?^EJD6;LH02%-7B1LN-+P2P*_5!UM3-LJX47T<A#'address@hidden'AS4T
MA<&D`.O+%A,D^4)P)Y_SZ5!+9ANQLLP+J.=]<&-AI[..R$92'E4KMF?%8LPV
MZ*V1U+G>>address@hidden:RY2F-1\XZ.\^?6Q^8,
address@hidden,V*X+G`)X7P&U9N[,`IMH9>)8OQ`Y92P+G94#:*:&`*K\)<!RG#"[RFY45
MBJ:'.;address@hidden<X"8N\5P6)<TARNI',QDQ
M(9T\!&\S%MLJ5FQL0HL%2.665=:?[V'address@hidden<$\(K2Y^;D&!>address@hidden,
M5)V-80!$,`>address@hidden/address@hidden(A3BT'NJ_A
MUY8#)-3P*UO:S*9M,7A(8_;T(`>V/^8U.PK8T6IFP)V\9ELJ!(EI"[K(JFLE
M<V=KGI?,.L4V\-_)VG6*[>"_HU95GA\G*?BM@,/<F21B4_>FX\=.P#=%6$N!
MN68@<"address@hidden,Z4<@?*&V`&>U!2E^Z(`C1,L+]'0W1RR9T$XZ'G.Q
M[:_/4_">[-J>HVMU(UK9B)WX7;@--U/V.80UB9\*A.-`[`F`<#^)1CP"HPIL
MLA$7U4"[-OP1;6/<$(LD;Q+2TRE)$%82&SYQ!P-PLXW;7!%='Y<`[L3!/?2A
MFVT_<+/=#6(]H';address@hidden<&S^P(address@hidden:NP*3LA05#
M?G0H/>M<7"NSH<9832A85_UK)W-IT+*CM>SH+<6ZF3L1<2A(Q(\VX)U]#:9&
MVW!^JI.#]?KH?$D?.B,'R_O87<!7<%:KB%^!=T="L=4,address@hidden(]1\K$T;8.6Q
M/EWV5>D"$8_S>5)address@hidden@HF.$N4+0E#BW6;7%,Y3<>address@hidden)F#
MU2K3^4HJ4P@;\G$8+H8<#Z%88G`.M+')U4P?JJ\S-A%:KVN?3M",(I"H-\'\
M#%E7/(X$ILP<HZ^DT//.HG!G[:address@hidden&JD2_#M96K_87J=?BH!9&<6&,OV10
M0V['X*&TH5PUAO<R?*5D/)BU6]GKZC'address@hidden'JRC5K=YNMV',EL/-LIW
MZ?6.*E#JF-:>"8^7Z,'C`KT=PWY_G9FSIC;=1X57RSO?XTH!HDR(UT(^Y7&-
M#?$Q0BB.Z7J8`G(CGN#OB-NX`Y*.!(E,-!U-BJ-PT&Q6-(1T;-=/1.YH'/.$
MXP(>#V+8'D_G\/.9RR!/address@hidden;A<address@hidden<,
MR&address@hidden"5Q'%$#^Q_"3<R6>!),TMC7I>.['9?RB2G:9K1-/U2FJ:"INDZ-$TS
MFJ;[2Q(IM`3\TJ>C]TJE/'@Z`]><I0D-7'>6IC1P[5F:U,#U9VE:8^:4Y37F
MSKT2&^4K=`N6Y#`"3O6!DA]%C5"/L;_LR?4=5:address@hidden/_+E"<<;Y?K
M#Q80:C0L%AY-8/Z!5FD?M[`K26?*X2NM^21WOG]2^]SU*O.R*C?Y^CE[F*[6
MST8BP5!J,address@hidden'=U4Q+5_<IB%#506U8-B6A5
M<[<B[Y9CS7W70.V(7<1ZHTT\8\K1M#T$M=4G+-Q/]2GYH%G&A><1I4GLN^W4
M^/]I]G6FF=35?-+4S3FT;>;P%QO,S0;S;?.90*:address@hidden/KJ'I"_&DO#R6@;
M(H90A5]]CJG`:PZ0%N7?8':+XRH1A!,8?T%$E49,AO'TVA$\A<A%;LZ9Q!"/
MJ?=YR'=4#":^B\=9Y"Z"SK:,*Q$3G5:"?FQ0BZD=3#BFG9DXE$BZA10J/ZU!
MD>1#MJ/K1-$.-=IWMD0UDH?5J2'^ZAWLTM*&MUFI%0U7VZR%AFLSN=W9RM7#
MW\((IF8AEH9`=1_^%W'.;\5YFVCN0^=M4KL+G:L$:address@hidden"^W5DM
M30/AO%$@>A'AW$!8(LHOH[!$CO>ED-8S(GS09F:E<E_98D]9\'P/46+[+,R^
MA^3,_N\N*-7_+>&&address@hidden/'VZL<4I1O&*A%TW2\01W)H3^6.XRDZ>^]?*]
M/>/6.NV>G;":)\,4/*WLC2U/;'$7[V.01ZQ".EX1B+,4G&/D8SOB:(7GSSBN
M./0S%2913XLT\+2';U12W8L(R,.SS)YP+H&*:>113SH&OW\[9GS1DX[:#[UQ
M_N23QDT>6+4<address@hidden@X)[$,%#L;=!.Q>#'.FG
M8JB#S5_"S:P/@VNFR5C!;NY.B-PM(]\S(/?(Z.<JUL<D;G$K%H=A+D%H<+F$
M1P]`B;5Q\*318!L%:%*LQ1J-HU_"O)HFGD7AW)&=/L?7(_TEW`BROP5+`Y$W
M3"8KN:]**7)S"G,YF'K%<B)O_AJ!2MIZ=CPH%:?8AX76-1>")F8Z#`_?;9$7
MTRU/=HY,,/%+J,E:\=`V.36%OW6HD-^#+V&I<OLFS>3O(M'#X]0*\64[+<S@
MAOB>G79+:$'>!I=,address@hidden/)9O^A$=%XP3\"C625\\B-BE>CF&/H:9
M=S!>^Y";address@hidden<)address@hidden>address@hidden(/$6&ZA8
M;>GI6U'address@hidden<;@E#-TO8\K^BT&_E!5^2<$>Q+Z%/9`1HKVT'
M=#9)$R?VQRGA%M2(?;APF1W-K^7U9,address@hidden,F?R,;WO`;C:V
M&C"M-["\_?SY!AX7W^"_(NA0W(PFJKS3_I9`Y^_/SNKBF_JNJ(<-N(DF9/8U
MOL"2#6WGL]S98J>X&3^E-7.F2'(;<[YG-0K3J"+.*NA4B](F>VF'HA=84[NX
MU4;L:Q5'-OB4L&'\D?P#D"`>C-#$>OZ:T[M!5-6Q>!&I"address@hidden'[[4WC1%'$J(
MT-QM9HB]L>LIT\*`0&2<#39J&<I7GRXPM,YH;,DMMTN;5HT7OI#-TM^[4VQ7
M4*;LF8BIJR6;3;.7DJA'6%I']W*TV%Z<^-9M/4FC/_%^;H,?Z9Y?]5YU7W>O
M+M&I4*XJD4]\H`IHZ7^XH*MAEJDS'!_4H`*-3FH$9=4%(]Z^)P->$-FI)1_W
MN$46.M]]%"_@,(address@hidden>C?A3<-8!8(PK2O.3J,&%-7L1A7M)V
M>J?9GGB+KR/>'8=$9&4&-_A^*>/5"KC?%!-RL&address@hidden>0V).,"`MM$>T
M0/TS[R,_&3<$:P)2G82X]R^DTNQ]&SHE$E9G.A"B-W&$E#$#CG8*>ZUG;P<-
M(^I2VOM<$#70/'ELHXQYM--:Y>QR;V]%.ZD"6CM/9L?S^F*NHS8\\1I'B,S*
M'J7+MU]Y^]JK,Q:65!Z-JT90.2WAB-;(",;+WPN-]"'1SC[I:+_*^#Q>8WRR
M58(TV1G&#:5<&Z:5IK>8Q@,!D_:5QW$4]_`]F[2J[MEJ:9MW*;K3SR)L_%OU
ML*D."(&8?YWX,1>N.1Y,<address@hidden)'WF7_%3P)S8
M(B61HN0XGK&.>6U'=ORLXWAC39+=R*.%2)#$FB(X`*EC\WH^^];1]P%2LIUY
M#_%)+!+HNZNKJZNK?I5>address@hidden'RA5(4L*E*4"QP.QFAC1&K991N^DK7I0]*D^
M"Y<IGT-W!EG5#[KC&Z\M#,9_.B^,6Q?T]#R#17J*H-!S9B7>NR&B0IOX1NCY
M\9N'4?R>ETI#U_;DB54S>=S9I0J7NRVO(98OGEFBW1D3IH`',#X\`3]7(T<K
M!#]A`%&X:6L=-J?%:3$\Q2Q`%M*=%.2J<7&)address@hidden
address@hidden,LFG4E"5)B/;3]-R`N6^5?5NP6(`)ME%-C&]6ON+LD3+&$&_]+ZV
M(#'#IYS!&!PQ%.*]N2BNL_E??7PMOW$"-BU`FJ&F$LADK7<V0:6K>4R4ZD]L
M"address@hidden:]$&D[M(!*1[-86SMMK><X5#*2*MPA_HLJD<V34(1]$AMZ?(!,DEJ
MM(%)=CX;address@hidden)XHO_0D(>#[TDZ(5%9"PYV"AXN;address@hidden
M`M6D,QH_"9M&4*#J\WOR[MG?7IS6`X-6*%*J=`%L4$QP.K'9H?&&,/Q.Q]#A
M2(*+^"M4BM7DY$$B'//:%'T,-5&;`E&/5TC&($W!!!^R<address@hidden)$1"0=_8[
MIAK]UBY4O`WW7KR\J'LY0""V&BACVM9/8?OL?YAF5;R<9<DDH)5RR23RD9VS
MADU`CXK/(!M6'KEM\&F;Q:;(T""MBR,<(1+J/4[NZ_C8Y`+R%QUP3,R=#2H+
M)8L,#1O\,<J&\U.!M8_K,$0?%$-E62(Z<address@hidden<XBBQ
M&@'GG;`HX<W'WWMY08H+J\CB,Y.$21"79FT91H)P"?W%''&\!,,7B)&D5K(M
M9;@Q$LY!IS*0*!.9:LZ(Q&J?&address@hidden:`*V,6JY$0V)+:30Y&V
MF<->!7TCSZ`XS:ZR$.J-Q"GFVK+I15X64Y1#Z$1EY,\1:6)^^_P8`.13ZC\/
M%K!Z?HJQ<MO\..8V+[)G*98/address@hidden<U[0(=4H0&+<PF2S2"3+
M<D&ZF-C\BB()`^!?;L)!7LTFZ;6/+[-JVTG@"95B%6!VEK#U`CEB&612#TLG
M[+$:;*4LP["W78H/I,&-F/-&QW!>IJB(S&address@hidden>ST*1X<$G0!P[.
MX>$JQ4&(XGF,<9W;&2::QFO'U2O!'E5\4WFH4\&)."\N,@,X($)address@hidden
MQ^D0=6K&HA3:"address@hidden>ZM]A/:26M*GU_//F/I4I7M<0=G<87K4N$J]NP[
M%(F`1%M1=-SLI`9)^-1+6)=^*UOUS1+&IQPVP2O/;F1DAA4=0KH*"G>6>"S#
MI"@^(+36AXPBU/`%R\H9X+BBLL0&CZ\6YDB_(`?Y.PF.A$=%)!<&T-=R/DR:
MW!EDN%#R$!\X*R:!T_"2U<('ZEJ^+T&=3LT3<"#AV2*?#((EQJ?S<EQ,,A&*
M13<address@hidden"J)-"K2Q3J*K.4X,G+&M=.8T2MP7J"J;XF52<`<0
M8B9O!%40P8VSE!EQ.'1YGP[2Z5QM!V[;1,+!8C;)^[H*/Z$HC^H#>M3;A]=;
MM[4<\LCCYZ4G)TCL^1IZ8<*RCU<WW81AHB?%:)$ER[:_475Z%48=)<MX.^5U
M/.5U8*\RMF>[<D-%:2IQ1#`0_Q&'&\OXMI$7.D>1(5NX@,28386'S*7-\6UF
address@hidden"T"X7)V=K9((4DW")=-S/"OY3Y5QE[H:J*N`.T>K+W0Q8]14
M#(7QFG%=(P9/W(JHH<1P+;Z>"75S#:WX$3\-C06!Z#8L/85\A.6W>EMNY#AZ
M1YM3[*4M^\OB/'6!:address@hidden&YD"address@hidden"^[[9Z?0\_'^KES
M4O:?&FE=-8%XK(_[\H%YQA?/[/-T:Z?7XQLB5F*BE>L<OJ#E))$#Q8I4=IJ<
M2-VQZ?B`^_*JR`P9Z$4)E/G$%1A'E-IIFR%.#+&RS*IBLB"8Q/,%(O1DR4ZS
M;9>!.[Q?B,(address@hidden'W5??D#Y:8*"L\V'N^V
M#<-`43>FE76E\&address@hidden<W5%YJ!$>P%&`\:/,J*Y.\4=J-]0Q[U1):
MLM.S+NS*9!L-SOBRA?+H*VYLSD%2.E.I#=DT(KNK2U8-0MZ&.P$];34I'<^#
MJ3=6R>FA$8(#T>"M=-J4TLZ^L[-AC8"E=&.7H^R2GI(6R-:-P]O'N[U>;T][
M0=H<Z[-Q>5HMC@('U3O0_\[A"&M!]/G<#&X"_[:@)BB6K<O%5PX6)I]CD##Q
MG03U0I$Z9.<88I;IL/WF,/ES#X'0]9/]I/-GP_*&;G!A]G*$&^(4_^?^SCH(
MD:,RRZKFELYJN"++PI0]\D?#';I%\ABW"3W7K0GK'(8Q[[2N35X/$OD?Z*GG
MJRMCZ0I8H4%VD<.Y,>W/%XB9U%!*7EVE"PW8>@!=V)*B8IME16$Y0I.IS!QX
MX)'S=K#76B.^46X_WI43!J\#.8RWFY>B4];%!!&O2@/[S*612-]\F(F,!!=<
M0J)+N;`3&%I)O"Z_-E[A?8.-T"8M'address@hidden(CL4>;,*C6\WU]!]18P^AV\VNR
MD535\U/5W`.CI9H&59%J8`Z,+A-*`]TCR6HW-]$ND.\%UNR,FP?))=I2ZTN5
M-=TO;9M)'G6OALYT=(S!,5NP)4$J!?06;)2--=ZQ*8Z>$6"JRTYQ=0,%U>S@
address@hidden&Q9K>%E'&WO/7/$:,A4_8:N>9_GD?>Y->]V"F-K)>M[WIL%
M;QUK_LV91<`=]]YMS25XA]R=F1+7A?8TFPT*4X`F7;%UKFFX#68C>$%7UU+Y
MV[H27!/X#917,address@hidden"RA\S8P(W8K0>!9J[F?5'D4Q(C,V%F2
address@hidden'#US+9^4?#6E?FLQ15WNZATM&526(<T6#R=C<T."address@hidden
M=-_9<9Y+\NYYZ1>T\05'R4K/*S?I68$Y?05'address@hidden(Z)address@hidden
M&\6,S-$$,KW(address@hidden:\M`?IM49!+S],#2HS0+E6FWDN8(3UX=
M++-S?]`A\U:=:PN]J&8Y&address@hidden,O5J'?U7"1QD?A6VS`FTWR[%4<LJ^C=YU
M;6,H<S.3&=1V1`*Q8<G:W*<B#C46BYN"JT"55C1)<W^;2]&8+HZMLM-.:9MS
M(,*WQXJ='>Z/=Y)T`G+G03_#0?GDAHYW#J%8HZ&N>9VAY.S0#Z3=\,1M"4R@
M["H'address@hidden:1!O'9M[2AZ_,#[W1DVLZ@@address@hidden,LSVR3-MS1
M(JM08]TVZ>.>address@hidden&(L>@N<,V&I`T=D2^3'9$RGB%C<0IQVVRFJ4EQ$4Q!
M9"Q2<*!+2$&6?&8J$7?8_`1KLJZ5#H33;W0`A)[-&8(U6W$*1:Q%\G&=:E9P
address@hidden>,-P%I<,&E<*;^%!MRE8OX%PK\9"<_2E)&address@hidden)6Q,,
MC;HV]UO(^:SV>32GIX7:WO(FCDG/ZL$]VH_I^5QX+J.,:"address@hidden>4.%
MF_V_BXK-QA>XKC)V)V%`.#L,:5(5.BN"2]%5"address@hidden<5=S*$
ML#43P.Q>I+MSX5!^&-"A80J.<=FRAX7%%(KK-5>06_:H6/address@hidden(@DM
M4YV$Q3^TC)Y=M^0Q43-/?72$Y$;DR39E"RPZ4;(.N^F>)"address@hidden'J79Q
M=LKW"!3ZO"WFPJ="F(REC(P&7MIIMZ+)_P$G;;H$H&6"&[LYZ8$I_UU*TV+B
M*1Z;.TDXLU(&A<:>%R6J;-.IN&T":>A#R\VS)>=T"V-AXPAL/&R3ZSYV15TV
MU5&;5:VXE6NM0J9M?2)PR8UQ#E33O)Y**=RE0<8GF$M\`_N]S(5DF<Y;)CDV
MDV;-VSIBO0E5?2I=K=V,I$S81&&XG*$;W)!9$3]<QI6\`XNF4SFY!P=!)L3\
M%8&%$F$DPC),B-?)address@hidden")(<>HIUD%TX3K#JW8JA4!0(address@hidden;=DQ\
M\ZQ?.DFYF*+X71:+T9BV#`X_9$2OKA(R!8E&Z!!>address@hidden&Y"N+]<
M75P(]!IFB((address@hidden"*MH0H%&C.O:609DA[2#/address@hidden/G^
M..M_,,:2*K*JOIT<<KF2'$+,]E+`IAPJ7:QZ$NJW9&CA(1%9B5375J!HAYQ7
MIV9)M?$)8"P4>P)T0%X$`J.Q1T%FD*=`#>>,A6)-07`&N.0E,S#R9X#S^3,P
address@hidden/L9&-7,address@hidden@A[%N!L207HIX`13XRQA'CIDP8/PPM/3!(R#Y*_.Z
M-^C=Y[*XXP4MH&^V^#YA>=#N;BT/address@hidden;%!1H;@*]X,7!8N-_QL7QQZT%>[A'
MMQWN4<UP?Y&5$-U!Q=$DL(/:^R8';D2A8.DVFDTQY$?%86?0Y4P=W(K%'!L:
MS5QF1LP9(T1?,I'*EV"^XS'C^TTI=ODENK7A(L[2*L?[M'`F967&]9`]$FSX
MZHX=>A++:ESFGZ&address@hidden/>M6%8*4<FC](_I.G7)"P3F38ZIS0Q(
M!KR*8LNF=A70&A".$T"6/N6;6A0S)&IKI"]I[KDA3N5++V(I07]Y.HT8P1OD
M7DO?)I)8U,8M0.#RE4NS]5&-$B)address@hidden&7RRROI`XQ1C)86(2D%1N@:
M32IHTK803>/H?R9';X`2\G)9(9!5YHR+I$N,address@hidden>8K0&>D>C*D0QC-
MP&#BA*,*1L3\$>M?#Y8(address@hidden/ATIS2]&+?Z;QQ(address@hidden'M'10S21`\BOJ
M[,+QA*7!9:address@hidden"ZGPD!-XBWV&M[1@(HT)[P7RX!;KOG<"MD'ZHZ>T
MT$`K941]<KDX>;S;#JRP39BNT:-S5')AYUT:!7KDR>?;G.:!^L`BQIBSR5P_
M.M!W`3>DK56H*R16K*H.ELV7RP=52_?)address@hidden">62G5,"4K#2G?"I1B:8SC
MLD-H`CWI(330!P>PK).!^4`-=(`G^^;$GY$G3XM$E5^QHF,I3XS9-\=XHOUH
M(I"&/CNS,LEILCJ'6IEWW(#KD3$D:O-+]Y2R*GT#MY>:?6#SD&*NU?<4Q%G)
M\NDTH>FI,@[>MJ;01O7#EK44Z,O$_(*+0_&J<-ZQ7$9CF7<L\XZ5R&ZAO;I5
ML6IO8B&REA*1=:*7J"QG;)6CJS7+&5OE&"VB--&M9](.Z=7C.X"E[INP`>7:
MBJ2SBH*O=NM(;L9[W*,+&8Z2?*R"U[NN#O]B"1E*1I\?06XF>C73AL?'Q=B$
M\HUEOK',IPE7WE:B"K=%FN*DO??996JI)&[Q]5_"address@hidden)"+9'`:3/\88PYB
MVH]:S:$S![XZY#_F',3T)L8<U*I)HG-0JWE>address@hidden,$NXW(LLFU+QKXB7?ZF8
address@hidden'%#%<address@hidden"C?!<AYGY2#/S,LS*1XJ5V^2QHMKGEDJ?CXT;
MZA]OHLHWQGXE=65L["_E2%_>:NPOEX[]Y6ICO\)*O8E^\Z/#*4W%B>\F[8F;
M9'LB9R\N22X1'9US;address@hidden;<8E5V,ZEAQ:HJQ3Z3\MA16>1"AUQ6V"(4FE
MG,J7I@)C540-)KM$4F<$3R7S`F,)3Q:#S&6KJ"address@hidden)LXHF&;>!JU&-
M8T`&`U/"address@hidden/M;_X5Y&6)XLL);--L>UO:?`OE<.N[HV=_>_GRU9N7
M[<::C"NGC](4%>^`3M%0Y($X3H_E%WR"YVHEEEI$:C1B;)^X1?&CFQ8_LK>*
M"V-YC%3QTO*[#!\]1OKH488/'KJHS[%3Q09;#H)II/A%AEN-Q[^<address@hidden;,_<
M63S6$(TPCEU/I^^6LLIZ/M#%TR-#)G.")I96)$7XMF=);T;(QW!*,4(8G*.,
address@hidden(B1HX"ID1DDA)].3*>GP1J0/1B8B=4.K2QJ*R8Q6E3)D]?<KQ-$?N09#
M*^_]M]SY=>]UWX&2<3":address@hidden&+Y5((24I9:A1B9O633K%0(X!31GHRI
MZ!X/#=Z%?W)M0:28T3=X-?;/X?Y$%&I"PO%\B6&6A?^!ZTVLWCC^Q&1SQKX/
MCD^Q>O.E=72WO5`(60*[O5.FP)T=7_'O)^ZY#-(=$SE6U&X3(:>%#/8F=QVA
address@hidden@address@hidden"GC<(\8%O8&[=W<J6N.&MN5%:V?H'*_
M06MKVNH3B)S]&address@hidden@[#7OP3K9<$X*V7R<;247\/^X4JLQT&HVCN:E
M-*Y,4V;'U81>!D'ZY*'7Z[A9]D4FRA;T9Y5-+P-T'"@YT&I=<J#53LEFFZ7\
M81^GE/GM7`IY'address@hidden(;/8G,I92ECW'&%D++M9/79#,HHGS"AHR\XH:,O-J&C
MSS:A_K'G!A/J'ZY7F%`"45N"F6;$RVI)DR9T3)C+6.!HG*N>'QSH%[8)E*"X
MMFR0`,]G(&0!=S1443DTJCLW0.`E$SUE93DM)!L;address@hidden)L:F.S-2P,PP\*,
M$'``<'Q>GPM!G?``,*B2K,]T%V\EO<2/52??#9/:*VP'BJOEHBG(F!0(-+W3
MV_W&BTLQ1/="=#^<50E(K(?P3W=6T:4O=U2U-W0E[L5AOX]P!URL=ER]KN;9
M>4L]]1N`I-;,^N,",4,N"</IWY,1R*+_2#J#=T]?'/V4=*KOCGY^]?SH8#8[
M+]/+I%/"X:XSNC^XPK_5CR1(OH#Q/>AP%T"0_?<$$L/F!F2)V,K)[F&R/<@N
MMJ<+D"?IY;address@hidden/K!0T!/I9'QI>O7IS^=/2.OKN+M>/QC/:&2+^MU!V;^.39
MCT]_^N[HI].WKWX]>NT7=N$5=G&SPGBVI$OIYYVQ`,5LG^73[?(\Z0R1;#XS
address@hidden;"TH`"WS<(C'#,LW\RHY3K"address@hidden(@/S8"BI-&EI3L)#M8
M3C[-X6`YVU$'K-`Z=;'6:C'6J.F>2W'address@hidden;GY[-M&'X:0^U0;.*UU1N_
ML&FE"TD9<AT]Z`5N:?BAC=H^Y(<VO+*"5CX^^N'MZ9NG/S"4N9W(YE0W\E2M
M"@S9"1-S('P%&S'DV%;;.)$9?9:;:@`:4LK3[C3*62#BD/8]N%T8FTW+X/A,
M1`KT::A4!DRYK2]_;S)?38WQL?$E+\Y6O"VC1JBS+?N^B:V6]GT&R+%!4%P1
M4AJ"*O+0GDTF<FX+D?EL5#[S$!MML#YRG;K':].'<V0T>address@hidden)H[
M;0QTRFYV=+*7-]MLG&H^N8WR=VH=QL$X/T^F!3=B7K#V"=4Z70+Z<L9!B(,X
MV'-MO!N;,AO;V)NA-6/-ZTG]6&-/7]-K4ZE1-Q\V)+0_(address@hidden;?$B
MH:IP+N0*T$[Y-D-#<AO:Y#:DV/8M9D0CR8C:AK65ZH"F4%O*U`PMBG^0GX^2
MJNP?G#3C0`J6J!(L!J6PD^;A_EDID!0:7O2%N,K'0$,T52<NP)_M\O]1NNLL
address@hidden&>DL<M!I)Q,`7-V01N]FL[;!;R<]<%[Z6`:NG%>`FS%W,PKH5
M4G:[FK66".(7-DALB6"KTHU6;)Y!72NGC6^Z(4I1<address@hidden
M7KP(&\O.1+*#N>%A"\EC!J!SRP6B,\"E8X<H(7VPO[3Z27(!SN^!%2"D84+3
M&]*'2HY+5('OF,address@hidden("address@hidden;UKB`
MY$%O,/address@hidden&S-,S0(8K:VAN8\*83Q)NFVP7AD$S&EVBUD^&%
M59F2G)E<(B)]!4./^'3CK"2794U%',VPN;\ML5:0UUH^6D!'54:[#W8(address@hidden
M$8<>%/X2L&H::XJ[JG'=-V<$&>D-!F1W0PZ)Z+7?8D7W:^9D;AZ(P=S8Y;[<
M:address@hidden'@B(9;,address@hidden(FZ)+7&address@hidden;C2-).+37B]`>address@hidden,"`3LP!
MV#4#?EZB?]6BPKT51`[QC>address@hidden>G+>AB'YJ&_Q(#X1!T6<E!HL4
M(DU:JVG-1PL=TI\[(.8IHV'"address@hidden(YIC].:"O[K?=>.%KW
M4YB9]>?K3P(E]HM%F6?E7M,-,D>]W-/9OP]F'V>3BPP=V*(%R/S'P?QP6$BG
M-7D'V3!=3.9/DEO5+34<address@hidden)\TER?S";[R%JIXPNX%9CZ"*\%G`Y.!M/
MA,1B3<"./0&address@hidden/8A)<address@hidden>6#YZ22CK%!?0I":S/)DZ^XH-Y[OO
MPLQ9WK.=SC"_.L\Z'8W)JT%])P)OIR!C3@/O($%YI30PERX3$R*S*_!A#=BY
MEO%6`\6TK2W.$K[D_KIFBV26QL$\6P4X<\?,>IA<AE<\:E4ZS)B)1'0*#BK<
M$F&%VW7%M[=5LL>/NCU&^_`)R5Q'YF'"8,QT;+!$TP.;V376K($R@)7,Q_L'
MWK0'T$DC8R7!=__##9:address@hidden/,::+3PD"C(M48+8MN`W!.8NVC.!3(NP_&
MRJ?CVSM8`,?%]\<_O&9UGQ9P:address@hidden;]O.!81].6&D_+.;<B>6<J?G)MV-
M)MUUDSZ,)OW&3?I--*G7JT?1I%ZWOJVYG7ELW,[$H16=\#R?$#R'9DMN*#+K
MDEV=3UI88CO9\T]@<PP2[#W6L7KB^P]M_Z$M/;15&WO(BF-%P88^=:R,Z,P/
MU'CMO(<-_YD3FWGE`7M6/UXF204K?G7;BE]]8L7/;EWST0]+JH[-J1?BZ6:A
address@hidden"V<2$)6$CN1OGB;@*D(UD1[.YV5A8BY%5+PP$C4GH-.F7)Z+S4
M*UK69-4&-&OLJD9=&LO=>2J_&]MEB&N8V6`N][=!0&T:,*6AU5.?Q\*;OX=W
M^GEUBC%+14!QH3ZT.B#;*([8V7D^YS,G,D]&*1VGE0CY-_#D"SE%6IMLO=!R
M&BE$D`+TH'@2^SX-/:8ZN#\X;&[YVUR+BXCI%PTQWD7J41TC-.&"(E)'YL4<
M8&-\:TO3=!*<MF"1#3=D+=N%:#Q$I:;,")*5TZ#U).&HS?/SS-W%W%E)>GNR
MT2)["N=PD'TY)'=TE=<L\-"UHM"O.]=N[DI&$K#Z9ZFC/:YQ8$&R)DP7/4O<
MCQ.Y54_7T)BO&;S"260SBS6B6@:;U&>A[=;CW0TGMDF[O3&address@hidden,?':
M0].#.I+:-Q8WR10^!2`D!B'6D'[[IA."28-CB(T+S=;2X91;@`,`^DE#*X^I
MW``-1R_"RTP+]OZ>IA-*0=$NACF<1W$184:A(VNL>4$!6_9H;[F]4V$`USYY
M!;LJ(>GGY1E>46PY.TB<6G[N9)E2`=U^($[95',^SSO!(9_;S+%"AA`2"T8.
M49LA(ESM:@)3UE!:H,$VKS];3\+7EH$&&P,6,AX/!YD-^AFPFP'C"@@#KQ1O
M9LZO"9F*`80%N$`ZA8R3B1_L$C68J)PF;>address@hidden;\`UCQ
address@hidden>H2Y$>address@hidden@E=B(.C7B8/#:O&?P$!\EC[W["
MCIBUN0NE!+):^B,IC<'8DMI(2V7I])HW5RF(D5A6*75OC2F(*+O*@(X'7+CR
M74B3>3J*7G2F9-=2>\\9'-+HG2?>=VZGAF"GL0,KA+!`,4+,H*:PO*H6A&Z1
M5Z3YQ[M+'6B(PB2I?HKF<%0Y,?(5QB50`Z49!KG_J`<8\F?+G"#,V:7`0/&>
MJJ!`P6&address@hidden>CEMAEL:WTK'3LFC=I"/D(address@hidden<,TR]F8UZ8<X,S
M8=PH2\:*&<5L\IRQ>TTZ$?D:D7`"&*%`DH1Z+6S50BMF+US083/RIH9&0\$-
M/D=3Q)V3,=0B7(-D4)K;??2"7LCI3#HD7%<.[3,2GIP.2IA/X]$PN+D#$"),
M'DG96L(HN!910M*(;Q0EWZP&("address@hidden>"-!F7V1!XSI_N5\`N[E?(
M,,2%HNMP%G%`TRVK]1DQ.Q9S,@^9%H:CYYH[#AX+Y+7YY*!N^<M4Z&1;"8D>
M9[>5PP\0ZO-]8>@2S/Y;SH)"=YW.F]"103[*Y[&T>$NWE^2;F_'MSB]7G5"Q
MA1SAQ3Y=TPMS$PWOCYQ_IU:A8L4;address@hidden&QP9(address@hidden"XP^S:;&#*9(4
M(.CAQ!(._?;>C3=PJ!0"J[3]-[MG#GY-<YN)I?2X#3RX=C3P&\%"1)CJN1,D
MN$Q3"A"8L2Z`#P()X9POYF7*#I+I$*.CZ8VDL?(XV=9%AF>N?9]E.,#$YPD5
address@hidden"X>2U`U,;CQ:A19U$5/9JX$;`#A&P\F1Z,''/?*(5;QJ(R
M$,$T#J47QQ6>KDJ=SL%#D-:2K'26#N$M^I/@^9O'#C:WI>IIG*IOW)WZ(=8]
M,AV4I%]]F%J\\.>1$ZT./&3Y!$4"$SQXT-#1*AQJ1/-3V1>3W;8D?S./42W'
ME4>address@hidden;,%E,,O4DA.05KK5AWQB%<'0<I'>YU1SIJM5H5Q8*#
M+:G%6YU^T'8?W',?=-T'address@hidden
M]\%]]\'?0P4_<%-MN`\VW0<=]\%!J.#?W50?W0?_[CXX:7I/UM?;%#'0BNI&
M*\6`=^[0$QG[()^*<X9T4'"@'IRH=$Y9D;43U(O^WC!M+8*:'-/<(J9X:QM`
M])>6GDDIWM@:CX,address@hidden:%JXGXPTCR8&8EE;E_LTJ/><9=2*B<%B0;5K
M8M4E^O!M[IV;!\GNQN4>[HDP3P^3[637,address@hidden:S75,&\QJUIP:+EU^[^_>
MZ=5XTZRJHU!5.":KMK!1<address@hidden;>V/#"MX`/;<HBH\-3-#HD!U%RE0J1
ME^!9MH7)address@hidden,<U(0G=`/<7?8HD.DRCEM:.;BM7Z&9QP;M;^PW]U^W/<Z$XQ
M4H1`H0RO:W$-["X%6'address@hidden',>ME"3C%'8,JEJ,]8)R\;3PQ^ZD(ZZ
M#=[T`I?'RA&+@/\C)YZH';9ZHFZ0;1<RKA:]_5!,,>!TG1$6+BD*D#9`_2))
M0R$N!<?#O7.V;BAB2D:HPU`(RM9"4<W];7KG.1R%"?R+-G%6T\29:B+]ZVQ+
M0K!R[Z,D:"_'H]*FP.[EU#+S>(O=N0%#C726R;ZAJ%9VRZ/ZZ'.J7>Z!J"XL
MJN'^4&N4[+0[<.;2_E^&RC%DR6SQKF5VS&K!FE;,G]P9$P;=D>^-E6:>_,>=
M0!"address@hidden@HD?3*#HQ[?22>C/">'6&%6'IFA"*:O/I'NGOL?;#IG=V6[;address@hidden
M+_`@)*=62RX.GA5R;'65<K?DI"%+'&\G_#VX<N\=^!`4UHV/#-U"J:JDP&@-
M&"XZ(_L;Q1%J>,*:Y2WC5N9?I]=R!<47#,X0Z;address@hidden(<ZPMG0=Z8;5+GNC
M83?U;?#'7T=;6.KIX..'1#P>Y`W7BAX/,5"7PUBHP<_(!;Q:OP`_<address@hidden
M^,D(8`Y=AX;address@hidden'S:address@hidden:?E>9E.JPE?
M"address@hidden;U*TJN\TB"G-F^DS&05?<7,\`K)TH?:V-XUF&address@hidden':.".
MMMO:ZYK67B]K[36W]EJS[NMB.*RR^4$+7[1;3[\Y??OTY='IZZ,W+X^_WY`S
MIIO3[GB>LU#2]0K]3EK7FZ*V>'=K-B(VGUDJV3O;I;R>#6)Q_!P!\L"1:LG#
address@hidden'0_D6^Z^^CQ=[)46%^F(_UHQ`U`G5-X7=$A'+V8XH"FU"147:K(address@hidden
MS?`+99$3Z^3P5M6=3*M(/MHX=WJ]WK)A#8TK(FL0OQ/#R=8/#^`/CIETHHY8
M*T$JWT;)-QIK&*JKU6S&'%K6L[O4G`V;9.G2A'='F*IP/1=#/K`RC;#;,3J>
M6)=$AKMYG:QH0AU$%JAY>O;/ZW2R<Z[)G6M^4RR,:B']PT;M!63(;8<:QYK[
ME8I0C5*"]3U+=^DV2"address@hidden&#5F4/2P;address@hidden;%4?IVL&TKMQK!X%C[_`U
address@hidden>PNR;YSXW)>UQ<=7MZO-`&&address@hidden/0TU06^L`&6WY26UQU1/QH0\5-&]Z
MKXS&J:$RN%*XD?$F+HMPYI/034RS/680TMCX-"M369C#%*APRJ[:'*V/@@^>
M97.\^(:\?6">^;3*!QE!J<@(V.QG`6<7#FR83Y-!=D&^WYUD7%QF%Y`;3D;"
MEQ3#_>44RVS`M]>7'/Z/BDK/\DD^YZB<\X*O\\B_''X<__(C%ISW,P0M1!#^
M*8]IFQ&-$6Z#JK\HT-]^-%;2C[B%J?+SV20[%;address@hidden:7,C>]RO#.D8H
M(\5YK4*#$^!`1,1MZS!=25N4?<,6Q222!Y/Y7F!5J7R'L7PC+Y^ZN8%T?2IA
M"[YKT-YB8MJ_)&A)8ZN4DPVD`/.^2U+,$)$>.LKN$DVZ!-8*T4I"[P4KBUYX
M686%P4/]1?3=$(2?)"SG=0ZQJ)C,U%/"B-,9.IQWY,]*QI=DQ`*S6TM[POI]
M#SYS]<4K))5^.D6+8W)%(30D7!^8KFEACD&'^\6`))WUR;address@hidden;00?3
M"#OZV6=TCAQ.PLQOO??=Z_82IA9Y^7U=%5=6%5<K56&2C)address@hidden:)5ZVIW
MH-J.W8BZ`V&XJA4KNN[8`WKSBO0.!S,L@>.)XN[W,0:D^H^T>"(6)+,@02BD
M(=:=M7]>;\FR5_U8X[AE_;RFG\J7Q4)7,XBV+V[9S6?/UTW'M7Y>]B>"A.G`
M7Z:#?('RL`HLW]$WM^J6EX[8;M(+E?3"2(J5(.Q*B9L75X>A9;-)/JL^8>U@
M+9NB"5]L]>@3[:W6C<M#^NMU<MMW_22RP032/C>,^,)]$#.YL7O;E5!#5UF`
MKHXLNLHFQOS^`83%Y(0Z)!'\>0%O*I`H_WM16%9/8=D-*.SH2U)8G*E??RK9
MQJEV%J#:MQ;5SHK)]:B8WIIDKOM?C%"N^I^13&;U9#);G4K>.D2B;-E-N_1\
M'RJ?%K1[599%>2UMU&[YN9`M8%R64<HG54)RQ?7R2CZN3I3F3*2F6)F6_?]R
MI!>@F51E$=3RQ<C%HI;/3286E7PA\OBG=>J8J7NP_^(4\L\["@EKM>+XJJS6
MUM9N"*\TR::6MRJ,I8D:G@@/ZZJ8+$C])+1+K/))4C0?G4RNV2).W25H*#$Y
M1XZ-.SH'/M"I&/Y/@`!"B]"_4**42V2M3A"?C"P&MEPDK5#^K;IC%*7"VP"Z
MD=P35_D-WY[42KC7\&U%'6Q1-<8"45=!K&(\G\6Y&/4W/[XYXJ/?3T>OGQZ_
M^OGH]'OG]\_N>_'@Z;-W/[[^V_&1V(O/"YJE`RI2>8*1V?%PDHYD,ZSIUY<T
MK'(*6J<HQ%4+R2`RY0'D#?U>HZ5#T[*K>9FR7;address@hidden>FA2&;;PXH&J^[*
M8:"@8C96FX.;YH*NB86I2M(CO!<UOW&19RD56GY0&?=X]-N-M4"A/ZO86-#*
M4(J?`^YPU&2:1.+ZAP?V@@UC^PE4/\XV3DNRPKC:2F(X?]KH?)/3?,C*J1XQ
M;;H>@JG3C;NGK7O40Q,FT$AJ%8U/7'L6BW!5I"^;9MS6P?GN$OY7/address@hidden
MHJ!..`("^[.:`8^V=V'RC&JDCC8QE,'!HO:33BM0F%U:IV-.L9QCU=5VT%/8
MR-^V5K"<I5XXGTK#G-B]A;/YKKIZ+9/J^ORW7<)MQF_H@)&L/UT'TF"*W?@&
MJ41/SV:RN^&V1V;>H<PGO743796+85(B)#1<,D\:/FJ:7-E/XMWS5W/BI;E@
MQNZ7KY?F2C4`:9F6/;address@hidden:L=COKJ)10=/4VK*BOGK9Z.
M,K%D6ZS9%.TM4=_/Q\P3R(IN/L[['Z88"H&O?[+I15X64W1,3S;@!TLU=E*"
address@hidden:@9Z)/TM68JH:>U<\?CP)3I98M1(@?"S&1CQG^G,XG0%FZ?)'[)$Q4*
MX&3]B;:&GN&.O!MUP43\"+)8H/H1B4$&6X2^DO3#7R_T5W*PF<$J-E[![YWW
M;G:VG%$W.-[I7H3JVH5CZ(address@hidden/"^%`0>VRW9%<address@hidden"'6;#9&\&
M0T$T02+E*Z%1F<X7^;Q85)-KQ)>H$,*;."5(6&NB;.!%.VBZS5]W!8:1Z$D/
M]<P[JCMV;U0[!.RXZ`NB?GOMQ-%UMR_5=[%F>`C>BB%`%V>,TRH"QZKWL_`0
M/>`;_371\.P"5A"O:((N#\^'4%91^XW6V!:CYOB+TJ>%4>)*!1E(,Y,,\24&
M`V`"I8+]DU?_%//$4*&Q!%.,#Q2AFK!DQ<6!(ECS>address@hidden,'X=_R
M3=BO-D$.&>_QSQW^>8$X69P)?=,"74"HD6J.N/>BC7CIQZ%[8TM1).352!P`
M_BO&\/_%5FQ1A5;&T1*RR&P6<<]B$<O6I5"UZW.H19HK,YD0B^D@']G>7<9I
M((55BC4HH?%X;HP'W62K6RA^WW>6B6(*-A]0*QOH[KE-])(QW&L9%U^"4Q`'
M-E=$C$=PL^+KXA.8=P?'<=G(]LR136Y"<&F4%7_#D93(_C7IDQC(W#0=(%+7
M:5KV3_E:I84;address@hidden&Q!15N1S0ESAQ;)FN;U`N6+;].E^\):?%QA*XW6
M!H,%([;['K_NX->'[\.U^V&;F0B^B:TOZ&?(:-L;\W]^1M[.JKY/address@hidden,
M-&=I07=B8RWXX`W(<1@>FM#NO61)8DWQ[A`SL?=K,EG%QT+50-\/,4;?Z],?
MGOXJ(W<=X[7A>99.*TZ!\:XL:-M^,2G*;F--5"'SP^%H9YEH8$G;HG^+:9GU
MB]$TKZ!C*'6B+8R$MA,!4LE0C\1)5WZ/(^)DZ))!(9%(9F71E&99T)R%()E,
M5=@&address@hidden>P&(?M4`82UM&6>UV%X\%,D][#PMCA#%NT(!:
M(E"`&A[$JM&.GG&N,)0(XO7#7>,U#M:IY:!I!8]RA+=@;"EK#*S7%\'7\JR`
M-\IDIF:9GR:address@hidden;AFN99;address@hidden@:<C]6)6GK&8)&Y$Q2T1?
MX"?>F?L1M(1[0XG6UZT'AG4LY[]GNHTZE:OXFR),UH.1LI02T;:HZ'FAXG'%
MK;(E>8:MLJUA,Q\9!9/]H^,@32TDDW(address@hidden;J>*&QA='M/!QIKN`4)J6B[
MT'^:/PWU^K#*,G;\&@(G[+U&K$FMN1169I2(_)@@75&FY379;,)K^'?0U"%3
M5`C,:@X;,Z.(HU%AU6KN8P+&,@N]S-)!].5Y-E>`C,]Y(COO<.F=-!,QL?`&
M27F[7R%VFEL0FV9RH#/EGBE+WZZM^ZP87->6I^$%#:-P#347&HF95Z`(,7V%
M/@>6'P-&8T-R9$68`;KG<+GGB%=:E,#HE#+%9'@8"1HCF89?BDHBK^TFZ#0V
MQQ1+B+PQ8)M(7O_XYN7IBQ]_.CU^]</1Z3'EFA334>-/I%*F&Z+\'`91A[OC
MP);X5*AP:KH*#?H.&`$ZO`4;W:=B'LS;2]I+-W'DTT*,&.&]$'!P8RABQ-#/
MO62XQ]'".X>(EV494/,*GE7XOF4\:;<@]4Q5%-N:JN#>%-A[O#U*%HI/V3=$
M/>H7LVM>address@hidden:NGTS70W1^,A7!UH*+8#NX"O0""JYL$9%2-L"address@hidden
M\:2C7W#(,address@hidden,DMVB<S2H.K!-IF&.G
M6X;"*%\&@BCO1:/MBN)7#+IKI5X-<[*N!!^'address@hidden,address@hidden"^B1_N)>,F'
M*)72Q9SYZ)9'N[=='CXZ3$KINR?+XWU>)address@hidden;L0?3+^CE;,5JS
ME7KYG%U&YRP,3Q>?L\ME<W9YLSF[7#9GES>address@hidden(YBX+=>;XH`2E.H6VQ
MB3RR#V8DXVPR2`2+T+(-9Z[A+;1'2,0N+!\?+,'K<EH41""address@hidden;
MD&_`/A(SA"[63LI4=R`U:G(P?+.&8'8^)B*S,];+N>3B[-2ELH^-6ZS2E<G2
M'L0;K.=/'$0N#P?Q\O,-HAB0X"#&+L'01Q8."PKGL.Z*B>Z%/?P0`6P%>9MB
M`;`COH-IY1PR];4WG0#M\Z=P<EQ;<@(EN`TY7(.!*V;0T(4FI`I!/Q`G#?0%
M!#75$P*SM)IZ:`6/M][)J_A(#UEQ%CAM!EL&#9O*EN$,/@&Q[9$[P)]B8*7B
MATN,^NM6S]*QL2Z.H$'D\TDZE=_)C;JP</(S#AXY2RM4+C(>N/"S$_</^)J\
M!H6#WF!!;VE,address@hidden"#K?`JBI$P;_>2AY4OSUZK\#MJW;GD4"address@hidden
M+JU?#"4W%Z21UNPD]&UQGK%7(^$$8V^D&@V#+TT+QE+<$@&address@hidden"U"IF
MV7"!.,0ZT`NC;:&2C_&V%H-1-I">FDF:G*?]LB`:1[TDN1CHZG7078[<S3"5
M9]?&-0:Z7,YF90$<`($NJ'%UQ$:&/4AMW[K49L>address@hidden(1]D<)N2W;]^[D(50
M\5/address@hidden/NVJ.;O&.9/0L"SKRAZQ5&_>0'CT3,K&]3N=)KL/address@hidden
M)JWLJC]94.5\[2ZB2B"EZV3MKAU^$0-1LY:.T2<K2U\S$THA/&#N[04BEVUD
M%/L#&<68KBCP;&98.-%K93&3)'[RGIN\D\R`CT#GVA:L<-+3R39$L93;5_/.
MR!QA()7!AH<G:address@hidden,[<&RB?&C?:-127T7P2!<I[F4U+Q
MPN&WOR6&address@hidden"*`R8VOFI0'/`%T(I+LID0Z#Y("L)&?RW9W][\>[5_^84
MV1RU<?QRRTBDX.?[QA[?PIT`-N9B-F]Q8[`RH-P73]*+P>C\K\TV02(?_?B"
M1XX-)5I]-;ET17`AK@@address@hidden)9DU$`9#-164/+7Z1,[E=TN'84,9B3&)S(
M&+E+L*_1DD0$^74PIKPVB-L"Y"BXT"'3.8VVCN$^S%*8;XJWCHN-/*+/*2RY
MB7)EM(A;\D*UA+<7P>-X(9'*99"address@hidden&/QX*0-5"BSI07:V&(UP]:KK>GKD
M=],K9V254U!/"'(Z(>T>^XD+59[<address@hidden<1\H^-\N>9,B,&&D*)address@hidden
M7J!/+6_K7U5Y:@5Y*:T;&L<B2I]M8731A?Z0EI,BWT'!.J-FI^GC`+#).AHU
M(#`:Y=^#[_M4`ANNRZ$7Q=!*S=\KT7N033+8)V:EAAQ"QA1F#LP[7:*DET]@
M/22_=7A)OH=O+Q*@&/A",`))M]M]C\N%KE\-WD'MR*[R>6N'M%%??9Z/6*O;
MSPD)YG4Q^NKS?W9ZO6^_^2;Y"@9WQ_F;T/>=W23Y]O'CA[L[N]_T>O#D8:_W
address@hidden)XD7XW2?%'5I@/V]=5_N<_3Q2C9^<M?_H*V!]-\GJ.V$@@=
M%BPQ[.OD+*V`MHF?$R*61$(8;"7_6"!$Q6(address@hidden,:O0-6JEZ#4-V'4P@)N04P
MB2D>/.`$,J^2)QTTU?T'0V*#:#5/SX#RMY)9WD>.K`M!8`M&address@hidden&
M#D.S<\B,$C=\FQ>0:`L.',6L`@'G'0B`[[(9"!'0K2>]1T]V>\FS=\>RCV4F
M<#6&6DJEI@,;GP%/F\Z[R3/address@hidden"V#C"address@hidden>6<@
M-A-HFL*?)C$NG50%[&\9R+O&3M--CL6Q+)]<BS,THX%TWG92:<D(K%4LT\8:
M2-+Y7.Y9<,S[0->@4P(:P9_9H-WE._2\$L$]H7=-F()!T>address@hidden"2.`
M""%Z#G^Z:?EA,4-9`FK$<T:*C%XDX[K%CEF)"address@hidden,Y+'address@hidden
address@hidden;RLAKJ&1YM+RBH4BY-7C`+_M0X-4VR*W)U36:address@hidden"
address@hidden(<(*]K(`NK_`<D-=M"*ZZ.ZAOE5AF>%4<I4Z1!V]ZO_EA_)_P=9E8^F
MW?/JC^?_CQ[U'@G^WWO\<&>'^/^W#^_X_Q_QZ4[+Y.V[9&>address@hidden
MWS:ZQZ\;WQ%--+K5+-G)&]UWWS=^!#9SD<,!"address@hidden/ROS;`B\
M#$27BWQ`RNJD,',5ES(GB&&,J=.%_((7"X7,H,PE0X,2T()J,BDNJR>-[JNW
M(,:U&](address@hidden;`_U3(->address@hidden<%Y4H'1%`5`"Y"P7TTIK8*1J$;G1
M$,1#9I\(L)J<PRE=R+G=Y#745C:@address@hidden/3X3&6754'?5
M1_.F5-='address@hidden"JH?FLIL/N]_.<-RG">F(-63KA45,_57H\JXD1F)]-
MUM%B[!_3==Y>UZM&B_@>Q7P")HD7C"address@hidden,ZB)]F/03Q4VE\6K.VIB*
address@hidden>*41-]`#Z,0R:4%:UJ`7L(address@hidden/V^M!-
MGH/8#QL0[;!5`S=/address@hidden<#+#OULB4=?$YD)!1.(,9<-]!H[2*=T-;^`JUT
MKU+:TUZ6:!0"I\(Q^L^<address@hidden;MXT7(B(6DH\_NMP*B9+&G=!2"HHG9%:,
MLR6S4!J]SU`EQYCK(I/[.F[(*&*0[1E(XGV24$""address@hidden>&WFP
M^W0M1-LW;OU0%6^7PQ*E%%2*B.-$U0"Z(address@hidden"VY/DE#`LK++-I/YU5M/4J
MV4Q*:S2?2H;35GJ\4J4F"E=L-6MT?WH'[&78.!G^]ORG]R</address@hidden<G&ZWN
M\3IV?STY.?FU9>G,address@hidden:`H?ZZ8BJ8_I*9[,LI0"8:I`C
MS;E*?DVLRAO8.ZS>?`.5N17A3+XB*499W5OEF`L6\^,(`?T0#5T6C8)$IJ:X
M>address@hidden,1MU2>6_28A`V#80A368OD4Y*RHA]\+;"E6F
M2&8<7AO#;#0D<AW=X2B-":T%H)S!HB]F]0-E4;$HF229B%2<4;X2>!-L-VGM
MWQW_].K-RY/A3ZKM*;%X*(-?"=D.E>8D$BL]N1&ECG8<)+T&+'8!V<^K))U7
M!<K$W>05\6-1.&address@hidden&R%"@=H&T\9)-:"],H\[(E/O'_[Z772Q%T`
MF.P1I(;I:@[GLR?;VX@,>%G`M)3#Q:0[FBZZ53&<7\(T-LU9^H5F"?N!1;$8
M?;:address@hidden:8BC2,]A,address@hidden@F0SR\F\X3;A2+\MI;CH3IF-+^0
M;A!Y]M2\;Y!\V]EW^\4LSRH]MQ2S&!5)58/:X\8SU62*3*),!*"HG":R%\)Z
M&^9Y2RJZNR12'./)A$4.M;=/\VJL#C<address@hidden;Z!6UATX(6\GU%MF;V?;5E;'!
MDWZ;>X`S-1\7U'7!V<FB6"ZX!(.LXEE-\&L)XMAH%64^$OO!//V`IPA<'/#Z
M5Q!JV\:6#N>D$B\:]!2(EQ>J0W2L2TGY5(`<\5QI*/E`=U866$%:B7,R'#?/
MKI-?LA($#.9;/--D"I=TCAEE$H^)G7/Z3B].S\^[0,P8P$?^Q)=$?E"$#$!+
M$1//,BFV4#'<,-H[:2>0Q]$SF`!H8C4N%A/address@hidden(21)0SN=0'/I*=!KZ
M3%NV'!0YX[19\+1_E\TRQ'SO`[W1[+\43!J#X8IW&("<S[XSC/E1Z?,^3:M4
M`QA4R`"8N'DU=*1LW,?E#MU-7NK-NLP,=07VA4[1*>]P2AVQU9#;7")\[["-
MT')T.X:%#-SY/['\[_"-+U+'LO/?X\<[=/[;[?4>??OX6WB[^VCW3O_WQYS_
M3IH-^#_1*B&,!`OLFK8EVBO%42[Y_OB'UVHI"Y&/E2B7EY?)$*/<P2))"<16
address@hidden)'VL>H#'BA2<8:address@hidden<U&D0\3KSP_H5/T2
MYTO60PD(E]=06"FYC'J!F7FKA0YR'M&address@hidden)2#DY^7KC[XUN5R5]
M]>:[HU^#Z5D8TQED_W&'[R1?[TAU7'\"address@hidden)[0N4$Y"=`$^=+/C4Q7GX\_6N
MS+,H)ZK!4%ZCBW>AF=.$WT_H.7UHIF1`[B8T:K=Y"/_N8$1N2G7RD?Z`C(;Y
M3H:O\.U)U=GE+2;9ARJ?))CQ$':.DVIS5V4S^@;#\3]NV3FC=SA"&address@hidden&\*,
MC0Z?L/M0*)U^)address@hidden;address@hidden@5=*1[DB1=:E,3A%\49X0<`_+9G\37G=V'
M32^[\=%J"Y)P>+OWBF/Q)E:&[`'address@hidden@!"NTOW_PM>?'N!30?_H,U
M1A)E48YJ>P";9YGU:4OK4$!D'-1??OE%$'\^K>;0#BNW(BZL6E+7/3AV??UP
MW:address@hidden&6ZI&G%60GI(7QV_QRLZPM&C+;#`N3L'7Q8)V
MY71P0>Y8,,Y"UF"address@hidden,KD,I.V=)OUY^">B<UDB)HV]MJE?9*A=4,Z2XH5A
M+BA=JE>P;(W1&-W,DX^),address@hidden,)LQ"882COANS#[VN4><!1Y-D^
MGH26,(X?GKYZ??RC@:K-[#H[3W-CW=L$KH>`DP%O+^&TYR12?6995BQ"?[E(
M'5!7-&4(8MR_#8NB>P:R0/,%_"IS.#P\FQ2C4=54ZX-3J^)`F.[C"L<=DR.D
MP[&JP#,)'N>E.1`(\3,X$`J#']JD&):%1X0THH,"K:`&!1_.5:A4;O3)>/WD
M<CU97X<O'?Y&UE/3=9:\L9QE4THO85;6/<(6T]V4\XVC.R]P"G?4M#=U!DWE
M(3I?4MANN+#@>O3:S-O3LWV:?U&D06*QUKGTJ;+O1K-;U$IS</STI4FN*?NO
M,8?_>D?1!R1K=.7J(8<O7O2'O';T"GCUP].71U"BWAU2O!=$"`1KDU1$3^_H
MW!+91:address@hidden<R\W4\LRK^(@4NTU9=I1XL
MH[MI2?3PRZOOCK_'9BA>.XQ0HY4!4_C,523Y_NC5R^^/(<WT-Y7CO5/^PUCY
M*O/7#_T*>/[R<UBK95],((_/@56;B`ZG'G*A[P_C)/UL!ZCQ&5*B*CY$QL\<
MGBFM)7&]H]D:"+#3BG3NN-F.KV=P<N7S*6V2.`M;P&>0HY"12H[R_!"*&E\G
M/;KF^?Y__3%GJ[O/W>?N<_>Y^]Q][CYWG[O/W>?N<_>Y^]Q][CYWG[O/W>?N
G<_>Y^]Q][CYWG[O/W>?N<_>Y^]Q][CYWG[O/%__\?_C;address@hidden
`
end



reply via email to

[Prev in Thread] Current Thread [Next in Thread]