<!--

    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 repository is for storing the binary files for Apache IoTDB project's document, compiler etc..

For example, if you have a figure in `docs/UserGuide/IoTDB-Introduction/What-is-IoTDB.md` in Apache IoTDB's repository, 
then please create a folder `docs/UserGuide/IoTDB-Introduction/What-is-IoTDB` in this repository, put the figure into 
the folder, and naming a meaningful figure name to the figure.

Exception: if the markdown file name is `readme.md`, then you do not need to add new folder anymore. 
For example, if you want to add figures to `docs/Download/readme.md`, then you just need to create a folder `docs/Download`,
and put all figures to the folder.

If you need to upload figure to some module's readme.md (For example, you want to add a figure into `tsfile/readme.md`,
you have to obey the similar rule: create a folder `tsfile`, and put all figures there.
