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

= Apache Accumulo® User Manual Version ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}
:author: Apache Accumulo Project
:email: dev@accumulo.apache.org
:toc2:
:toclevels: 4
:toc-title: Apache Accumulo ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}
:numbered:
:website: https://accumulo.apache.org/

image::images/accumulo-logo.png[]

Copyright © 2011-2020 The Apache Software Foundation, Licensed under the Apache
License, Version 2.0.  Apache Accumulo, Accumulo, Apache, and the Apache
Accumulo project logo are trademarks of the Apache Software Foundation.

include::chapters/introduction.txt[]

include::chapters/design.txt[]

include::chapters/shell.txt[]

include::chapters/clients.txt[]

include::chapters/development_clients.txt[]

include::chapters/table_configuration.txt[]

include::chapters/iterator_design.txt[]

include::chapters/iterator_test_harness.txt[]

include::chapters/table_design.txt[]

include::chapters/high_speed_ingest.txt[]

include::chapters/analytics.txt[]

include::chapters/security.txt[]

include::chapters/replication.txt[]

include::chapters/implementation.txt[]

include::chapters/ssl.txt[]

include::chapters/kerberos.txt[]

include::chapters/sampling.txt[]

include::chapters/administration.txt[]

include::chapters/multivolume.txt[]

include::chapters/troubleshooting.txt[]

[appendix]
include::appendices/config.txt[]

