<!-- 
   ====================================================================
   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.
   ====================================================================

   This software consists of voluntary contributions made by many
   individuals on behalf of the Apache Software Foundation.  For more
   information on the Apache Software Foundation, please see
   <http://www.apache.org/>.
 -->
<assembly>
    <id>osgi-bin</id>
    <formats>
        <format>tar.gz</format>
        <format>zip</format>
    </formats>
    <fileSets>
        <fileSet>
          <directory>httpasyncclient-osgi/target</directory>
          <outputDirectory></outputDirectory>
          <includes>
            <include>*.jar</include>
          </includes>
          <excludes>
            <exclude>*sources.jar</exclude>
          </excludes>
        </fileSet>
        <fileSet>
          <directory></directory>
          <outputDirectory></outputDirectory>
          <includes>
            <include>README.txt</include>
            <include>LICENSE.txt</include>
            <include>NOTICE.txt</include>
            <include>RELEASE_NOTES.txt</include>
            <include>NTLM_SUPPORT.txt</include>
          </includes>
        </fileSet>
        <!-- Javadocs -->
        <fileSet>
          <directory>target/site/apidocs</directory>
          <outputDirectory>javadoc</outputDirectory>
        </fileSet>
        <!-- Examples -->
        <fileSet>
          <directory>httpasyncclient/src/examples/</directory>
          <outputDirectory>examples</outputDirectory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
    </fileSets>
</assembly>
