
                      The Apache Software Foundation
  Software Grant and Corporate Contributor License Agreement ("Agreement")
                      http://www.apache.org/licenses/
                              (v r190612)


   Thank you for your interest in The Apache Software Foundation (the
   "Foundation"). In order to clarify the intellectual property license
   granted with Contributions from any person or entity, the Foundation
   must have a Contributor License Agreement (CLA) on file that has been
   signed by each Contributor, indicating agreement to the license terms
   below. This license is for your protection as a Contributor as well
   as the protection of the Foundation and its users; it does not change
   your rights to use your own Contributions for any other purpose.

   This version of the Agreement allows an entity (the "Corporation") to
   submit Contributions to the Foundation, to authorize Contributions 
   submitted by its designated employees to the Foundation, and to grant 
   copyright and patent licenses thereto.

   If you have not already done so, please complete and sign, then scan and
   email a pdf file of this Agreement to secretary@apache.org. Alternatively,
   you may send it by facsimile to the Foundation at +1-919-573-9199. If
   necessary, send an original signed Agreement to The Apache Software
   Foundation, Dept. 9660, Los Angeles, CA 90084-9660, U.S.A.
   Please read this document carefully before signing and keep a copy for
   your records.

   Corporation name:    ________________________________________________

   Corporation address: ________________________________________________

                        ________________________________________________

                        ________________________________________________

   Point of Contact:    ________________________________________________

          E-Mail:       ________________________________________________

          Telephone:    _____________________ Fax: _____________________


   You accept and agree to the following terms and conditions for Your
   present and future Contributions submitted to the Foundation. In
   return, the Foundation shall not use Your Contributions in a way that
   is contrary to the public benefit or inconsistent with its nonprofit
   status and bylaws in effect at the time of the Contribution. Except
   for the license granted herein to the Foundation and recipients of
   software distributed by the Foundation, You reserve all right, title,
   and interest in and to Your Contributions.

   1. Definitions.

      "You" (or "Your") shall mean the copyright owner or legal entity
      authorized by the copyright owner that is making this Agreement
      with the Foundation. For legal entities, the entity making a
      Contribution and all other entities that control, are controlled by,
      or are under common control with that entity are considered to be a
      single Contributor. For the purposes of this definition, "control"
      means (i) the power, direct or indirect, to cause the direction or
      management of such entity, whether by contract or otherwise, or
      (ii) ownership of fifty percent (50%) or more of the outstanding
      shares, or (iii) beneficial ownership of such entity.

      "Contribution" shall mean the code, documentation or other original
      works of authorship expressly identified in Schedule B, as well as
      any original work of authorship, including
      any modifications or additions to an existing work, that is intentionally
      submitted by You to the Foundation for inclusion in, or
      documentation of, any of the products owned or managed by the
      Foundation (the "Work"). For the purposes of this definition,
      "submitted" means any form of electronic, verbal, or written
      communication sent to the Foundation or its representatives,
      including but not limited to communication on electronic mailing
      lists, source code control systems, and issue tracking systems
      that are managed by, or on behalf of, the Foundation for the
      purpose of discussing and improving the Work, but excluding
      communication that is conspicuously marked or otherwise designated
      in writing by You as "Not a Contribution."

   2. Grant of Copyright License. Subject to the terms and conditions
      of this Agreement, You hereby grant to the Foundation and to
      recipients of software distributed by the Foundation a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare derivative works of,
      publicly display, publicly perform, sublicense, and distribute
      Your Contributions and such derivative works.

   3. Grant of Patent License. Subject to the terms and conditions of
      this Agreement, You hereby grant to the Foundation and to recipients
      of software distributed by the Foundation a perpetual, worldwide,
      non-exclusive, no-charge, royalty-free, irrevocable (except as
      stated in this section) patent license to make, have made, use,
      offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by You that are necessarily infringed by Your Contribution(s)
      alone or by combination of Your Contribution(s) with the Work to
      which such Contribution(s) were submitted. If any entity institutes
      patent litigation against You or any other entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that your
      Contribution, or the Work to which you have contributed, constitutes
      direct or contributory patent infringement, then any patent licenses
      granted to that entity under this Agreement for that Contribution or
      Work shall terminate as of the date such litigation is filed.

   4. You represent that You are legally entitled to grant the above
      license. You represent further that each employee of the
      Corporation designated on Schedule A below (or in a subsequent
      written modification to that Schedule) is authorized to submit
      Contributions on behalf of the Corporation.

   5. You represent that each of Your Contributions is Your original
      creation (see section 7 for submissions on behalf of others).

   6. You are not expected to provide support for Your Contributions,
      except to the extent You desire to provide support. You may provide
      support for free, for a fee, or not at all. Unless required by
      applicable law or agreed to in writing, You provide Your
      Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
      OF ANY KIND, either express or implied, including, without
      limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
      MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.

   7. Should You wish to submit work that is not Your original creation,
      You may submit it to the Foundation separately from any
      Contribution, identifying the complete details of its source and
      of any license or other restriction (including, but not limited
      to, related patents, trademarks, and license agreements) of which
      you are personally aware, and conspicuously marking the work as
      "Submitted on behalf of a third-party: [named here]".

   8. It is your responsibility to notify the Foundation when any change
      is required to the list of designated employees authorized to submit
      Contributions on behalf of the Corporation, or to the Corporation's
      Point of Contact with the Foundation.



   Please sign: __________________________________ Date: _______________

   Title:       __________________________________

   Corporation: __________________________________


Schedule A

   [Initial list of designated employees.  NB: authorization is not
    tied to particular Contributions.]




Schedule B

   [Identification of optional concurrent software grant.  Would be
    left blank or omitted if there is no concurrent software grant.]

