      The RAR Archiver
      EULA (End User License Agreement) for use and distribution


      The RAR archiver is distributed as try before you buy. This means:

   1. All copyrights to RAR are exclusively owned by the author
      - Alexander Roshal.

   2. Anyone may use this software during a test period of 40 days.
      Following this test period of 40 days or less, if you wish to
      continue to use RAR, you must purchase a license.

   3. There are 2 basic types of licenses issued for RAR, these are:
 
      a.  A single computer usage license. The user purchases one license
          to use RAR archiver on one computer.

          Home users may use their single computer usage license on
          all computers which are in property of the license owner.

          Business users require one license per computer RAR is
          installed on.

      b.  A multiple usage license. The user purchases a number of usage
          licenses for use, by the purchaser or the purchaser's employees
          on the same number of computers.

          In a network (server/client) environment you must purchase
          a license copy for each separate client (workstation)
          on which RAR is installed, used, or accessed. A separate
          license copy for each client (workstation) is needed regardless
          of whether the clients (workstations) will use RAR simultaneously
          or at different times. If for example you wish to have
          9 different clients (workstations) in your network with access
          to RAR, you must purchase 9 license copies.

      A user who purchased a RAR license, is granted a non-exclusive
      right to use RAR on as many computers as defined by the licensing
      terms above according to the number of licenses purchased,
      for any legal purpose. The licensed RAR software may not be rented
      or leased, but may be permanently transferred, in it's entirety,
      if the person receiving it agrees to the terms of this license.
      If the software is an update, the transfer must include the update
      and all previous versions.      

   4. Licensing for RAR on mobile devices (U3 stick, USB stick,
      external harddrive):

      In addition to the terms stated above following licensing terms
      apply to the licensing of RAR on mobile devices.

      a.  A single computer usage license. Home users may use their
          single computer usage license on all mobile devices which are
          in property of the license owner.

          Business users may use their single computer usage license
          on one computer and one mobile device.

      b.  A multiple usage license. Users who own a multiple usage
          license may use that license on the same number of mobile
          devices as number of computers (clients) the license was
          purchased for.

          The number of computers/devices running RAR at any time is
          limited to the number of licenses purchased according to the
          licensing terms above.

      A licensed version of RAR on a mobile device may be used by
      the purchaser or the purchaser's employees, on several computers
      consecutively.

      There are no additional license fees, apart from the cost of
      purchasing a license, associated with the use of RAR from
      a mobile device on computers that are not owned by the owner
      of the RAR license.

   5. The RAR/WinRAR unlicensed trial version may be freely distributed,
      with exceptions noted below, provided the distribution package is not
      modified in any way.
      
      a.  No person or company may distribute separate parts of the package
          with the exception of the UnRAR components, without written
          permission of the copyright owner.
      
      b.  The RAR/WinRAR unlicensed trial version may not be distributed
          inside of any other software package without written permission
          of the copyright owner.

      c.  Hacks/cracks, keys or key generators may not be included on the
          same distribution.

   6. To buy a license please see order.htm for details.

   7. THE RAR ARCHIVER IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY
      KIND IS EXPRESSED OR IMPLIED. YOU USE AT YOUR OWN RISK.
      NEITHER THE AUTHOR NOR THE AGENTS OF THE AUTHOR WILL BE LIABLE 
      FOR DATA LOSS, DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS
      WHILE USING OR MISUSING THIS SOFTWARE.

   8. There are no additional license fees, apart from the cost of
      purchasing a license, associated with the creation and distribution
      of RAR archives, volumes, self-extracting archives or self-extracting
      volumes. Legally registered owners may use their copies of RAR/WinRAR
      to produce archives and self-extracting archives and to distribute
      those archives free of any additional RAR royalties.

   9. You may not use, copy, emulate, clone, rent, lease, sell, modify,
      decompile, disassemble, otherwise reverse engineer, or transfer
      the licensed program, or any subset of the licensed program, except
      as provided for in this agreement. Any such unauthorized use shall
      result in immediate and automatic termination of this license and
      may result in criminal and/or civil prosecution.

      7zxa.dll library is copyrighted by Igor Pavlov and distributed 
      under LGPL Version 3 license ( http://www.gnu.org/licenses/lgpl.html ). 
      You can modify portions of 7zxa.dll and perform reverse engineering 
      solely for purpose of debugging such 7zxa.dll modifications according 
      to LGPL. Source code of 7zxa.dll is available on www.7-zip.org.

      Neither RAR binary code, WinRAR binary code, UnRAR source or UnRAR
      binary code may be used or reverse engineered to re-create the RAR
      compression algorithm, which is proprietary, without written
      permission of the author.

      RAR and WinRAR keyfiles may not be distributed, except as stated
      in item 3) above, outside of the area of legal control of the
      person or persons who purchased the original license, without
      written permission of the copyright holder.

      All rights not expressly granted here are reserved by Alexander Roshal.

  10. Installing and using RAR/WinRAR signifies acceptance of these terms
      and conditions of the license.

  11. If you do not agree with the terms of this license you must
      remove RAR/WinRAR files from your storage devices and cease to
      use the product.

      Thank you for using the original RAR.

                                            Alexander L. Roshal

