<!--

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

-->
<form action="" method="post">
  <h2>Admin Party!</h2>
  <fieldset>
    <p class="help">
      The test suite requires CouchDB to be in <em>Admin Party</em> mode. This
      mode give all users admin capabilities. This is the least secure mode of 
      operation. Do not run the tests on production servers, as you'll impact 
      both performance and security.
    </p>
    <p class="help">
      Clicking “Remove Admins” will remove all admins from the configuration. You will
      have to recreate any admins by hand after the tests have finished.
    </p>
  </fieldset>
  <div class="buttons">
    <button type="submit">Remove Admins</button>
    <button type="button" class="cancel">Cancel</button>
  </div>
</form>
