<!--
  ~  Licensed to the Apache Software Foundation (ASF) under one
  ~  or more contributor license agreements.  See the NOTICE file
  ~  distributed with this work for additional information
  ~  regarding copyright ownership.  The ASF licenses this file
  ~  to you under the Apache License, Version 2.0 (the
  ~  "License"); you may not use this file except in compliance
  ~  with the License.  You may obtain a copy of the License at
  ~
  ~       http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~  Unless required by applicable law or agreed to in writing, software
  ~  distributed under the License is distributed on an "AS IS" BASIS,
  ~  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~  See the License for the specific language governing permissions and
  ~  limitations under the License.
  ~
  ~
  -->
<authorgroup>
  <corpauthor>The Polygene™ Community
  </corpauthor>
</authorgroup>

<copyright>
<year>2011</year>
<holder>Polygene™ Community</holder>
</copyright>

<legalnotice>
<title>License: Apache License 2.0</title>
<simpara>This book is presented in open source and licensed through
  Apache License 2.0.
  You are free to copy, distribute, transmit, and/or adapt the work. This license is based upon the following
  conditions:
</simpara>
<formalpara>
  <title>Attribution</title>
  <para>You must attribute the work in the manner specified by the
    author or licensor (but not in any way that suggests that they
    endorse you or your use of the work).</para>
</formalpara>
<simpara>
  Any of the above conditions can be waived only if you get permission from the copyright holder.
</simpara>
<simpara>
  In no way are any of the following rights affected by the license:
</simpara>
<itemizedlist>
  <listitem>
    <simpara>
      Your fair dealing or fair use rights
    </simpara>
  </listitem>
  <listitem>
    <simpara>
      The author&#8217;s moral rights
    </simpara>
  </listitem>
  <listitem>
    <simpara>
      Rights other persons may have either in the work itself or in how the work is used, such as publicity or
      privacy rights
    </simpara>
  </listitem>
</itemizedlist>
<note>
  <simpara>
    For any reuse or distribution, you must make clear to the others the license terms of this work. The best way
    to do this is with a direct link to this page:
    <ulink url="http://apache.org/licenses/LICENSE-2.0">http://apache.org/licenses/LICENSE-2.0</ulink>
  </simpara>
</note>
</legalnotice>

