<!--
  ~  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 Zest™ Community
  </corpauthor>
</authorgroup>

<copyright>
  <year>2011</year>
  <holder>Zest™ 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>

