/*
 @licstart  The following is the entire license notice for the JavaScript code in this file.

 The MIT License (MIT)

 Copyright (C) 1997-2020 by Dimitri van Heesch

 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
 and associated documentation files (the "Software"), to deal in the Software without restriction,
 including without limitation the rights to use, copy, modify, merge, publish, distribute,
 sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in all copies or
 substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
 BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 @licend  The above is the entire license notice for the JavaScript code in this file
*/
var NAVTREE =
[
  [ "ResilientDB SDK", "index.html", [
    [ "Building a NFT market with resdb", "md__2github_2workspace_2docs_2nft__market.html", [
      [ "How can Sajjad sell his painting to Mo?", "md__2github_2workspace_2docs_2nft__market.html#autotoc_md1", [
        [ "The above process in terms of transactions", "md__2github_2workspace_2docs_2nft__market.html#autotoc_md2", null ]
      ] ],
      [ "Creating and Transferring Assets", "md__2github_2workspace_2docs_2nft__market.html#autotoc_md3", null ]
    ] ],
    [ "Transaction Specs", "md__2github_2workspace_2docs_2research.html", [
      [ "BigchainBD License", "md__2github_2workspace_2docs_2research.html#autotoc_md14", null ],
      [ "Making client requests Asyncronous", "md__2github_2workspace_2docs_2research.html#autotoc_md15", null ],
      [ "Remaining tasks", "md__2github_2workspace_2docs_2research.html#autotoc_md16", null ]
    ] ],
    [ "ResilientDB SDK", "md__2github_2workspace_2README.html", [
      [ "Check Python is up-to-date (3.9+)", "md__2github_2workspace_2README.html#autotoc_md18", null ],
      [ "First-time set up", "md__2github_2workspace_2README.html#autotoc_md19", null ],
      [ "Running KV service", "md__2github_2workspace_2README.html#autotoc_md20", null ],
      [ "Running Crow service (HTTP endpoints)", "md__2github_2workspace_2README.html#autotoc_md21", null ],
      [ "Testing", "md__2github_2workspace_2README.html#autotoc_md22", null ],
      [ "Running the driver", "md__2github_2workspace_2README.html#autotoc_md23", null ],
      [ "TODO", "md__2github_2workspace_2README.html#autotoc_md24", null ]
    ] ],
    [ "HTTP Server Endpoints", "md__2github_2workspace_2service_2http__server_2README.html", [
      [ "Transactions", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md26", [
        [ "GET /v1/transactions", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md27", null ],
        [ "GET /v1/transactions/<string>", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md28", null ],
        [ "GET /v1/transactions/<string>/<string>", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md29", null ],
        [ "POST /v1/transactions/commit", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md30", null ]
      ] ],
      [ "Blocks", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md31", [
        [ "GET /v1/blocks", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md32", null ],
        [ "GET /v1/blocks/<int>", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md33", null ],
        [ "GET /v1/blocks/<int>/<int>", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md34", null ]
      ] ],
      [ "Miscellaneous", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md35", [
        [ "GET /populatetable", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md36", null ]
      ] ],
      [ "Todo", "md__2github_2workspace_2service_2http__server_2README.html#autotoc_md37", null ]
    ] ],
    [ "README", "md__2github_2workspace_2service_2kv__service_2README.html", null ],
    [ "Pybind11 information", "md__2github_2workspace_2service_2pybind__sample_2README.html", [
      [ "Requirements", "md__2github_2workspace_2service_2pybind__sample_2README.html#autotoc_md39", null ],
      [ "client.cpp", "md__2github_2workspace_2service_2pybind__sample_2README.html#autotoc_md40", null ]
    ] ],
    [ "Building a NFT market with resdb", "md__2github_2workspace_2service_2sdk__validator_2docs_2nft__market.html", [
      [ "How can Sajjad sell his painting to Mo?", "md__2github_2workspace_2service_2sdk__validator_2docs_2nft__market.html#autotoc_md42", [
        [ "The above process in terms of transactions", "md__2github_2workspace_2service_2sdk__validator_2docs_2nft__market.html#autotoc_md43", null ]
      ] ],
      [ "Creating and Transferring Assets", "md__2github_2workspace_2service_2sdk__validator_2docs_2nft__market.html#autotoc_md44", null ]
    ] ],
    [ "Transaction Specs", "md__2github_2workspace_2service_2sdk__validator_2docs_2research.html", [
      [ "BigchainBD License", "md__2github_2workspace_2service_2sdk__validator_2docs_2research.html#autotoc_md55", null ],
      [ "Making client requests Asyncronous", "md__2github_2workspace_2service_2sdk__validator_2docs_2research.html#autotoc_md56", null ],
      [ "Remaining tasks", "md__2github_2workspace_2service_2sdk__validator_2docs_2research.html#autotoc_md57", null ]
    ] ],
    [ "resdb validator code in python", "md__2github_2workspace_2service_2sdk__validator_2README.html", [
      [ "Requirements", "md__2github_2workspace_2service_2sdk__validator_2README.html#autotoc_md59", null ],
      [ "entrypoint", "md__2github_2workspace_2service_2sdk__validator_2README.html#autotoc_md60", null ],
      [ "Transaction Validation", "md__2github_2workspace_2service_2sdk__validator_2README.html#autotoc_md61", null ]
    ] ],
    [ "Packages", "namespaces.html", [
      [ "Package List", "namespaces.html", "namespaces_dup" ],
      [ "Package Members", "namespacemembers.html", [
        [ "All", "namespacemembers.html", null ],
        [ "Functions", "namespacemembers_func.html", null ],
        [ "Variables", "namespacemembers_vars.html", null ]
      ] ]
    ] ],
    [ "Classes", "annotated.html", [
      [ "Class List", "annotated.html", "annotated_dup" ],
      [ "Class Index", "classes.html", null ],
      [ "Class Hierarchy", "hierarchy.html", "hierarchy" ],
      [ "Class Members", "functions.html", [
        [ "All", "functions.html", "functions_dup" ],
        [ "Functions", "functions_func.html", "functions_func" ],
        [ "Variables", "functions_vars.html", null ]
      ] ]
    ] ],
    [ "Files", "files.html", [
      [ "File List", "files.html", "files_dup" ],
      [ "File Members", "globals.html", [
        [ "All", "globals.html", null ],
        [ "Functions", "globals_func.html", null ],
        [ "Variables", "globals_vars.html", null ]
      ] ]
    ] ],
    [ "API Documentation", "^http://api.resilientdb.com", null ]
  ] ]
];

var NAVTREEINDEX =
[
"annotated.html",
"classresdb__driver_1_1transaction_1_1Transaction.html#a34ea8af38721a6873df4a2baf3e8cb93",
"classresdb__validator_1_1lib_1_1ResDB.html#aff023a8f6de8f340879aba96b266d0a4",
"dir_a17ab2ced5eb040e9917e2f945ce4020.html",
"namespacetest__driver.html#a89a7f6028a19c3dc081cc5f16eb53891"
];

var SYNCONMSG = 'click to disable panel synchronisation';
var SYNCOFFMSG = 'click to enable panel synchronisation';