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

<settings>

  <servers>
    <!-- To publish a snapshot -->
    <server>
      <id>apache.snapshots.https</id>
      <username>__Your_apache_login__</username>
      <password>{0Lbb__Your_encrypted_password__O4sQ=}</password>
    </server>

    <!-- To publish a release -->
    <server>
      <id>apache.releases.https</id>
      <username>__Your_apache_login__</username>
      <password>{0Lbb__Your_encrypted_password__O4sQ=}</password>
    </server>

    <!-- To stage the web site -->
    <server>
      <id>stagingSite</id>
      <username>__Your_apache_login__</username>
      <!-- This will use the default ssh key pair, whose public part must be
           copied to the ~/.ssh/authorized_keys file on the server. -->
    </server>

    <!-- To publish the web site -->
    <server>
      <id>people.apache.org</id>
      <username>__Your_apache_login__</username>
      <!-- This will use the default ssh key pair, whose public part must be
           copied to the ~/.ssh/authorized_keys file on the server. -->
    </server>

  </servers>

  <profiles>
    <profile>
      <id>release</id>
      <properties>
        <gpg.keyname>__Your_key_identifier__</gpg.keyname>
      </properties>
    </profile>
  </profiles>

</settings>
