home *** CD-ROM | disk | FTP | other *** search
/ Tools en Utilities / CDASS_5.ISO / shell / comp / tinyprog.arj / TINYPROG.DOC < prev    next >
Encoding:
Text File  |  1991-01-02  |  22.3 KB  |  794 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.                This document describes the program TINYPROG.EXE.
  7.  
  8.  
  9.  
  10.                                                Tranzoa, Co.
  11.                                                P.O. Box 911
  12.                                                Maple Valley, WA  98038
  13.                                                (206) 432-3532
  14.  
  15.        -----------------------------------------------------------------
  16.  
  17.  
  18.                           WHAT TINYPROG DOES FOR YOU
  19.  
  20.  
  21.             Makes EXE or COM file programs smaller.
  22.  
  23.             Stops corrupted or patched programs from running.
  24.  
  25.             Makes EXE files as easy to self-configure as COM files.
  26.  
  27.             Encrypts programs to make internal text unreadable.
  28.  
  29.  
  30.        -----------------------------------------------------------------
  31.  
  32.  
  33.                           WHAT TINYPROG NEEDS TO RUN
  34.  
  35.  
  36.             PC or compatible computer.
  37.  
  38.             DOS 2.x or higher.
  39.  
  40.             90k bytes of memory plus 10k bytes for every 2500 relocation
  41.               table entries in EXE files to be converted.
  42.  
  43.  
  44.        -----------------------------------------------------------------
  45.  
  46.  
  47.                    WHAT PROGRAMS CONVERTED BY TINYPROG NEED
  48.  
  49.  
  50.             PC or compatible computer.
  51.  
  52.             DOS 2.x or higher.
  53.  
  54.             Possibly more memory than the original program. (See below.)
  55.  
  56.  
  57.        -----------------------------------------------------------------
  58.  
  59.  
  60.  
  61.                                   1
  62.  
  63.  
  64.  
  65.  
  66.                               HOW TO RUN TINYPROG
  67.  
  68.  
  69.             C>TINYPROG original.exe smaller.exe
  70.             or
  71.             C>TINYPROG original.com smaller.exe
  72.  
  73.             These   commands   convert  the  file,   ORIGINAL.xxx   into
  74.        SMALLER.EXE.   If  ORIGINAL.xxx is over a few K  bytes  in  size,
  75.        SMALLER.EXE  will be from 10% to 50% smaller.  When run,  SMALLER
  76.        may  load  slightly  slower from RAM disks and  hard  disks  than
  77.        ORIGINAL.xxx  did.   But,  you  may not be  able  to  detect  the
  78.        difference.
  79.  
  80.  
  81.             C>TINYPROG original.exe
  82.             or
  83.             C>TINYPROG original.com
  84.  
  85.             These commands convert the file, ORIGINAL.xxx into the file,
  86.        ORIGINAL.EXE.  The original program file, ORIGINAL.xxx is  copied
  87.        to ORIGINAL.BXE if the file, ORIGINAL.BXE does not already exist.
  88.  
  89.        -----------------------------------------------------------------
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.                                   2
  123.  
  124.  
  125.  
  126.  
  127.                                  RESTRICTIONS
  128.  
  129.  
  130.             Special programs............................................
  131.  
  132.                  TINYPROG will not work on these programs:
  133.  
  134.                  COMMAND.COM
  135.                  IBMBIO.COM
  136.                  IBMDOS.COM
  137.  
  138.                       These  programs are COM files in  name  only,
  139.                  and MUST NOT be converted!
  140.  
  141.  
  142.             Device drivers..............................................
  143.  
  144.                       Device   drivers  cannot  be   converted   by
  145.                  TINYPROG.   As  a precaution,  TINYPROG  will  not
  146.                  convert   files  with  .SYS  or  .BIN  file   name
  147.                  extensions,  or files that TINYPROG senses  to  be
  148.                  DOS device drivers.
  149.  
  150.  
  151.             Self-configuring programs...................................
  152.  
  153.                       A   few  programs  configure  themselves   by
  154.                  writing  data  back to the program  file,  itself.
  155.                  They  cannot  read or write a copy  of  themselves
  156.                  that  has been converted by TINYPROG.   Many  will
  157.                  sense if their program file is not as they expect.
  158.                  Some  programs  of this type do not  check!   They
  159.                  simply   clobber   the  TINYPROG'ed   version   of
  160.                  themselves.   Usually,  you can  use  TINYPROG  to
  161.                  convert  this  type  of  program  after  you  have
  162.                  configured the program.
  163.  
  164.  
  165.             Programs with internal overlays.............................
  166.  
  167.                       TINYPROG  may  sense  programs  that  contain
  168.                  overlay  modules in their own program file.   (See
  169.                  below.)
  170.  
  171.  
  172.  
  173.             Otherwise...................................................
  174.  
  175.             Run  TINYPROG on any other program, either EXE or COM  file,
  176.        that you want to convert.
  177.  
  178.             If TINYPROG tells you to use the /A, /C, or /I options,  and
  179.        the program you are converting is not your own, stop right there.
  180.        You should not convert this program.
  181.  
  182.  
  183.                                   3
  184.  
  185.  
  186.  
  187.  
  188.  
  189.                  The request for the /A option tells you that  this
  190.             program  has already been TINYPROG'ed.  Doing it  again
  191.             may  harm the program by throwing away special,  'user-
  192.             data,' information that the program contains.
  193.  
  194.                  The  request  for  the /C option  tells  you  that
  195.             TINYPROG thinks that the input file is both a COM  file
  196.             and is too big to be a good COM file.
  197.  
  198.                  The request for the /I option tells you that  this
  199.             program  cannot be run through TINYPROG without  losing
  200.             some of the original program file.  If you do not  know
  201.             what   that   program's  extra  file   information   is
  202.             (overlays?), you are safer to leave the program alone.
  203.  
  204.  
  205.             Run the converted program to verify that all is well.   Keep
  206.        a  copy of the original program backed-up somewhere,  of  course.
  207.        Use  DOS  commands to copy/rename the converted  program  to  the
  208.        original program file name.
  209.  
  210.        -----------------------------------------------------------------
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.                                   4
  245.  
  246.  
  247.  
  248.  
  249.                                   PAY TO PLAY
  250.  
  251.  
  252.             Programmers:
  253.  
  254.             If  you use TINYPROG to make yourself money or to save  time
  255.        or trouble, then you and your organization will want to feel good
  256.        about  yourselves.   We  will,  too.   If  you  are  a   software
  257.        developer,  you  probably  know that  highly  optimized  assembly
  258.        language and custom data compression algorithms don't come easy.
  259.             So,  please  send  to Tranzoa the price - to you  -  of  the
  260.        alternative to TINYPROG, plus 1/10th of what TINYPROG is worth to
  261.        you beyond that alternative.  Or, 15 dollars.  Whichever is more.
  262.  
  263.             Naturally,  we will send to you a copy of  TINYPROG  without
  264.        the "shareware irritant" - the random number prompt.
  265.  
  266.             Oh,  by the way, your program will be clearly  converted  by
  267.        TINYPROG.
  268.  
  269.  
  270.             Users:
  271.  
  272.             Well,  what's  disk space cost, anyway?  Not  much.   So  we
  273.        don't  expect much in return.  But if it's your turn to  chip  in
  274.        for  that vast, "free-software" universe that we all use to  make
  275.        our PC's valuable, please keep Tranzoa in mind.
  276.  
  277.  
  278.             Everybody:
  279.  
  280.             There  are two versions of this program.  One  version,  you
  281.        have paid Tranzoa for; the other, you did not.  Which version  do
  282.        you have?  The paid-for version does not ask you to type a random
  283.        number when it converts a program.
  284.  
  285.             The version that you paid for is yours to use where and when
  286.        you wish.  But if someone else is using your copy, you should not
  287.        be using it.
  288.  
  289.             The  other  program version (the one that you  did  not  pay
  290.        Tranzoa for), you may use, copy, and give to whomever you choose.
  291.        You may not resell it, though, for more than a nominal charge (in
  292.        mid-1990:  $10)  either alone or in combination  with  any  other
  293.        product without getting the OK from Tranzoa.
  294.  
  295.             Of course, programs that you convert with TINYPROG are  your
  296.        own business and responsibility.
  297.  
  298.  
  299.  
  300.        -----------------------------------------------------------------
  301.  
  302.  
  303.  
  304.  
  305.                                   5
  306.  
  307.  
  308.  
  309.  
  310.                          TINYPROG COMMAND LINE OPTIONS
  311.  
  312.  
  313.             To  detect command line options, TINYPROG understands   both
  314.        '/'  and '-'.  You must rename files whose names begin  with  the
  315.        dash ('-') character in order to run TINYPROG on them.
  316.  
  317.             The  command line options can actually be in any  order,  to
  318.        the left or right of the file names.
  319.  
  320.  
  321.             Here are the details of the command line options:
  322.  
  323.  
  324.        /A         This  switch  tells TINYPROG to convert  a  file  even
  325.        though  the  file  looks like it has  already  been  produced  by
  326.        TINYPROG.  We use this switch in testing.
  327.  
  328.  
  329.  
  330.        /C       This switch tells TINYPROG to create the output EXE file
  331.        even  though the input file, which is not an EXE file, is  really
  332.        too long to be a reasonable COM file.
  333.  
  334.  
  335.        /I        This switch tells TINYPROG to convert an EXE file  even
  336.        though  the  EXE file is too much longer than its  "load  image."
  337.        The  "load image" is a value in the EXE file's header that  tells
  338.        DOS  how much of the file to load into memory.  If the  file  has
  339.        data  past  the  next even 128 bytes  beyond  the  "load  image,"
  340.        TINYPROG won't convert the EXE file without this switch option.
  341.  
  342.  
  343.        /H        This  switch  option  tells  TINYPROG  to  write   this
  344.        documentation out to a given file or to the DOS STDOUT device  if
  345.        no  file  name is given.  If a given file name  exists,  TINYPROG
  346.        asks you whether you want to overwrite it before doing so.
  347.  
  348.  
  349.        /U       These options allow you to put clear-text,  unencrypted,
  350.        uncompressed  "user-data"  at the top of your  output  EXE  file.
  351.        This option takes its own options in quite a few ways.  Here  are
  352.        some examples:
  353.  
  354.  
  355.  
  356.             /Ut "\r\n (C) Copyright 2001  Zingo, Inc.\r\n"
  357.  
  358.             Puts  the  text string in the user-data area.  To  put  text
  359.        with  embedded  spaces into the user-data area,  type  the  whole
  360.        string inside double quotes.
  361.  
  362.  
  363.             These two options are equivalent:
  364.  
  365.  
  366.                                   6
  367.  
  368.  
  369.  
  370.  
  371.             /Ut1234567890
  372.             /Ut 1234567890
  373.  
  374.  
  375.             These options are equivalent:
  376.  
  377.             /Ub 12 100          (put 100 bytes of value decimal 12)
  378.             /Ub 0xC 100         (the numbers can be in hex, C-style)
  379.             /uB 12 0x64
  380.             -ub 014 100         (the numbers can be leading-zero octal)
  381.             -ub014 100          (the numbers can be fairly free-form)
  382.             -ub12,100
  383.             /UB 12,100
  384.  
  385.  
  386.  
  387.             There are four ways to put user-data into your program.   In
  388.        one  command  line you can use any or all of these ways,  in  any
  389.        order you choose.  The final user-data will be in the order given
  390.        in  the command line with no extra bytes put between  separately-
  391.        given data.  Your final user-data area must be under 60k bytes in
  392.        length.
  393.  
  394.             Here are the four ways of specifying user-data:
  395.  
  396.             ASCII Text:
  397.  
  398.             You may specify simple ASCII text.  In the text strings, you
  399.        may specify non-ASCII byte values using these extended C language
  400.        conventions:
  401.  
  402.              \a     Bell               \b    Backspace
  403.              \f     Form feed          \n    Line feed
  404.              \r     Carriage return    \t    Tab
  405.              \v     Vertical tab       \z    Control Z (End_of_file)
  406.              \-     Minus sign/dash    \/    Forward slash
  407.              \'     Single quote       \"    Double quote
  408.              \\     Back-slash         \?    Question mark
  409.              \xHHH  Hex value          \DDD  Octal value
  410.              \_     Ignored (Used for null-string: "\_")
  411.  
  412.             The   text  is  put  in  the  program  without   any   extra
  413.        information.   To  put  a trailing NULL character  in  the  text,
  414.        simple use the '\0' character sequence at the end of your string.
  415.  
  416.  
  417.             Examples:
  418.  
  419.             /UT "text"
  420.             /ut "\r\n Howdy, howdy, howdy.\r\n"
  421.             /ut "I say, \"What's up, Doc.\""
  422.             /ut "\a beep"
  423.             -ut "A normal C string\0"
  424.  
  425.  
  426.  
  427.                                   7
  428.  
  429.  
  430.  
  431.  
  432.  
  433.             Byte values:
  434.  
  435.             You  may specify blocks of data in which every byte has  the
  436.        same value.
  437.  
  438.             Examples:
  439.  
  440.             /UB 0 2048     (2k of zeros)
  441.             -ub -1 100     (100 Hex FF's)
  442.             /UB -128 1     (1 Hex 80 byte)
  443.             /UB 255 1      (1 Hex FF byte)
  444.  
  445.  
  446.  
  447.             Word (16 bit) values:
  448.  
  449.             You  may specify blocks of data in which every  16-bit  word
  450.        has the same value.  The words are stored low-byte-first and  are
  451.        not aligned on even word boundaries.
  452.  
  453.             Examples:
  454.  
  455.             /Uw 0 2048     (4k of zeros)
  456.             -uw -1 100     (200 Hex FF's)
  457.             /Uw -128 1     (1 Hex 0080 word)
  458.             /UW 255 1      (1 Hex 00FF word)
  459.             /uw -32768 2   (2 words of Hex 8000)
  460.             /uw 65535 7    (7 words of Hex FFFF)
  461.             /uw  -1  4     (4 words of Hex FFFF)
  462.  
  463.  
  464.  
  465.             Files:
  466.  
  467.             You may include an entire file.  TINYPROG copies the file as
  468.        binary data to the user-data area.
  469.  
  470.             Examples (these options are all equivalent):
  471.  
  472.             /uFX.Y         (puts the file X.Y into user-data area)
  473.             /uf   x.y
  474.             /ufx.y
  475.  
  476.  
  477.  
  478.  
  479.             Finally, here are some complex examples:
  480.  
  481.        /ut"MY_PROGRAM \0"  /ut "5/26/90" /ub 0x20 32 /uf DATA_FILE.DAT
  482.  
  483.        /ut "Overlay1\0" /uf OVER1.EXE /utOverlay2\0 /ufOVER2.EXE
  484.  
  485.  
  486.  
  487.  
  488.                                   8
  489.  
  490.  
  491.  
  492.  
  493.             Here is the structure of the user-data area and the top of a
  494.        TINYPROG-produced EXE file:
  495.  
  496.             The  first  32 bytes are the EXE file header.   This  header
  497.        tells DOS what it needs to know to load and run the program.
  498.  
  499.             The  next  3 bytes are a jump instruction to jump  over  the
  500.        user  data area.  The first of these 3 bytes is the JMP  op-code.
  501.        The  next  two bytes are 1 word with the length in bytes  of  the
  502.        user-data area + 1.
  503.  
  504.             The next 0..60k bytes are the user-data area.
  505.  
  506.             The  user  data  area is followed by a  Control  Z  and  the
  507.        initial TINYPROG code.
  508.  
  509.  
  510.        -----------------------------------------------------------------
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.                                   9
  550.  
  551.  
  552.  
  553.  
  554.  
  555.                 PROGRAMMERS, WHAT TINYPROG DOES TO YOUR PROGRAM
  556.  
  557.  
  558.             TINYPROG  compresses  your program and adds to it  new  code
  559.        that decompresses your program whenever it is run.  TINYPROG  can
  560.        also add, to the front of the EXE file, uncompressed, unencrypted
  561.        data and text that you specify.
  562.  
  563.  
  564.             When your program runs, the TINYPROG code decrypts and  does
  565.        a  Cyclical  Redundancy Check (CRC) on  the  compressed  program.
  566.        Then the TINYPROG code decompresses your program and jumps to the
  567.        real  program beginning.  If the TINYPROG logic finds a CRC  mis-
  568.        match  or  if the decompression logic is not happy,  the  program
  569.        prints  an  error  message  to  the  screen  and  exits  with  an
  570.        ERRORLEVEL of 255.
  571.  
  572.             The  error messages are sent to the DOS STDERR file  handle.
  573.        This  file handle usually points to the PC's screen -  even  when
  574.        the  user redirects normal output (the STDOUT file handle)  to  a
  575.        file.
  576.  
  577.  
  578.             Here are the two messages and their meanings:
  579.  
  580.  
  581.                       TINYPROG says, "Bad program file!"
  582.  
  583.             The  file was not loaded as an EXE program, or  the  program
  584.        failed the CRC test.
  585.  
  586.  
  587.                        TINYPROG says, "Patched program!"
  588.  
  589.             The  decompression  logic found  something  horrible.   This
  590.        implies either a bug in the compression/decompression logic or  a
  591.        patch  that escaped the CRC check.  Tranzoa wants to  know  about
  592.        this message.
  593.  
  594.  
  595.  
  596.        -----------------------------------------------------------------
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.                                   10
  611.  
  612.  
  613.  
  614.  
  615.  
  616.                      THE COST OF TINYPROG'ING YOUR PROGRAM
  617.  
  618.  
  619.             Beyond  the zillions you send to Tranzoa, here is the  price
  620.        you  pay  for a smaller program file  and  file-corruption  self-
  621.        testing:
  622.  
  623.             1)   Slower loading.  Our benchmark, 215k program compresses
  624.        to  140k.  (It has 40k of "help" text but no big,  zeroed  memory
  625.        blocks.)   Loading  the program on a 4.77 megahertz XT  takes  an
  626.        extra  30k per second beyond disk-read time.  On a  25  megahertz
  627.        386, only from RAM disk is the extra load time perceptible.   And
  628.        then, barely so.
  629.  
  630.             2)    You  can't  patch the code.  You may,  though,  put  a
  631.        patch/configuration area in front of the program file.   Example:
  632.        the copyright at the top of TINYPROG, itself.
  633.  
  634.             3)    TINYPROG  output-programs must be  .EXE  files.   (See
  635.        below.)
  636.  
  637.             4)    Unusual programs may require more memory to  load  and
  638.        run.  (See below.)
  639.  
  640.  
  641.        -----------------------------------------------------------------
  642.  
  643.  
  644.                         TINYPROG OUTPUTS .EXE PROGRAMS
  645.  
  646.  
  647.             When you run a normal EXE program, DOS insures that there is
  648.        sufficient  memory to run the program.  COM programs  must  check
  649.        for  themselves.  If TINYPROG were to output COM programs,  extra
  650.        code  would be included with your program to check memory.   This
  651.        code  takes more space than the EXE file "header"  that  TINYPROG
  652.        includes  with  your  program.   The  EXE  file  header  and  its
  653.        information would be the only difference between a EXE file and a
  654.        COM file put out by TINYPROG.
  655.  
  656.  
  657.        -----------------------------------------------------------------
  658.  
  659.  
  660.                               MEMORY REQUIREMENTS
  661.  
  662.  
  663.             TINYPROG  adds extra code to your program.  This code  needs
  664.        approximately  1.5k bytes beyond your program's "load  image"  to
  665.        operate.   What is a "load image?"  The load image of a COM  file
  666.        is  its file length.  EXE files contain their load image size  in
  667.        some  extra  information  at  the top  of  the  file  called  the
  668.        "header."   Normally, both types of programs need more memory  to
  669.  
  670.  
  671.                                   11
  672.  
  673.  
  674.  
  675.        run  in than their load image size.  Except for extremely  simple
  676.        or  unusual programs, the extra memory needed to run the  program
  677.        exceeds  1.5k  by a good margin.  So, in a  sense,  the  TINYPROG
  678.        version of your program needs NO extra memory.
  679.  
  680.             There  is  a  notable exception to this  "no  extra  memory"
  681.        requirement:    certain  EXE  programs  have  no  initial   stack
  682.        specified.   These programs are dangerous to run with  less  than
  683.        64k  of memory remaining.  TINYPROG converts these programs in  a
  684.        way that makes them safe.  Without enough memory, DOS will simply
  685.        not load them.
  686.  
  687.             A  few  EXE programs tell DOS to give them  only  a  certain
  688.        amount of memory to run in.  When the added TINYPROG code sets up
  689.        the  run-time environment for such programs, it may cause DOS  to
  690.        give these programs slightly more memory than would have been the
  691.        case with the original program.
  692.  
  693.  
  694.        -----------------------------------------------------------------
  695.  
  696.  
  697.                                    OVERLAYS
  698.  
  699.             We're sorry.  Since overlaid programs are usually big,  they
  700.        certainly could use TINYPROG compression!  There are, of  course,
  701.        ways  to  compress overlays.  But we must wait  for  the  linkage
  702.        editor people to want the ability.
  703.  
  704.  
  705.        -----------------------------------------------------------------
  706.  
  707.  
  708.                            LONG .COM OR OTHER FILES
  709.  
  710.             In  testing,  you may have found that TINYPROG  accepts  any
  711.        input  file name other than the special DOS files, .BIN and  .SYS
  712.        files.   So, you can tell TINYPROG to convert a large  data  file
  713.        into  an EXE file.  If the data file has code up front,  it  will
  714.        actually run as a program.  Now, TINYPROG will convert these long
  715.        non-EXE  files, but when they load as programs, their stack  will
  716.        be  at the end of their 64k segment, presumably in the middle  of
  717.        the loaded program.  You can count on a few 10's of bytes in that
  718.        area being clobbered even if you swap the stack right at the  top
  719.        of the program.
  720.  
  721.  
  722.        -----------------------------------------------------------------
  723.  
  724.  
  725.                          CPU PROTECTED MODE OPERATION
  726.  
  727.             The code TINYPROG adds to your program uses segment register
  728.        arithmetic.   This  arithmetic will not work in  protected  mode.
  729.        But, it will work in VM-86 mode on a 386 or 486 CPU.
  730.  
  731.  
  732.                                   12
  733.  
  734.  
  735.  
  736.  
  737.  
  738.        -----------------------------------------------------------------
  739.  
  740.  
  741.                                 USER DATA AREA
  742.  
  743.  
  744.             Currently,  the  user-patch-area  is not in  RAM  when  your
  745.        program  gets control of the CPU.  At run-time you must  read  it
  746.        from the program file.  (Under DOS 2.x, this may not be possible.
  747.        Generally,  you must tell your user to run your  program  another
  748.        way,  or ask him for the explicit name, or do tricks to find  the
  749.        original command line in memory.)
  750.  
  751.  
  752.  
  753.                         How to Patch the User Data Area
  754.  
  755.             The user data area starts at the 35th byte of your program's
  756.        EXE file.  Its length + 1 is in the 31st and 32nd bytes as a low-
  757.        byte-first word.  The data is in the order of how it was given in
  758.        the command line.
  759.  
  760.  
  761.        -----------------------------------------------------------------
  762.        June 8, 1990
  763.        -----------------------------------------------------------------
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.                                   13
  794.