pax_global_header00006660000000000000000000000064134526575170014531gustar00rootroot0000000000000052 comment=fe5275aa7b6a1372e96e8ff416c38d1790928893 include-what-you-use-clang_8.0/000077500000000000000000000000001345265751700165345ustar00rootroot00000000000000include-what-you-use-clang_8.0/.clang-format000066400000000000000000000001451345265751700211070ustar00rootroot00000000000000BasedOnStyle: Google AllowShortBlocksOnASingleLine: false AllowShortIfStatementsOnASingleLine: false include-what-you-use-clang_8.0/.gitignore000066400000000000000000000001341345265751700205220ustar00rootroot00000000000000*.pyc __pycache__ # Visual Studio Code .vscode .gdb_history compile_commands.json include-what-you-use-clang_8.0/.markdownlint.json000066400000000000000000000001501345265751700222120ustar00rootroot00000000000000{ "default": true, "MD013": false, "MD014": false, "MD026": false, "MD038": false } include-what-you-use-clang_8.0/.travis.yml000066400000000000000000000024711345265751700206510ustar00rootroot00000000000000 language: cpp addons: apt: sources: - ubuntu-toolchain-r-test - llvm-toolchain-trusty packages: - ninja-build # TODO: These should really be the snapshots packages, but they are currently # broken. Remove the '-9' once they get fixed (see issue #642 for more info) - llvm-9-dev - llvm-9-tools - libclang-9-dev - clang-9 before_install: # Install a supported cmake version (>= 3.4.3) - wget -O cmake.sh https://cmake.org/files/v3.10/cmake-3.10.0-rc1-Linux-x86_64.sh - sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/usr/local # Extract the version number from the most-recently installed LLVM - VERSION=`ls -t /usr/lib/ | grep '^llvm-' | head -n 1 | sed -E 's/llvm-(.+)/\1/'` # Absolute paths to LLVM's root and bin directory - ROOT_PATH=`llvm-config-$VERSION --prefix` - BIN_PATH=`llvm-config-$VERSION --bindir` script: # Build IWYU - mkdir build - cd build - cmake -GNinja -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=yes -DCMAKE_PREFIX_PATH=$ROOT_PATH -DCMAKE_C_COMPILER=$BIN_PATH/clang -DCMAKE_CXX_COMPILER=$BIN_PATH/clang++ -DCMAKE_INSTALL_PREFIX=./ ../ - ninja install # Test IWYU - cd .. - python run_iwyu_tests.py -- build/bin/include-what-you-use - python fix_includes_test.py - python iwyu_tool_test.py include-what-you-use-clang_8.0/CMakeLists.txt000066400000000000000000000071031345265751700212750ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.4.3) if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) message(STATUS "IWYU: out-of-tree configuration") set(IWYU_IN_TREE OFF) else() message(STATUS "IWYU: in-tree configuration") set(IWYU_IN_TREE ON) endif() if (NOT IWYU_IN_TREE) cmake_policy(SET CMP0048 NEW) project(include-what-you-use) find_package(LLVM CONFIG REQUIRED) find_package(Clang CONFIG REQUIRED) list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR}) include(AddLLVM) include(HandleLLVMOptions) endif() message(STATUS "IWYU: configuring for LLVM ${LLVM_VERSION}...") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) add_definitions(${LLVM_DEFINITIONS}) include_directories( ${LLVM_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS} ) set(LLVM_LINK_COMPONENTS Option Support X86AsmParser X86Desc X86Info ) add_llvm_executable(include-what-you-use iwyu.cc iwyu_ast_util.cc iwyu_cache.cc iwyu_driver.cc iwyu_getopt.cc iwyu_globals.cc iwyu_include_picker.cc iwyu_lexer_utils.cc iwyu_location_util.cc iwyu_output.cc iwyu_path_util.cc iwyu_preprocessor.cc iwyu_verrs.cc ) if (IWYU_IN_TREE) # Add a dependency on clang-headers to ensure the builtin headers are # available when IWYU is executed from the build dir. # The clang-headers target is only available in in-tree builds. add_dependencies(include-what-you-use clang-headers) endif() if (MINGW) # Work around 'too many sections' error with MINGW/GCC set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj") endif() if (MSVC) # Disable warnings for IWYU, and disable exceptions in MSVC's STL. add_definitions( -wd4722 # Suppress ''destructor'' : destructor never returns, potential memory leak -D_HAS_EXCEPTIONS=0 ) # Enable bigobj support and sane C++ exception semantics. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj /EHsc") # Put project in solution folder set_target_properties(include-what-you-use PROPERTIES FOLDER "Clang executables" ) endif() target_link_libraries(include-what-you-use PRIVATE clangBasic clangLex clangAST clangSema clangFrontend clangDriver # Revision [1] in clang moved PCHContainerOperations from Frontend # to Serialization, but this broke builds that set # -DBUILD_SHARED_LIBS=on. Revision [2] is a followup that works # around the issue by adding an explicit dependency on Serialization # wherever there was a dependency on Frontend. Since we depend on # Frontend, we need an explicit dependency on Serialization too. # [1] https://llvm.org/viewvc/llvm-project?view=revision&revision=348907 # [2] https://llvm.org/viewvc/llvm-project?view=revision&revision=348915 clangSerialization ) # Platform dependencies. if (WIN32) target_link_libraries(include-what-you-use PRIVATE shlwapi # For PathMatchSpecA ) endif() # Pick up Git revision so we can report it in version information. include(FindGit) if (GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE IWYU_GIT_REV OUTPUT_STRIP_TRAILING_WHITESPACE) else() message(STATUS "Warning: IWYU Git version info not found, DO NOT release " "from this build tree!") endif() add_definitions(-DIWYU_GIT_REV="${IWYU_GIT_REV}") # Install programs install(TARGETS include-what-you-use RUNTIME DESTINATION bin) install(PROGRAMS fix_includes.py iwyu_tool.py DESTINATION bin) # Install mapping files file(GLOB MAPPING_FILES *.imp) install(FILES ${MAPPING_FILES} DESTINATION share/include-what-you-use) include-what-you-use-clang_8.0/CONTRIBUTING.md000066400000000000000000000110311345265751700207610ustar00rootroot00000000000000# Instructions for Developers # ## Submitting Patches ## We welcome patches and rely on your contributions to make IWYU smarter. Use GitHub's [pull request system](https://github.com/include-what-you-use/include-what-you-use/pulls) to submit change requests to the `include-what-you-use/include-what-you-use` repo. It's usually a good idea to run ideas by the [IWYU mailing list](http://groups.google.com/group/include-what-you-use) to get general agreement on directions before you start hacking. ## Running the Tests ## If fixing a bug in clang, please add a test to the test suite! You can create a file called `whatever.cc` (_not_ .cpp), and, if necessary, `whatever.h`, and `whatever-.h`. You may be able to get away without adding any `.h` files, and just including `direct.h` -- see, for instance, `tests/remove_fwd_decl_when_including.cc`. To run the IWYU tests, run python run_iwyu_tests.py It runs one test for each `.cc` file in the `tests/` directory. (We have additional tests in `more_tests/`, but have not yet gotten the testing framework set up for those tests.) The test runner searches for IWYU in the system `PATH` by default. The output can be a bit hard to read, but if a test fails, the reason why will be listed after the `ERROR:root:Test failed for xxx` line. You can select individual tests by listing their filename without extension as arguments python run_iwyu_tests.py array macro_location If you don't want to modify your `PATH` you can specify which IWYU executable to use for testing python run_iwyu_tests.py -- ./include-what-you-use (put any test names before '--' and the IWYU path after.) When fixing `fix_includes.py`, add a test case to `fix_includes_test.py` and run python fix_includes_test.py ## Debugging ## It's possible to run include-what-you-use in `gdb`, to debug that way. Another useful tool -- especially in combination with `gdb` -- is to get the verbose include-what-you-use output. See `iwyu_output.h` for a description of the verbose levels. Level 7 is very verbose -- it dumps basically the entire AST as it's being traversed, along with IWYU decisions made as it goes -- but very useful for that: env IWYU_VERBOSE=7 make -k CXX=/path/to/llvm/Debug+Asserts/bin/include-what-you-use 2>&1 > /tmp/iwyu.verbose ## A Quick Tour of the Codebase ## The codebase is strewn with TODOs of known problems, and also language constructs that aren't adequately tested yet. So there's plenty to do! Here's a brief guide through the codebase: * `iwyu.cc`: the main file, it includes the logic for deciding when a symbol has been 'used', and whether it's a full use (definition required) or forward-declare use (only a declaration required). It also includes the logic for following uses through template instantiations. * `iwyu_driver.cc`: responsible for creating and configuring a Clang compiler from command-line arguments. * `iwyu_output.cc`: the file that translates from 'uses' into IWYU violations. This has the logic for deciding if a use is covered by an existing `#include` (or is a built-in). It also, as the name suggests, prints the IWYU output. * `iwyu_preprocessor.cc`: handles the preprocessor directives, the `#includes` and `#ifdefs`, to construct the existing include-tree. This is obviously essential for include-what-you-use analysis. This file also handles the IWYU pragma-comments. * `iwyu_include_picker.cc`: this finds canonical `#includes`, handling private->public mappings (like `bits/stl_vector.h` -> `vector`) and symbols with multiple possible #includes (like `NULL`). Additional mappings are maintained in a set of .imp files separately, for easier per-platform/-toolchain customization. * `iwyu_cache.cc`: holds the cache of instantiated templates (may hold other cached info later). This is data that is expensive to compute and may be used more than once. * `iwyu_globals.cc`: holds various global variables. We used to think globals were bad, until we saw how much having this file simplified the code... * `iwyu_*_util(s).h` and `.cc`: utility functions of various types. The most interesting, perhaps, is `iwyu_ast_util.h`, which has routines that make it easier to navigate and analyze the clang AST. There are also some STL helpers, string helpers, filesystem helpers, etc. * `iwyu_verrs.cc`: debug logging for IWYU. * `port.h`: shim header for various non-portable constructs. * `iwyu_getopt.cc`: portability shim for GNU `getopt(_long)`. Custom `getopt(_long)` implementation for Windows. * `fix_includes.py`: the helper script that edits a file based on the IWYU recommendations. include-what-you-use-clang_8.0/LICENSE.TXT000066400000000000000000000055771345265751700202350ustar00rootroot00000000000000============================================================================== LLVM Release License ============================================================================== University of Illinois/NCSA Open Source License Copyright (c) 2003-2010 University of Illinois at Urbana-Champaign. All rights reserved. Developed by: LLVM Team University of Illinois at Urbana-Champaign http://llvm.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with 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: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution. * Neither the names of the LLVM Team, University of Illinois at Urbana-Champaign, nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission. 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 CONTRIBUTORS 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 WITH THE SOFTWARE. ============================================================================== Copyrights and Licenses for Third Party Software Distributed with LLVM: ============================================================================== The LLVM software contains code written by third parties. Such software will have its own individual LICENSE.TXT file in the directory in which it appears. This file will describe the copyrights, license, and restrictions which apply to that code. The disclaimer of warranty in the University of Illinois Open Source License applies to all code in the LLVM Distribution, and nothing in any of the other licenses gives permission to use the names of the LLVM Team or the University of Illinois to endorse or promote products derived from this Software. The following pieces of software have additional or alternate copyrights, licenses, and/or restrictions: Program Directory ------- --------- getopt_port include-what-you-use/iwyu_getopt.* include-what-you-use-clang_8.0/README.md000066400000000000000000000225221345265751700200160ustar00rootroot00000000000000# Include What You Use # [![Build Status](https://travis-ci.org/include-what-you-use/include-what-you-use.svg?branch=master)](https://travis-ci.org/include-what-you-use/include-what-you-use) For more in-depth documentation, see [docs](docs). ## Instructions for Users ## "Include what you use" means this: for every symbol (type, function, variable, or macro) that you use in `foo.cc` (or `foo.cpp`), either `foo.cc` or `foo.h` should include a .h file that exports the declaration of that symbol. (Similarly, for `foo_test.cc`, either `foo_test.cc` or `foo.h` should do the including.) Obviously symbols defined in `foo.cc` itself are excluded from this requirement. This puts us in a state where every file includes the headers it needs to declare the symbols that it uses. When every file includes what it uses, then it is possible to edit any file and remove unused headers, without fear of accidentally breaking the upwards dependencies of that file. It also becomes easy to automatically track and update dependencies in the source code. ### CAVEAT ### This is alpha quality software -- at best (as of July 2018). It was originally written to work specifically in the Google source tree, and may make assumptions, or have gaps, that are immediately and embarrassingly evident in other types of code. While we work to get IWYU quality up, we will be stinting new features, and will prioritize reported bugs along with the many existing, known bugs. The best chance of getting a problem fixed is to submit a patch that fixes it (along with a test case that verifies the fix)! ### How to Build ### Include-what-you-use makes heavy use of Clang internals, and will occasionally break when Clang is updated. Usually such discrepancies are detected by build bot and fixed promptly. The master branch follows Clang trunk. We also have convenience tags and branches for released versions of Clang (called `clang_`, e.g. `clang_5.0`). To build against a Clang release, check out the corresponding branch in IWYU before configuring the build. More details in the instructions below. We assume you already have compiled LLVM and Clang libraries on your system, either via packages for your platform or built from source. > NOTE: If you use the Debian/Ubuntu packaging available from , you'll need the following packages installed: > > * `llvm--dev` > * `libclang--dev` > * `clang-` > > Packaging for other platforms will likely be subtly different. To set up an environment for building: * Create a directory for IWYU development, e.g. `iwyu` * Clone the IWYU Git repo: iwyu$ git clone https://github.com/include-what-you-use/include-what-you-use.git * Presumably, you'll be building IWYU with a released version of LLVM and Clang, so check out the corresponding branch. For example, if you have Clang 6.0 installed, use the `clang_6.0` branch. IWYU `master` tracks LLVM & Clang trunk: iwyu$ cd include-what-you-use iwyu/include-what-you-use$ git checkout clang_6.0 * Create a build root and use CMake to generate a build system linked with LLVM/Clang prebuilts: # This example uses the Makefile generator, but anything should work. iwyu/include-what-you-use$ cd .. iwyu$ mkdir build && cd build # For IWYU 0.10/Clang 6 and earlier iwyu/build$ cmake -G "Unix Makefiles" -DIWYU_LLVM_ROOT_PATH=/usr/lib/llvm-6.0 ../include-what-you-use # For IWYU 0.11/Clang 7 and later iwyu/build$ cmake -G "Unix Makefiles" -DCMAKE_PREFIX_PATH=/usr/lib/llvm-7 ../include-what-you-use or, if you have a local LLVM and Clang build tree, you can specify that as `CMAKE_PREFIX_PATH` for IWYU 0.11 and later: iwyu/build$ cmake -G "Unix Makefiles" -DCMAKE_PREFIX_PATH=/llvm-trunk/build ../include-what-you-use * Once CMake has generated a build system, you can invoke it directly from `build`, e.g. iwyu/build$ make Instructions for building Clang are available at . ### How to Install ### If you're building IWYU out-of-tree or installing pre-built binaries, you need to make sure it can find Clang built-in headers (`stdarg.h` and friends.) Clang's default policy is to look in `path/to/clang-executable/../lib/clang//include`. So if Clang 3.5.0 is installed in `/usr/bin`, it will search for built-ins in `/usr/lib/clang/3.5.0/include`. Clang tools have the same policy by default, so in order for IWYU to analyze any non-trivial code, it needs to find Clang's built-ins in `path/to/iwyu/../lib/clang/3.5.0/include` where `3.5.0` is a stand-in for the version of Clang your IWYU was built against. Note that some distributions/packages may have different defaults, you can use `clang -print-resource-dir` to find the base path of the built-in headers on your system. So for IWYU to function correctly, you need to copy the Clang `include` directory to the expected location before running (similarly, use `include-what-you-use -print-resource-dir` to learn exactly where IWYU wants the headers). This weirdness is tracked in [issue 100](https://github.com/include-what-you-use/include-what-you-use/issues/100), hopefully we can make this more transparent over time. ### How to Run ### The original design was built for Make, but a number of alternative run modes have come up over the years. #### Plugging into Make #### The easiest way to run IWYU over your codebase is to run make -k CXX=/path/to/llvm/Debug+Asserts/bin/include-what-you-use or make -k CXX=/path/to/llvm/Release/bin/include-what-you-use (include-what-you-use always exits with an error code, so the build system knows it didn't build a .o file. Hence the need for `-k`.) Include-what-you-use only analyzes .cc (or .cpp) files built by `make`, along with their corresponding .h files. If your project has a .h file with no corresponding .cc file, IWYU will ignore it unless you use the `--check_also` switch to add it for analysis together with a .cc file. #### Using with CMake #### CMake has grown native support for IWYU as of version 3.3. See [their documentation](https://cmake.org/cmake/help/latest/prop_tgt/LANG_INCLUDE_WHAT_YOU_USE.html) for CMake-side details. The `CMAKE_CXX_INCLUDE_WHAT_YOU_USE` option enables a mode where CMake first compiles a source file, and then runs IWYU on it. Use it like this: mkdir build && cd build CC="clang" CXX="clang++" cmake -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE="path/to/iwyu;-Xiwyu;any;-Xiwyu;iwyu;-Xiwyu;args" ... or, on Windows systems: mkdir build && cd build cmake -DCMAKE_CXX_COMPILER="%VCINSTALLDIR%/bin/cl.exe" -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE="path/to/iwyu;-Xiwyu;any;-Xiwyu;iwyu;-Xiwyu;args" -G Ninja ... The option appears to be separately supported for both C and C++, so use `CMAKE_C_INCLUDE_WHAT_YOU_USE` for C code. Note that with Microsoft's Visual C++ compiler, IWYU needs the `--driver-mode=cl` argument to understand the MSVC options from CMake. #### Using with a compilation database #### The `iwyu_tool.py` script predates the native CMake support, and works off the [compilation database format](https://clang.llvm.org/docs/JSONCompilationDatabase.html). For example, CMake generates such a database named `compile_commands.json` with the `CMAKE_EXPORT_COMPILE_COMMANDS` option enabled. The script's command-line syntax is designed to mimic Clang's LibTooling, but they are otherwise unrelated. It can be used like this: mkdir build && cd build CC="clang" CXX="clang++" cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ... iwyu_tool.py -p . or, on Windows systems: mkdir build && cd build cmake -DCMAKE_CXX_COMPILER="%VCINSTALLDIR%/bin/cl.exe" -DCMAKE_C_COMPILER="%VCINSTALLDIR%/VC/bin/cl.exe" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja ... python iwyu_tool.py -p . Unless a source filename is provided, all files in the project will be analyzed. See `iwyu_tool.py --help` for more options. #### Applying fixes #### We also include a tool that automatically fixes up your source files based on the IWYU recommendations. This is also alpha-quality software! Here's how to use it (requires python): make -k CXX=/path/to/llvm/Debug+Asserts/bin/include-what-you-use 2> /tmp/iwyu.out python fix_includes.py < /tmp/iwyu.out If you don't like the way `fix_includes.py` munges your `#include` lines, you can control its behavior via flags. `fix_includes.py --help` will give a full list, but these are some common ones: * `-b`: Put blank lines between system and Google includes * `--nocomments`: Don't add the 'why' comments next to includes ### How to Correct IWYU Mistakes ### * If `fix_includes.py` has removed an `#include` you actually need, add it back in with the comment '`// IWYU pragma: keep`' at the end of the `#include` line. Note that the comment is case-sensitive. * If `fix_includes.py` has added an `#include` you don't need, just take it out. We hope to come up with a more permanent way of fixing later. * If `fix_includes.py` has wrongly added or removed a forward-declare, just fix it up manually. * If `fix_includes.py` has suggested a private header file (such as ``) instead of the proper public header file (``), you can fix this by inserting a specially crafted comment near top of the private file (assuming you can write to it): '`// IWYU pragma: private, include "the/public/file.h"`'. Current IWYU pragmas are described in [IWYUPragmas](docs/IWYUPragmas.md). include-what-you-use-clang_8.0/boost-1.64-all-private.imp000066400000000000000000030173061345265751700232070ustar00rootroot00000000000000[ #grep -r '^ *# *include' boost/ | grep -e "boost/[^:]*/detail/.*hp*:" -e "boost/[^:]*/impl/.*hp*:" | grep -e "\:.*/detail/" -e "\:.*/impl/" | perl -nle 'm/^([^:]+).*["<]([^>]+)[">]/ && print qq@ { include: ["<$2>", private, "<$1>", private ] },@' | grep -e \\[\"\", private, "", private ] }, # { include: ["", private, "", private ] }, # # { include: ["", private, "", private ] }, # { include: ["", private, "", private ] }, # { include: ["", private, "", private ] }, # { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] } ] include-what-you-use-clang_8.0/boost-1.64-all.imp000066400000000000000000031472521345265751700215430ustar00rootroot00000000000000[ # cd /usr/include && grep -r --exclude-dir={detail,impl} '^ *# *include' boost/ | perl -nle 'm/^([^:]+).*["<]([^>]+)[">]/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | grep -e \/detail\/ -e \/impl\/ | grep -e \\[\"\", private, "", public ] }, { include: ["@", private, "", public ] }, { include: ["@", private, "", public ] }, { include: ["@", private, "", public ] }, #manually delete $ sed '/workarounds*\.hpp/d' -i boost-all.imp #also good idea to remove all lines refering to folders above (e.g., sed '/\/format\//d' -i boost-all.imp) #programatically include: { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, ] include-what-you-use-clang_8.0/boost-all-private.imp000066400000000000000000020730011345265751700226120ustar00rootroot00000000000000[ #grep -r '^ *# *include' boost/ | grep -e "boost/[^:]*/detail/.*hp*:" -e "boost/[^:]*/impl/.*hp*:" | grep -e "\:.*/detail/" -e "\:.*/impl/" | perl -nle 'm/^([^:]+).*["<]([^>]+)[">]/ && print qq@ { include: ["<$2>", private, "<$1>", private ] },@' | grep -e \\[\"\", private, "", private ] }, # { include: ["", private, "", private ] }, # # { include: ["", private, "", private ] }, # { include: ["", private, "", private ] }, # { include: ["", private, "", private ] }, # { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] } ] include-what-you-use-clang_8.0/boost-all.imp000066400000000000000000025401241345265751700211470ustar00rootroot00000000000000[ # cd /usr/include && grep -r --exclude-dir={detail,impl} '^ *# *include' boost/ | perl -nle 'm/^([^:]+).*["<]([^>]+)[">]/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | grep -e \/detail\/ -e \/impl\/ | grep -e \\[\"\", private, "", public ] }, { include: ["@", private, "", public ] }, { include: ["@", private, "", public ] }, { include: ["@", private, "", public ] }, #manually delete $ sed '/workarounds*\.hpp/d' -i boost-all.imp #also good idea to remove all lines refering to folders above (e.g., sed '/\/format\//d' -i boost-all.imp) #programatically include: { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] } ] include-what-you-use-clang_8.0/clang-6.intrinsics.imp000066400000000000000000000101521345265751700226550ustar00rootroot00000000000000# These mappings based on #error pragmas in the header files below in clang 6.0.0 [ { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # files that list two possible public headers { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, ] include-what-you-use-clang_8.0/docs/000077500000000000000000000000001345265751700174645ustar00rootroot00000000000000include-what-you-use-clang_8.0/docs/IWYUMappings.md000066400000000000000000000133371345265751700223110ustar00rootroot00000000000000# IWYU Mappings # One of the difficult problems for IWYU is distinguishing between which header contains a symbol definition and which header is the actual documented header to include for that symbol. For example, in GCC's libstdc++, `std::unique_ptr` is defined in ``, but the documented way to get it is to `#include `. Another example is `NULL`. Its authoritative header is ``, but for practical purposes `NULL` is more of a keyword, and according to the standard it's acceptable to assume it comes with ``, ``, ``, ``, `` or ``. In fact, almost every standard library header pulls in `NULL` one way or another, and we probably shouldn't force people to `#include `. To simplify IWYU deployment and command-line interface, many of these mappings are compiled into the executable. These constitute the *default mappings*. However, many mappings are toolchain- and version-dependent. Symbol homes and `#include` dependencies change between releases of GCC and are dramatically different for the standard libraries shipped with Microsoft Visual C++. Also, mappings such as these are usually necessary for third-party libraries (e.g. Boost, Qt) or even project-local symbols and headers as well. Any mappings outside of the default set can therefore be specified as external *mapping files*. ## Default Mappings ## IWYU's default mappings are hard-coded in `iwyu_include_picker.cc`, and are very GCC-centric. There are both symbol- and include mappings for GNU libstdc++ and libc. ## Mapping Files ## The mapping files conventionally use the `.imp` file extension, for "Iwyu MaPping" (terrible, I know). They use a [JSON](http://json.org/) meta-format with the following general form: [ { : }, { : } ] Directives can be one of the literal strings: * `include` * `symbol` * `ref` and data varies between the directives, see below. Note that you can mix directives of different kinds within the same mapping file. IWYU uses LLVM's YAML/JSON parser to interpret the mapping files, and it has some idiosyncrasies: * Comments use a Python-style `#` prefix, not Javascript's `//` * Single-word strings can be left un-quoted If the YAML parser is ever made more rigorous, it might be wise not to lean on non-standard behavior, so apart from comment style, try to keep mapping files in line with the JSON spec. ### Include Mappings ### The `include` directive specifies a mapping between two include names (relative path, including quotes or angle brackets.) This is typically used to map from a private implementation detail header to a public facade header, such as our `` to `` example above. Data for this directive is a list of four strings containing: * The include name to map from * The visibility of the include name to map from * The include name to map to * The visibility of the include name to map to For example; { include: ["", "private", "", "public"] } Most of the original mappings were generated with shell scripts (as evident from the embedded comments) so there are several multi-step mappings from one private header to another, to a third and finally to a public header. This reflects the `#include` chain in the actual library headers. A hand-written mapping could be reduced to one mapping per private header to its corresponding public header. Include mappings support a special wildcard syntax for the first entry: { include: ["@", "private", "", "public"] } The `@` prefix is a signal that the remaining content is a regex, and can be used to re-map a whole subdirectory of private headers to a public facade header. ### Symbol Mappings ### The `symbol` directive maps from a qualified symbol name to its authoritative header. Data for this directive is a list of four strings containing: * The symbol name to map from * The visibility of the symbol * The include name to map to * The visibility of the include name to map to For example; { symbol: ["NULL", "private", "", "public"] } The symbol visibility is largely redundant -- it must always be `private`. It isn't entirely clear why symbol visibility needs to be specified, and it might be removed moving forward. Unlike `include`, `symbol` directives do not support the `@`-prefixed regex syntax in the first entry. Track the [following bug](https://github.com/include-what-you-use/include-what-you-use/issues/233) for updates. ### Mapping Refs ### The last kind of directive, `ref`, is used to pull in another mapping file, much like the C preprocessor's `#include` directive. Data for this directive is a single string: the filename to include. For example; { ref: "more.symbols.imp" }, { ref: "/usr/lib/other.includes.imp" } The rationale for the `ref` directive was to make it easier to compose project-specific mappings from a set of library-oriented mapping files. For example, IWYU might ship with mapping files for [Boost](http://www.boost.org), the SCL, various C standard libraries, the Windows API, the [Poco Library](http://pocoproject.org), etc. Depending on what your specific project uses, you could easily create an aggregate mapping file with refs to the relevant mappings. ### Specifying Mapping Files ### Mapping files are specified on the command-line using the `--mapping_file` switch: $ include-what-you-use -Xiwyu --mapping_file=foo.imp some_file.cc The switch can be added multiple times to add more than one mapping file. If the mapping filename is relative, it will be looked up relative to the current directory. `ref` directives are first looked up relative to the current directory and if not found, relative to the referring mapping file. include-what-you-use-clang_8.0/docs/IWYUPragmas.md000066400000000000000000000206101345265751700221150ustar00rootroot00000000000000# IWYU pragmas # IWYU pragmas are used to give IWYU information that isn't obvious from the source code, such as how different files relate to each other and which includes to never remove or include. All pragmas start with `// IWYU pragma: ` or `/* IWYU pragma: `. They are case-sensitive and spaces are significant. ## IWYU pragma: keep ## This pragma applies to a single `#include` directive or forward declaration. It forces IWYU to keep an inclusion even if it is deemed unnecessary. main.cc: #include // IWYU pragma: keep class ForwardDeclaration; // IWYU pragma: keep In this case, `std::vector` isn't used, so `` would normally be discarded, but the pragma instructs IWYU to leave it. Similarly the class `ForwardDeclaration` isn't used but is kept because of the pragma on it. ## IWYU pragma: export ## This pragma applies to a single `#include` directive. It says that the current file is to be considered the provider of any symbol from the included file. facade.h: #include "detail/constants.h" // IWYU pragma: export #include "detail/types.h" // IWYU pragma: export #include // don't export stuff from main.cc: #include "facade.h" // Assuming Thing comes from detail/types.h and MAX_THINGS from detail/constants.h std::vector things(MAX_THINGS); Here, since `detail/constants.h` and `detail/types.h` have both been exported, IWYU is happy with the `facade.h` include for `Thing` and `MAX_THINGS`. In contrast, since `` has not been exported from `facade.h`, it will be suggested as an additional include. ## IWYU pragma: begin_exports/end_exports ## This pragma applies to a set of `#include` directives. It declares that the including file is to be considered the provider of any symbol from these included files. This is the same as decorating every `#include` directive with `IWYU pragma: export`. facade.h: // IWYU pragma: begin_exports #include "detail/constants.h" #include "detail/types.h" // IWYU pragma: end_exports #include // don't export stuff from ## IWYU pragma: private ## This pragma applies to the current header file. It says that any symbol from this file will be provided by another, optionally named, file. private.h: // IWYU pragma: private, include "public.h" struct Private {}; private2.h: // IWYU pragma: private struct Private2 {}; public.h: #include "private.h" #include "private2.h" main.cc: #include "private.h" #include "private2.h" Private p; Private2 i; Using the type `Private` in `main.cc` will cause IWYU to suggest that you include `public.h`. Using the type `Private2` in `main.cc` will cause IWYU to suggest that you include `private2.h`, but will also result in a warning that there's no public header for `private2.h`. ## IWYU pragma: no_include ## This pragma applies to the current source file. It declares that the named file should not be suggested for inclusion by IWYU. private.h: struct Private {}; unrelated.h: #include "private.h" ... main.cc: #include "unrelated.h" // IWYU pragma: no_include "private.h" Private i; The use of `Private` requires including `private.h`, but due to the `no_include` pragma IWYU will not suggest `private.h` for inclusion. Note also that if you had included `private.h` in `main.cc`, IWYU would suggest that the `#include` be removed. This is useful when you know a symbol definition is already available via some unrelated header, and you want to preserve that implicit dependency. The `no_include` pragma is somewhat similar to `private`, but is employed at point of use rather than at point of declaration. ## IWYU pragma: no_forward_declare ## This pragma applies to the current source file. It says that the named symbol should not be suggested for forward-declaration by IWYU. public.h: struct Public {}; unrelated.h: struct Public; ... main.cc: #include "unrelated.h" // declares Public // IWYU pragma: no_forward_declare Public Public* i; IWYU would normally suggest forward-declaring `Public` directly in `main.cc`, but `no_forward_declare` suppresses that suggestion. A forward-declaration for `Public` is already available from `unrelated.h`. This is useful when you know a symbol declaration is already available in a source file via some unrelated header and you want to preserve that implicit dependency, or when IWYU does not correctly understand that the definition is necessary. ## IWYU pragma: friend ## This pragma applies to the current header file. It says that any file matching the given regular expression will be considered a friend, and is allowed to include this header even if it's private. Conceptually similar to `friend` in C++. If the expression contains spaces, it must be enclosed in quotes. detail/private.h: // IWYU pragma: private // IWYU pragma: friend "detail/.*" struct Private {}; detail/alsoprivate.h: #include "detail/private.h" // IWYU pragma: private // IWYU pragma: friend "main\.cc" struct AlsoPrivate : Private {}; main.cc: #include "detail/alsoprivate.h" AlsoPrivate p; ## IWYU pragma: associated ## Associated headers have special significance in IWYU, they're analyzed together with their .cpp file to give an optimal result for the whole component. By default, IWYU uses the .cpp file's stem (filename without extension) to automatically detect which is the associated header, but sometimes local conventions don't allow a component's .cpp and header file to share a stem, which makes life harder for IWYU. You can explicitly mark an arbitrary `#include` directive as denoting the associated header with `IWYU pragma: associated`: component/public.h: struct Foo { void Bar(); }; component/component.cc: #include "component/public.h" // IWYU pragma: associated void Foo::Bar() { } You can mark multiple `#include` directives as associated and they will all be considered as such. ## Which pragma should I use? ## Ideally, IWYU should be smart enough to understand your intentions (and intentions of the authors of libraries you use), so the first answer should always be: none. In practice, intentions are not so clear -- it might be ambiguous whether an `#include` is there by clever design or by mistake, whether an `#include` serves to export symbols from a private header through a public facade or if it's just a left-over after some clean-up. Even when intent is obvious, IWYU can make mistakes due to bugs or not-yet-implemented policies. IWYU pragmas have some overlap, so it can sometimes be hard to choose one over the other. Here's a guide based on how I understand them at the moment: * Use `IWYU pragma: keep` to force IWYU to keep any `#include` directive that would be discarded under its normal policies. * Use `IWYU pragma: export` to tell IWYU that one header serves as the provider for all symbols in another, included header (e.g. facade headers). Use `IWYU pragma: begin_exports/end_exports` for a whole group of included headers. * Use `IWYU pragma: no_include` to tell IWYU that the file in which the pragma is defined should never `#include` a specific header (the header may already be included via some other `#include`.) * Use `IWYU pragma: no_forward_declare` to tell IWYU that the file in which the pragma is defined should never forward-declare a specific symbol (a forward declaration may already be available via some other `#include`.) * Use `IWYU pragma: private` to tell IWYU that the header in which the pragma is defined is private, and should not be included directly. * Use `IWYU pragma: private, include "public.h"` to tell IWYU that the header in which the pragma is defined is private, and `public.h` should always be included instead. * Use `IWYU pragma: friend ".*favorites.*"` to override `IWYU pragma: private` selectively, so that a set of files identified by a regex can include the file even if it's private. The pragmas come in three different classes; 1. Ones that apply to a single `#include` directive (`keep`, `export`) 2. Ones that apply to a file being included (`private`, `friend`) 3. Ones that apply to a file including other headers (`no_include`, `no_forward_declare`) Some files are both included and include others, so it can make sense to mix and match. include-what-you-use-clang_8.0/docs/WhatIsAUse.md000066400000000000000000000230711345265751700217660ustar00rootroot00000000000000# What Is a Use? # (*Disclaimer:* the information here is accurate as of 12 May 2011, when it was written. Specifics of IWYU's policy, and even philosophy, may have changed since then. We'll try to remember to update this file as that happens, but may occasionally forget. The further we are from May 2011, the more you should take the below with a grain of salt.) IWYU has the policy that you should `#include` a declaration for every symbol you "use" in a file, or forward-declare it if possible. But what does it mean to "use" a symbol? For the most part, IWYU considers a "use" the same as the compiler does: if you get a compiler error saying "Unknown symbol 'foo'", then you are using `foo`. Whether the use is a 'full' use, that needs the definition of the symbol, or a 'forward-declare' use, that can get by with just a declaration of the symbol, likewise matches what the compiler allows. This makes it sound like IWYU does the moral equivalent of taking a source file, removing `#include` lines from it, seeing what the compiler complains about, and marking uses as appropriate. This is not what IWYU does. Instead, IWYU does a thought experiment: if the definition (or declaration) of a given type were not available, would the code compile? Here is an example illustrating the difference: foo.h: #include typedef std::ostream OutputEmitter; bar.cc: #include "foo.h" OutputEmitter oe; oe << 5; Does `bar.cc` "use" `std::ostream`, such that it should `#include `? You'd hope the answer would be no: the whole point of the `OutputEmitter` typedef, presumably, is to hide the fact the type is an `std::ostream`. Having to have clients `#include ` rather defeats that purpose. But IWYU sees that you're calling `operator<<(std::ostream&, int)`, which is defined in ``, so naively, it should say that you need that header. But IWYU doesn't (at least, modulo bugs). This is because of its attempt to analyze "author intent". ## Author Intent ## If code has `typedef Foo MyTypedef`, and you write `MyTypedef var;`, you are using `MyTypedef`, but are you also using `Foo`? The answer depends on the _intent_ of the person who wrote the typedef. In the `OutputEmitter` example above, while we don't know for sure, we can guess that the intent of the author was that clients should not be considered to use the underlying type -- and thus they shouldn't have to `#include ` themselves. In that case, the typedef author takes responsibility for the underlying type, promising to provide all the definitions needed to make code compile. The philosophy here is: "As long as you `#include "foo.h"`, you can use `OutputEmitter` however you want, without worry of compilation errors." Some typedef authors have a different intent. `` has the line typedef basic_ostream ostream; but it does *not* promise "as long as you `#include `, you can use `std::ostream` however you want, without worry of compilation errors." For most uses of `std::ostream`, you'll get a compiler error unless you `#include ` as well. So take a slightly modified version of the above `foo.h`: #include typedef std::ostream OutputEmitter; This is a self-contained .h file: it's perfectly legal to typedef an incomplete type (that's what `iosfwd` itself does). But now IWYU had better tell `bar.cc` to `#include `, or it will break the build. The difference is in the author intent with the typedef. Another case where author intent turns up is in function return types. Consider this function declaration: Foo* GetSingletonObject(); // Foo is defined in foo.h If you write `GetSingletonObject()->methodOnFoo()`, are you "using" `Foo::methodOnFoo`, such that you should `#include "foo.h"`? Or are you supposed to be able to operate on the results of `GetSingletonObject` without needing to include the definition of the returned type? The answer is: it depends on the author intent. Sometimes the author is willing to provide the definition of the return type, sometimes it is not. ### Re-Exporting ### When the author of a file is providing a definition of a symbol from somewhere else, we say that the file is "re-exporting" that symbol. In the first `OutputEmitter` example, we say that `foo.h` is re-exporting `ostream`. As a result, people who `#include "foo.h"` get a definition of `ostream` along for free, even if they don't directly `#include ` themselves. Another way of thinking about it is: if file A re-exports symbol B, we can pretend that A defines B, even if it doesn't. (In an ideal world, we'd have a very fine-grained concept: "File A re-exports symbol S when it's used in the context of typedef T [or function F, or ...]," but in reality, we have the much looser concept "file A re-exports all symbols from file B.") A more accurate include-what-you-use rule is this: "If you use a symbol, you must either `#include` the definition of the symbol, or `#include` a file that re-exports the symbol." ## Manual re-export identifiers ## You can mark that one file is re-exporting symbols from another via an IWYU pragma in your source code: #include "private.h" // IWYU pragma: export This tells IWYU that if some other file uses symbols defined in `private.h`, they can `#include` you to get them, if they want. The full list of IWYU pragmas is defined in [IWYUPragmas.md](IWYUPragmas.md). ## Automatic re-export ## In certain situations, IWYU will decide that one file is exporting a symbol from another even without the use of a pragma. These are places where the author intent is usually to re-export, such as with the `typedef` example above. In each of these cases, a simple technique can be used to override IWYU's decision to re-export. ### Automatic re-export: typedefs ### If you write typedef Foo MyTypedef; IWYU has to decide whether your file should re-export `Foo` or not. Here is how it gauges author intent: * If you (the typedef author), directly `#include` the definition of the underlying type, then IWYU assumes you mean to re-export it. * If you (the typedef author), explicitly provide a forward-declare of the underlying type, but do not directly `#include` its definition, then IWYU assumes you do not mean to re-export it. * Otherwise, IWYU assumes you do not mean to re-export it. For example: #include "foo.h" typedef Foo Typedef1; // IWYU says you intend to re-export Foo class Bar; typedef Bar Typedef2; // IWYU says you do not intend to re-export Bar #include "file_including_baz.h" // does not define Baz itself typedef Baz Typedef3; // IWYU says you do not intend to re-export Baz If IWYU says you intend to re-export the underlying type, then nobody who uses your typedef needs to `#include` the definition of the underlying type. In contrast, if IWYU says you do not intend to re-export the underlying type, then everybody who uses your typedef needs to `#include` the definition of the underlying type. IWYU supports this in its analysis. If you are using `Typedef1` in your code and `#include "foo.h"` anyway, IWYU will suggest you remove it, since you are getting the definition of `Foo` via the typedef. ### Automatic re-export: Function return values ### The same rule applies with the return value in a function declaration: #include "foo.h" Foo Func1(); // IWYU says you intend to re-export Foo class Bar; Bar Func2(); // IWYU says you do not intend to re-export Bar #include "file_including_baz.h" Baz Func3(); // IWYU says you do not intend to re-export Baz (Note that C++ is perfectly happy with a forward-declaration of the return type, if the function is just being declared, and not defined.) As of May 2011, the rule does *not* apply when returning a pointer or reference: #include "foo.h" Foo* Func1(); // IWYU says you do *not* intend to re-export Foo #include "bar.h" Bar& Func2(); // IWYU says you do *not* intend to re-export Bar This is considered a bug, and the behavior will likely change in the future to match the case where the functions return a class. Here is an example of the rule in action: foo.h: class Foo { ... } bar.h: #include "foo.h" Foo CreateFoo() { ... } void ConsumeFoo(const Foo& foo) { ... } baz.cc: #include "bar.h" ConsumeFoo(CreateFoo()); In this case, IWYU will say that `baz.cc` does not need to `#include "foo.h"`, since `bar.h` re-exports it. ### Automatic re-export: Conversion constructors ### Consider the following code: foo.h: class Foo { public: Foo(int i) { ... }; // note: not an explicit constructor! }; bar.h: class Foo; void MyFunc(Foo foo); baz.cc: #include "bar.h" MyFunc(11); The above code does not compile, because the code to convert `11` to a `Foo` is not visible to `baz.cc`. Either `baz.cc` or `bar.h` needs to `#include "foo.h"` to make the conversion constructor visible where `MyFunc` is being called. The same rule applies as before: #include "foo.h" void Func1(Foo foo); // IWYU says you intend to re-export Foo class Foo; void Func2(Foo foo); // IWYU says you do not intend to re-export Foo #include "file_including_foo.h" void Func3(Foo foo); // IWYU says you do not intend to re-export Foo As before, if IWYU decides you do not intend to re-export `Foo`, then all callers (in this case, `baz.cc`) need to. The rule here applies even to const references (which can also be automatically converted): #include "foo.h" void Func1(const Foo& foo); // IWYU says you intend to re-export Foo include-what-you-use-clang_8.0/docs/WhyIWYU.md000066400000000000000000000135101345265751700212730ustar00rootroot00000000000000# Why Include What You Use? # Are there any concrete benefits to a strict include-what-you-use policy? We like to think so. ## Faster Compiles ## Every .h file you bring in when compiling a source file lengthens the time to compile, as the bytes have to be read, preprocessed, and parsed. If you're not actually using a .h file, you remove that cost. With template code, where entire instantiations have to be in .h files, this can be hundreds of thousands of bytes of code. In one case at Google, running include-what-you-use over a .cc file improved its compile time by 30%. Here, the main benefit of include-what-you-use comes from the flip side: "don't include what you don't use." ## Fewer Recompiles ## Many build tools, such as `make`, provide a mechanism for automatically figuring out what .h files a .cc file depends on. These mechanisms typically look at `#include` lines. When unnecessary `#includes` are listed, the build system is more likely to recompile in cases where it's not necessary. Again, the main advantage here is from "don't include what you don't use." ## Allow Refactoring ## Suppose you refactor `foo.h` so it no longer uses vectors. You'd like to remove `#include ` from `foo.h`, to reduce compile time -- template class files such as `vector` can include a lot of code. But can you? In theory yes, but in practice maybe not: some other file may be #including you and using vectors, and depending (probably unknowingly) on your `#include ` to compile. Your refactor could break code far away from you. This is most compelling for a very large codebase (such as Google's). In a small codebase, it's practical to just compile everything after a refactor like this, and clean up any errors you see. When your codebase contains hundreds of thousands of source files, identifying and cleaning up the errors can be a project in itself. In practice, people are likely to just leave the `#include ` line in there, even though it's unnecessary. Here, it's the actual 'include what you use' policy that saves the day. If everyone who uses vector is #including `` themselves, then you can remove `` without fear of breaking anything. ## Self-documentation ## When you can trust the `#include` lines to accurately reflect what is used in the file, you can use them to help you understand the code. Looking at them, in itself, can help you understand what this file needs in order to do its work. If you use the optional 'commenting' feature of `fix_includes.py`, you can see what symbols -- what functions and classes -- are used by this code. It's like a pared-down version of doxygen markup, but totally automated and present where the code is (rather than in a separate web browser). The 'commented' `#include` lines can also make it simpler to match function calls and classes to the files that define them, without depending on a particular IDE. (The downside, of course, is the comments can get out of date as the code changes, so unless you run IWYU often, you still have to take the comments with a grain of salt. Nothing is free. :-) ) ## Dependency Cutting ## Again, this makes the most sense for large code-bases. Suppose your binaries are larger than you would expect, and upon closer examination use symbols that seem totally irrelevant. Where do they come from? Why are they there? With include-what-you-use, you can easily determine this by seeing who includes the files that define these symbols: those includers, and those alone, are responsible for the use. Once you know where a symbol is used in your binary, you can see how practical it is to remove that use, perhaps by breaking up the relevant .h files into two parts, and fixing up all callers. Again it's IWYU to the rescue: with include-what-you-use, figuring out the callers that need fixing is easy. ## Why Forward-Declare? ## Include-what-you-use tries very hard to figure out when a forward-declare can be used instead of an `#include` (IWYU would be about 90% less code if it didn't bother with trying to forward-declare). The reason for this is simple: if you can replace an `#include` by a forward-declare, you reduce the code size, speeding up compiles as described above. You also make it easier to break dependencies: not only do you not depend on that header file, you no longer depend on everything it brings in. There's a cost to forward-declaring as well: you lose the documentation features mentioned above, that come with `#include` lines. (A future version of IWYU may mitigate this problem.) And if a class changes -- for instance, it adds a new default template argument -- you need to change many callsites, not just one. It is also easier to accidentally violate the [One Definition Rule](http://en.wikipedia.org/wiki/One_Definition_Rule) when all you expose is the name of a class (via a forward declare) rather than the full definition (via an `#include`). One compromise approach is to use 'forwarding headers', such as ``. These forwarding headers could have comments saying where the definition of each forward-declared class is. Include-what-you-use does not currently support forwarding headers, but may in the future. Since some coding standards have taken to [discourage forward declarations](https://google.github.io/styleguide/cppguide.html#Forward_Declarations), IWYU has grown a `--no_fwd_decls` mode to embrace this alternative strategy. Where IWYU's default behavior is to minimize the number of include directives, IWYU with `--no_fwd_decls` will attempt to minimize the number of times each type is redeclared. The result is that include directives will always be preferred over local forward declarations, even if it means including a header just for a name-only type declaration. We still think IWYU's normal policy is preferable for all the reasons above, but if your codebase has a no-forward-declare policy, so does IWYU. include-what-you-use-clang_8.0/docs/WhyIWYUIsDifficult.md000066400000000000000000000266011345265751700234260ustar00rootroot00000000000000# Why Include What You Use Is Difficult # This section is informational, for folks who are wondering why include-what-you-use requires so much code and yet still has so many errors. Include-what-you-use has the most problems with templates and macros. If your code doesn't use either, IWYU will probably do great. And, you're probably not actually programming in C++... ## Use Versus Forward Declare ## Include-what-you-use has to be able to tell when a symbol is being used in a way that you can forward-declare it. Otherwise, if you wrote vector foo; IWYU would tell you to `#include "myclass.h"`, when perhaps the whole reason you're using a pointer here is to avoid the need for that `#include`. In the above case, it's pretty easy for IWYU to tell that we can safely forward-declare `MyClass`. But now consider vector foo; // requires full definition of MyClass scoped_ptr foo; // forward-declaring MyClass is often ok To distinguish these, clang has to instantiate the vector and scoped_ptr template classes, including analyzing all member variables and the bodies of the constructor and destructor (and recursively for superclasses). But that's not enough: when instantiating the templates, we need to keep track of which symbols come from template arguments and which don't. For instance, suppose you call `MyFunc()`, where `MyFunc` looks like this: template void MyFunc() { T* t; MyClass myclass; ... } In this case, the caller of `MyFunc` is not using the full type of `MyClass`, because the template parameter is only used as a pointer. On the other hand, the file that defines `MyFunc` is using the full type information for `MyClass`. The end result is that the caller can forward-declare `MyClass`, but the file defining `MyFunc` has to `#include "myclass.h"`. ## Handling Template Arguments ## Even figuring out what types are 'used' with a template can be difficult. Consider the following two declarations: vector v; hash_set h; These both have default template arguments, so are parsed like vector > v; hash_set, equal_to, alloc > h; What symbols should we say are used? If we say `alloc` is used when you declare a vector, then every file that `#includes` `` will also need to `#include `. So it's tempting to just ignore default template arguments. But that's not right either. What if `hash` is defined in some local `myhash.h` file (as `hash` often is)? Then we want to make sure IWYU says to `#include "myhash.h"` when you create the hash_set (otherwise the code won't compile). That requires paying attention to the default template argument. Figuring out how to handle default template arguments can get very complex. Even normal template arguments can be confusing. Consider this templated function: template void MyFunc(A (*fn)(B,C)) { ... } and you call `MyFunc(FunctionReturningAFunctionPointer())`. What types are being used where, in this case? ## Who is Responsible for Dependent Template Types? ## If you say `vector v;`, it's clear that you, and not `vector.h` are responsible for the use of `MyClass`, even though all the functions that use `MyClass` are defined in `vector.h`. (OK, technically, these functions are not "defined" in a particular location, they're instantiated from template methods written in `vector.h`, but for us it works out the same.) When you say `hash_map h;`, you are likewise responsible for `MyClass` (and `int`), but are you responsible for `pair`? That is the type that hash_map uses to store your entries internally, and it depends on one of your template arguments, but even so it shouldn't be your responsibility -- it's an implementation detail of hash_map. Of course, if you say `hash_map, int>`, then you are responsible for the use of `pair`. Distinguishing these two cases from each other, and from the vector case, can be difficult. Now suppose there's a template function like this: template void MyFunc(T t) { strcat(t, 'a'); strchr(t, 'a'); cerr << t; } If you call `MyFunc(some_char_star)`, which of these symbols are you responsible for, and which is the author of `MyFunc` responsible for: `strcat`, `strchr`, `operator<<(ostream&, T)`? `strcat` is a normal function, and the author of `MyFunc` is responsible for its use. This is an easy case. In C++, `strchr` is a templatized function (different impls for `char*` and `const char*`). Which version is called depends on the template argument. So, naively, we'd conclude that the caller is responsible for the use of `strchr`. However, that's ridiculous; we don't want caller of `MyFunc` to have to `#include ` just to call `MyFunc`. We have special code that (usually) handles this kind of case. `operator<<` is also a templated function, but it's one that may be defined in lots of different files. It would be ridiculous in its own way if `MyFunc` was responsible for including every file that defines `operator<<(ostream&, T)` for all `T`. So, unlike the two cases above, the caller is the one responsible for the use of `operator<<`, and will have to `#include` the file that defines it. It's counter-intuitive, perhaps, but the alternatives are all worse. As you can imagine, distinguishing all these cases is extremely difficult. To get it exactly right would require re-implementing C++'s (byzantine) lookup rules, which we have not yet tackled. ## Template Template Types ## Let's say you have a function template T> void MyFunc() { T t; } And you call `MyFunc`. Who is responsible for the 'use' of `hash`, and thus needs to `#include "myhash.h"`? I think it has to be the caller, even if the caller never uses the `string` type in its file at all. This is rather counter-intuitive. Luckily, it's also rather rare. ## Typedefs ## Suppose you `#include` a file `"foo.h"` that has typedef `hash_map MyMap;`. And you have this code: for (MyMap::iterator it = ...) Who, if anyone, is using the symbol `hash_map::iterator`? If we say you, as the author of the for-loop, are the user, then you must `#include `, which undoubtedly goes against the goal of the typedef (you shouldn't even have to know you're using a hash_map). So we want to say the author of the typedef is responsible for the use. But how could the author of the typedef know that you were going to use `MyMap::iterator`? It can't predict that. That means it has to be responsible for every possible use of the typedef type. This can be complicated to figure out. It requires instantiating all methods of the underlying type, some of which might not even be legal C++ (if, say, the class uses SFINAE). Worse, when the language auto-derives template types, it loses typedef information. Suppose you wrote this: MyMap m; find(m.begin(), m.end(), some_foo); The compiler sees this as syntactic sugar for `find, equal_to, alloc >(m.begin(), m.end(), some_foo);` Not only is the template argument `hash_map` instead of `MyMap`, it includes all the default template arguments, with no indication they're default arguments. All the tricks we used above to intelligently ignore default template arguments are worthless here. We have to jump through lots of hoops so this code doesn't require you to `#include` not only ``, but `` and `` as well. ## Macros ## It's no surprise macros cause a huge problem for include-what-you-use. Basically, all the problems of templates also apply to macros, but worse: with templates you can analyze the uninstantiated template, but with macros, you can't analyze the uninstantiated macro -- it likely doesn't even parse cleanly in isolation. As a result, we have very few tools to distinguish when the author of a macro is responsible for a symbol used in a macro, and when the caller of the macro is responsible. ## Includes with Side Effects ## While not a major problem, this indicates the myriad "gotchas" that exist around include-what-you-use: removing an `#include` and replacing it with a forward-declare may be dangerous even if no symbols are fully used from the `#include`. Consider the following code: foo.h: namespace ns { class Foo {}; } using ns::Foo; foo.cc: #include "foo.h" Foo* foo;` If IWYU just blindly replaces the `#include` with a forward declare such as `namespace ns { class Foo; }`, the code will break because of the lost using declaration. Include-what-you-use has to watch out for this case. Another case is a header file like this: foo.h: #define MODULE_NAME MyModule #include "module_writer.h" We might think we can remove an `#include` of `foo.h` and replace it by `#include "module_writer.h"`, but that is likely to break the build if `module_writer.h` requires `MODULE_NAME` be defined. Since my file doesn't participate in this dependency at all, it won't even notice it. IWYU needs to keep track of dependencies between files it's not even trying to analyze! ## Private Includes ## Suppose you write `vector v;`. You are using vector, and thus have to `#include `. Even this seemingly easy case is difficult, because vector isn't actually defined in ``; it's defined in ``. The C++ standard library has hundreds of private files that users are not supposed to `#include` directly. Third party libraries have hundreds more. There's no general way to distinguish private from public headers; we have to manually construct the proper mapping. In the future, we hope to provide a way for users to annotate if a file is public or private, either a comment or a `#pragma`. For now, we hard-code it in the IWYU tool. The mappings themselves can be ambiguous. For instance, `NULL` is provided by many files, including `stddef.h`, `stdlib.h`, and more. If you use `NULL`, what header file should IWYU suggest? We have rules to try to minimize the number of `#includes` you have to add; it can get rather involved. ## Unparsed Code ## Conditional `#includes` are a problem for IWYU when the condition is false: #if defined(LOG_VERBOSE) #include #endif ... void StartProcess() { #if defined(LOG_VERBOSE) LogVerbose("Starting process"); #endif ... } If you're running IWYU without that preprocessor definition set, it has no way of telling if `verbose_logger.h` is a necessary `#include` or not. ## Placing New Includes and Forward-Declares ## Figuring out where to insert new `#includes` and forward-declares is a complex problem of its own (one that is the responsibility of `fix_includes.py`). In general, we want to put new `#includes` with existing `#includes`. But the existing `#includes` may be broken up into sections, either because of conditional `#includes` (with `#ifdefs`), or macros (such as `#define __GNU_SOURCE`), or for other reasons. Some forward-declares may need to come early in the file, and some may prefer to come later (after we're in an appropriate namespace, for instance). `fix_includes.py` tries its best to give pleasant-looking output, while being conservative about putting code in a place where it might not compile. It uses heuristics to do this, which are not yet perfect. include-what-you-use-clang_8.0/fix_includes.py000077500000000000000000003103631345265751700215730ustar00rootroot00000000000000#!/usr/bin/env python ##===--- fix_includes.py - rewrite source files based on iwyu output ------===## # # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. # ##===----------------------------------------------------------------------===## from __future__ import print_function """Update files with the 'correct' #include and forward-declare lines. Given the output of include_what_you_use on stdin -- when run at the (default) --v=1 verbosity level or higher -- modify the files mentioned in the output, removing their old #include lines and replacing them with the lines given by the include_what_you_use script. This script runs in four stages. In the first, it groups physical lines together to form 'move spans'. A 'move span' is the atomic unit for moving or deleting code. A move span is either a) an #include line, along with any comment lines immediately preceding it; b) a forward-declare line -- or more if it's a multi-line forward declare -- along with preceding comments; c) any other single line. Example: // I really am glad I'm forward-declaring this class! // If I didn't, I'd have to #include the entire world. template class MyClass; Then, it groups move spans together into 'reorder spans'. These are spans of code that consist entirely of #includes and forward-declares, maybe separated by blank lines and comments. We assume that we can arbitrarily reorder #includes and forward-declares within a reorder span, without affecting correctness. Things like #ifdefs, #defines, namespace declarations, static variable declarations, class definitions, etc -- just about anything -- break up reorder spans. In stage 3 it deletes all #include and forward-declare lines that iwyu says to delete. iwyu includes line numbers for deletion, making this part easy. If this step results in "empty" #ifdefs or namespaces (#ifdefs or namespaces with no code inside them), we delete those as well. We recalculate the reorder spans, which may have gotten bigger due to the deleted code. In stage 4 it adds new iwyu-dictated #includes and forward-declares after the last existing #includes and forward-declares. Then it reorders the #includes and forward-declares to match the order specified by iwyu. It follows iwyu's instructions as much as possible, modulo the constraint that an #include or forward-declare cannot leave its current reorder span. All this moving messes up the blank lines, which we then need to fix up. Then we're done! """ __author__ = 'csilvers@google.com (Craig Silverstein)' import difflib import optparse import os import re import sys from collections import OrderedDict _USAGE = """\ %prog [options] [filename] ... < OR %prog -s [other options] ... %prog reads the output from the include-what-you-use script on stdin -- run with --v=1 (default) verbose or above -- and, unless --sort_only or --dry_run is specified, modifies the files mentioned in the output, removing their old #include lines and replacing them with the lines given by the include_what_you_use script. It also sorts the #include and forward-declare lines. All files mentioned in the include-what-you-use script are modified, unless filenames are specified on the commandline, in which case only those files are modified. The exit code is the number of files that were modified (or that would be modified if --dry_run was specified) unless that number exceeds 100, in which case 100 is returned. """ _COMMENT_RE = re.compile(r'\s*//.*') # These are the types of lines a file can have. These are matched # using re.match(), so don't need a leading ^. _C_COMMENT_START_RE = re.compile(r'\s*/\*') _C_COMMENT_END_RE = re.compile(r'.*\*/\s*(.*)$') _COMMENT_LINE_RE = re.compile(r'\s*//') _PRAGMA_ONCE_LINE_RE = re.compile(r'\s*#\s*pragma\s+once') _BLANK_LINE_RE = re.compile(r'\s*$') _IF_RE = re.compile(r'\s*#\s*if') # compiles #if/ifdef/ifndef _ELSE_RE = re.compile(r'\s*#\s*(else|elif)\b') # compiles #else/elif _ENDIF_RE = re.compile(r'\s*#\s*endif\b') # This is used to delete 'empty' namespaces after fwd-decls are removed. # Some third-party libraries use macros to start/end namespaces. _NAMESPACE_START_RE = re.compile(r'\s*(namespace\b[^{]*{\s*)+(//.*)?$|' r'\s*(U_NAMESPACE_BEGIN)|' r'\s*(HASH_NAMESPACE_DECLARATION_START)') # Also detect Allman and mixed style namespaces. Use a continue regex for # validation and to correctly set the line info. _NAMESPACE_START_ALLMAN_RE = re.compile(r'\s*(namespace\b[^{]*)+(//.*)?$') _NAMESPACE_START_MIXED_RE = re.compile( r'\s*(namespace\b[^{]*{\s*)+(namespace\b[^{]*)+(//.*)?$') _NAMESPACE_CONTINUE_ALLMAN_MIXED_RE = re.compile(r'\s*{\s*(//.*)?$') _NAMESPACE_END_RE = re.compile(r'\s*(})|' r'\s*(U_NAMESPACE_END)|' r'\s*(HASH_NAMESPACE_DECLARATION_END)') # The group (in parens) holds the unique 'key' identifying this #include. _INCLUDE_RE = re.compile(r'\s*#\s*include\s+([<"][^">]+[>"])') # We don't need this to actually match forward-declare lines (we get # that information from the iwyu input), but we do need an RE here to # serve as an index to _LINE_TYPES. So we use an RE that never matches. _FORWARD_DECLARE_RE = re.compile(r'$.FORWARD_DECLARE_RE') # Likewise, used to mark an '#ifdef' line of a header guard, or other # #ifdef that covers an entire file. _HEADER_GUARD_RE = re.compile(r'$.HEADER_GUARD_RE') # Marks the '#define' line that comes after a header guard. Since we # know the previous line was a header-guard line, we're not that picky # about this one. _HEADER_GUARD_DEFINE_RE = re.compile(r'\s*#\s*define\s+') # Pragma to mark the associated header (for use when it cannot be deduced from # the filename) _IWYU_PRAGMA_ASSOCIATED_RE = re.compile(r'IWYU\s*pragma:\s*associated') # We annotate every line in the source file by the re it matches, or None. # Note that not all of the above RE's are represented here; for instance, # we fold _C_COMMENT_START_RE and _C_COMMENT_END_RE into _COMMENT_LINE_RE. # The _NAMESPACE_CONTINUE_ALLMAN_MIXED_RE is also set on lines when Allman # and mixed namespaces are detected but the RE is too easy to match to add # under normal circumstances (must always be proceded by Allman/mixed). _LINE_TYPES = [_COMMENT_LINE_RE, _BLANK_LINE_RE, _NAMESPACE_START_RE, _NAMESPACE_START_ALLMAN_RE, _NAMESPACE_START_MIXED_RE, _NAMESPACE_END_RE, _IF_RE, _ELSE_RE, _ENDIF_RE, _INCLUDE_RE, _FORWARD_DECLARE_RE, _HEADER_GUARD_RE, _HEADER_GUARD_DEFINE_RE, _PRAGMA_ONCE_LINE_RE, ] # A regexp matching #include lines that should be a barrier for # sorting -- that is, we should never reorganize the code so an # #include that used to come before this line now comes after, or vice # versa. This can be used for 'fragile' #includes that require other # #includes to happen before them to function properly. # (Note that the barrier has no effect on where new #includes are # added; it just affects the reordering of existing #includes.) _BARRIER_INCLUDES = re.compile(r'^\s*#\s*include\s+(s) to the # full line as given by iwyu, which includes comments that iwyu # has put next to the #include. This holds both 'to-add' and # 'to-keep' #includes. If flags.comments is False, the comments # are removed before adding to this list. self.full_include_lines = OrderedDict() def Merge(self, other): """Merges other with this one. They must share a filename. This function is intended to be used when we see two iwyu records in the input, both for the same file. We can merge the two together. We are conservative: we union the lines to add, and intersect the lines to delete. Arguments: other: an IWYUOutputRecord to merge into this one. It must have the same value for filename that self does. """ assert self.filename == other.filename, "Can't merge distinct files" self.lines_to_delete.intersection_update(other.lines_to_delete) self.some_include_lines.update(other.some_include_lines) self.seen_forward_declare_lines.update(other.seen_forward_declare_lines) self.includes_and_forward_declares_to_add.update( other.includes_and_forward_declares_to_add) self.full_include_lines.update(other.full_include_lines) def HasContentfulChanges(self): """Returns true iff this record has at least one add or delete.""" return (self.includes_and_forward_declares_to_add or self.lines_to_delete) def __str__(self): return ('--- iwyu record ---\n FILENAME: %s\n LINES TO DELETE: %s\n' ' (SOME) INCLUDE LINES: %s\n (SOME) FWD-DECL LINES: %s\n' ' TO ADD: %s\n ALL INCLUDES: %s\n---\n' % (self.filename, self.lines_to_delete, self.some_include_lines, self.seen_forward_declare_lines, self.includes_and_forward_declares_to_add, self.full_include_lines)) class IWYUOutputParser(object): """Parses the lines in iwyu output corresponding to one source file.""" # iwyu adds this comment to some lines to map them to the source file. _LINE_NUMBERS_COMMENT_RE = re.compile(r'\s*// lines ([0-9]+)-([0-9]+)') # The output of include-what-you-use has sections that indicate what # #includes and forward-declares should be added to the output file, # what should be removed, and what the end result is. The first line # of each section also has the filename. _ADD_SECTION_RE = re.compile(r'^(.*) should add these lines:$') _REMOVE_SECTION_RE = re.compile(r'^(.*) should remove these lines:$') _TOTAL_SECTION_RE = re.compile(r'^The full include-list for (.*):$') _SECTION_END_RE = re.compile(r'^---$') # Alternately, if a file does not need any iwyu modifications (though # it still may need its #includes sorted), iwyu will emit this: _NO_EDITS_RE = re.compile(r'^\((.*) has correct #includes/fwd-decls\)$') _RE_TO_NAME = {_ADD_SECTION_RE: 'add', _REMOVE_SECTION_RE: 'remove', _TOTAL_SECTION_RE: 'total', _SECTION_END_RE: 'end', _NO_EDITS_RE: 'no_edits', } # A small state-transition machine. key==None indicates the start # state. value==None means that the key is an end state (that is, # its presence indicates the record is finished). _EXPECTED_NEXT_RE = { None: frozenset([_ADD_SECTION_RE, _NO_EDITS_RE]), _ADD_SECTION_RE: frozenset([_REMOVE_SECTION_RE]), _REMOVE_SECTION_RE: frozenset([_TOTAL_SECTION_RE]), _TOTAL_SECTION_RE: frozenset([_SECTION_END_RE]), _SECTION_END_RE: None, _NO_EDITS_RE: None, } def __init__(self): # This is set to one of the 'section' REs above. None is the start-state. self.current_section = None self.filename = '' self.lines_by_section = {} # key is an RE, value is a list of lines def _ProcessOneLine(self, line, basedir=None): """Reads one line of input, updates self, and returns False at EORecord. If the line matches one of the hard-coded section names, updates self.filename and self.current_section. Otherwise, the line is taken to be a member of the currently active section, and is added to self.lines_by_section. Arguments: line: one line from the iwyu input file. Returns: False if the line is the end-of-section marker, True otherwise. Raises: FixIncludesError: if there is an out-of-order section or mismatched filename. """ line = line.rstrip() # don't worry about line endings if not line: # just ignore blank lines return True for (section_re, section_name) in self._RE_TO_NAME.items(): m = section_re.search(line) if m: # Check or set the filename (if the re has a group, it's for filename). if section_re.groups >= 1: this_filename = NormalizeFilePath(basedir, m.group(1)) if (self.current_section is not None and this_filename != self.filename): raise FixIncludesError('"%s" section for %s comes after "%s" for %s' % (section_name, this_filename, self._RE_TO_NAME[self.current_section], self.filename)) self.filename = this_filename # Check and set the new section we're entering. if section_re not in self._EXPECTED_NEXT_RE[self.current_section]: if self.current_section is None: raise FixIncludesError('%s: "%s" section unexpectedly comes first' % (self.filename, section_name)) else: raise FixIncludesError('%s: "%s" section unexpectedly follows "%s"' % (self.filename, section_name, self._RE_TO_NAME[self.current_section])) self.current_section = section_re # We're done parsing this record if this section has nothing after it. return self._EXPECTED_NEXT_RE[self.current_section] is not None # We're not starting a new section, so just add to the current section. # We ignore lines before section-start, they're probably things like # compiler messages ("Compiling file foo"). if self.current_section is not None: self.lines_by_section.setdefault(self.current_section, []).append(line) return True def ParseOneRecord(self, iwyu_output, flags): """Given a file object with output from an iwyu run, return per file info. For each source file that iwyu_output mentions (because iwyu was run on it), we return a structure holding the information in IWYUOutputRecord: 1) What file these changes apply to 2) What line numbers hold includes/fwd-declares to remove 3) What includes/fwd-declares to add 4) Ordering information for includes and fwd-declares Arguments: iwyu_output: a File object returning lines from an iwyu run flags: commandline flags, as parsed by optparse. We use flags.comments, which controls whether we output comments generated by iwyu. Returns: An IWYUOutputRecord object, or None at EOF. Raises: FixIncludesError: for malformed-looking lines in the iwyu output. """ for line in iwyu_output: if not self._ProcessOneLine(line, flags.basedir): # returns False at end-of-record break else: # for/else return None # at EOF # Now set up all the fields in an IWYUOutputRecord. # IWYUOutputRecord.filename retval = IWYUOutputRecord(self.filename) # IWYUOutputRecord.lines_to_delete for line in self.lines_by_section.get(self._REMOVE_SECTION_RE, []): m = self._LINE_NUMBERS_COMMENT_RE.search(line) if not m: raise FixIncludesError('line "%s" (for %s) has no line number' % (line, self.filename)) # The RE is of the form [start_line, end_line], inclusive. for line_number in range(int(m.group(1)), int(m.group(2)) + 1): retval.lines_to_delete.add(line_number) # IWYUOutputRecord.some_include_lines for line in (self.lines_by_section.get(self._REMOVE_SECTION_RE, []) + self.lines_by_section.get(self._TOTAL_SECTION_RE, [])): if not _INCLUDE_RE.match(line): continue m = self._LINE_NUMBERS_COMMENT_RE.search(line) if not m: continue # not all #include lines have line numbers, but some do for line_number in range(int(m.group(1)), int(m.group(2)) + 1): retval.some_include_lines.add(line_number) # IWYUOutputRecord.seen_forward_declare_lines for line in (self.lines_by_section.get(self._REMOVE_SECTION_RE, []) + self.lines_by_section.get(self._TOTAL_SECTION_RE, [])): # Everything that's not an #include is a forward-declare. if line.startswith('- '): # the 'remove' lines all start with '- '. line = line[len('- '):] if _INCLUDE_RE.match(line): continue m = self._LINE_NUMBERS_COMMENT_RE.search(line) if m: retval.seen_forward_declare_lines.add((int(m.group(1)), int(m.group(2))+1)) # IWYUOutputRecord.includes_and_forward_declares_to_add for line in self.lines_by_section.get(self._ADD_SECTION_RE, []): line = _COMMENT_RE.sub('', line) retval.includes_and_forward_declares_to_add.add(line) # IWYUOutputRecord.full_include_lines for line in self.lines_by_section.get(self._TOTAL_SECTION_RE, []): m = _INCLUDE_RE.match(line) if m: if not flags.comments: line = _COMMENT_RE.sub('', line) # pretend there were no comments else: # Just remove '// line XX': that's iwyu metadata, not a real comment line = self._LINE_NUMBERS_COMMENT_RE.sub('', line) retval.full_include_lines[m.group(1)] = line return retval class LineInfo(object): """Information about a single line of a source file.""" def __init__(self, line): """Initializes the content of the line, but no ancillary fields.""" # The content of the line in the input file self.line = line # The 'type' of the line. The 'type' is one of the regular # expression objects in _LINE_TYPES, or None for any line that # does not match any regular expression in _LINE_TYPES. self.type = None # True if no lines processed before this one have the same type # as this line. self.is_first_line_of_this_type = False # Set to true if we want to delete/ignore this line in the output # (for instance, because iwyu says to delete this line). At the # start, the only line to delete is the 'dummy' line 0. self.deleted = self.line is None # If this line is an #include or a forward-declare, gives a # [begin,end) pair saying the 'span' this line is part of. We do # this for two types of span: the move span (an #include or # forward declare, along with any preceding comments) and the # reorder span (a continguous block of move-spans, connected only # by blank lines and comments). For lines that are not an # #include or forward-declare, these may have an arbitrary value. self.move_span = None self.reorder_span = None # If this line is an #include or a forward-declare, gives the # 'key' of the line. For #includes it is the filename included, # including the ""s or <>s. For a forward-declare it's the name # of the class/struct. For other types of lines, this is None. self.key = None def __str__(self): if self.deleted: line = 'XX-%s-XX' % self.line else: line = '>>>%s<<<' % self.line if self.type is None: type_id = None else: type_id = _LINE_TYPES.index(self.type) return ('%s\n -- type: %s (key: %s). move_span: %s. reorder_span: %s' % (line, type_id, self.key, self.move_span, self.reorder_span)) class FileInfo(object): """ Details about a file's storage encoding """ DEFAULT_LINESEP = os.linesep DEFAULT_ENCODING = 'utf-8' def __init__(self, linesep, encoding): self.linesep = linesep self.encoding = encoding @staticmethod def parse(filename): """ Return a FileInfo object describing file encoding details. """ with open(filename, 'rb') as f: content = f.read() linesep = FileInfo.guess_linesep(content) encoding = FileInfo.guess_encoding(content) return FileInfo(linesep, encoding) @staticmethod def guess_linesep(bytebuf): """ Return most frequent line separator of buffer. """ win = bytebuf.count(b'\r\n') unix = bytebuf.count(b'\n') - win if win > unix: return '\r\n' elif unix > win: return '\n' return FileInfo.DEFAULT_LINESEP @staticmethod def guess_encoding(bytebuf): """ Return approximate encoding for buffer. This is heavily heuristic, and will return any supported encoding that can describe the file without losing information, not necessarily the *right* encoding. This is usually OK, because IWYU typically only adds ASCII content (or content pulled from the file itself). """ def try_decode(buf, encoding): try: buf.decode(encoding, errors='strict') except UnicodeError: return False return True # Special-case UTF-8 BOM if bytebuf[0:3] == b'\xef\xbb\xbf': if try_decode(bytebuf, 'utf-8-sig'): return 'utf-8-sig' encodings = ['ascii', 'utf-8', 'windows-1250', 'windows-1252'] for encoding in encodings: if try_decode(bytebuf, encoding): return encoding return FileInfo.DEFAULT_ENCODING def _ReadFile(filename, fileinfo): """Read from filename and return a list of file lines.""" try: with open(filename, 'rb') as f: content = f.read() # Call splitlines with True to keep the original line # endings. Later in WriteFile, they will be used as-is. # This will reduce spurious changes to the original files. # The lines we add will have the linesep determined by # FileInfo. return content.decode(fileinfo.encoding).splitlines(True) except (IOError, OSError) as why: print("Skipping '%s': %s" % (filename, why)) return None def _WriteFile(filename, fileinfo, file_lines): """Write the given file-lines to the file.""" try: with open(filename, 'wb') as f: # file_lines already have line endings, so join with ''. content = ''.join(file_lines) content = content.encode(fileinfo.encoding) f.write(content) except (IOError, OSError) as why: print("Error writing '%s': %s" % (filename, why)) def PrintFileDiff(old_file_contents, new_file_contents): """Print a unified diff between files, specified as lists of lines.""" diff = difflib.unified_diff(old_file_contents, new_file_contents) # skip the '--- /+++ ' lines at the start try: next(diff) next(diff) print('\n'.join(l.rstrip() for l in diff)) except StopIteration: pass def _MarkHeaderGuardIfPresent(file_lines): """If any line in file_lines is a header-guard, mark it in file_lines. We define a header-guard as follows: an #ifdef where there is nothing contentful before or after the #ifdef. Also, the #ifdef should have no #elif in it (though we don't currently test that). This catches the common case of an 'ifdef guard' in .h file, such as '#ifndef FOO_H\n#define FOO_H\n...contents...\n#endif', but it can also catch other whole-program #ifdefs, such as '#ifdef __linux\n...\n#endif'. The issue here is that if an #ifdef encloses the entire file, then we are willing to put new #includes/fwd-declares inside the #ifdef (which normally we wouldn't do). So we want to mark such #ifdefs with a special label. If we find such an #ifdef line -- and a single file can have at most one -- we change its type to a special type for header guards. Arguments: file_lines: an array of LineInfo objects with .type filled in. """ # Pass over blank lines, pragmas and comments at the top of the file. i = 0 for i in range(len(file_lines)): if (not file_lines[i].deleted and file_lines[i].type not in [_COMMENT_LINE_RE, _BLANK_LINE_RE, _PRAGMA_ONCE_LINE_RE]): break else: # for/else: got to EOF without finding any non-blank/comment lines return # This next line is the candidate header guard-line. ifdef_start = i if file_lines[ifdef_start].type != _IF_RE: # Not a header guard, just return without doing anything. return # Find the end of this ifdef, to see if it's really a header guard.. ifdef_depth = 0 for ifdef_end in range(ifdef_start, len(file_lines)): if file_lines[ifdef_end].deleted: continue if file_lines[ifdef_end].type == _IF_RE: ifdef_depth += 1 elif file_lines[ifdef_end].type == _ENDIF_RE: ifdef_depth -= 1 if ifdef_depth == 0: # The end of our #ifdef! break else: # for/else return False # Weird: never found a close to this #ifdef # Finally, all the lines after the end of the ifdef must be blank or comments. for i in range(ifdef_end + 1, len(file_lines)): if (not file_lines[i].deleted and file_lines[i].type not in [_COMMENT_LINE_RE, _BLANK_LINE_RE]): return # We passed the gauntlet! file_lines[ifdef_start].type = _HEADER_GUARD_RE # And the line after the header guard #ifdef is the '#define' (usually). if _HEADER_GUARD_DEFINE_RE.match(file_lines[ifdef_start + 1].line): file_lines[ifdef_start+1].type = _HEADER_GUARD_DEFINE_RE def _CalculateLineTypesAndKeys(file_lines, iwyu_record): """Fills file_line's type and key fields, where the 'type' is a regexp object. We match each line (line_info.line) against every regexp in _LINE_TYPES, and assign the first that matches, or None if none does. We also use iwyu_record's some_include_lines and seen_forward_declare_lines to identify those lines. In fact, that's the only data source we use for forward-declare lines. Sets file_line.type and file_line.is_first_line_of_this_type for each file_line in file_lines. Arguments: file_lines: an array of LineInfo objects with .line fields filled in. iwyu_record: the IWYUOutputRecord struct for this source file. Raises: FixIncludesError: if iwyu_record's line-number information is is inconsistent with what we see in the file. (For instance, it says line 12 is an #include, but we say it's a blank line, or the file only has 11 lines.) """ seen_types = set() in_c_style_comment = False in_allman_or_mixed_namespace = False for line_info in file_lines: if line_info.line is None: line_info.type = None elif _C_COMMENT_START_RE.match(line_info.line): # Note: _C_COMMENT_START_RE only matches a comment at the start # of a line. Comments in the middle of a line are ignored. # This can cause problems with multi-line comments that start # in the middle of the line, but that's hopefully quite rare. # TODO(csilvers): check for that case. m = _C_COMMENT_END_RE.match(line_info.line) if not m: # comment continues onto future lines line_info.type = _COMMENT_LINE_RE in_c_style_comment = True elif not m.group(1): # comment extends across entire line (only) line_info.type = _COMMENT_LINE_RE else: # comment takes only part of line, treat as content # TODO(csilvers): this mis-diagnoses lines like '/*comment*/class Foo;' line_info.type = None elif in_c_style_comment and _C_COMMENT_END_RE.match(line_info.line): line_info.type = _COMMENT_LINE_RE in_c_style_comment = False elif in_c_style_comment: line_info.type = _COMMENT_LINE_RE elif (in_allman_or_mixed_namespace and _NAMESPACE_CONTINUE_ALLMAN_MIXED_RE.match(line_info.line)): in_allman_or_mixed_namespace = False line_info.type = _NAMESPACE_CONTINUE_ALLMAN_MIXED_RE else: for type_re in _LINE_TYPES: # header-guard-define-re has a two-part decision criterion: it # matches the RE, *and* it comes after a header guard line. # That's too complex to figure out now, so we skip over it now # and fix it up later in _MarkHeaderGuardIfPresent(). if type_re in (_HEADER_GUARD_DEFINE_RE,): continue m = type_re.match(line_info.line) if m: line_info.type = type_re if type_re == _INCLUDE_RE: line_info.key = m.group(1) # get the 'key' for the #include. elif type_re in (_NAMESPACE_START_ALLMAN_RE, _NAMESPACE_START_MIXED_RE): # set in_allman_or_mixed_namespace to true to find the next { in_allman_or_mixed_namespace = True break else: # for/else line_info.type = None # means we didn't match any re line_info.is_first_line_of_this_type = (line_info.type not in seen_types) seen_types.add(line_info.type) # Now double-check against iwyu that we got all the #include lines right. for line_number in iwyu_record.some_include_lines: if file_lines[line_number].type != _INCLUDE_RE: raise FixIncludesError('iwyu line number %s:%d (%s) is not an #include' % (iwyu_record.filename, line_number, file_lines[line_number].line)) # We depend entirely on the iwyu_record for the forward-declare lines. for (start_line, end_line) in iwyu_record.seen_forward_declare_lines: for line_number in range(start_line, end_line): if line_number >= len(file_lines): raise FixIncludesError('iwyu line number %s:%d is past file-end' % (iwyu_record.filename, line_number)) file_lines[line_number].type = _FORWARD_DECLARE_RE # While we're at it, let's do a bit more sanity checking on iwyu_record. for line_number in iwyu_record.lines_to_delete: if line_number >= len(file_lines): raise FixIncludesError('iwyu line number %s:%d is past file-end' % (iwyu_record.filename, line_number)) elif file_lines[line_number].type not in (_INCLUDE_RE, _FORWARD_DECLARE_RE): raise FixIncludesError('iwyu line number %s:%d (%s) is not' ' an #include or forward declare' % (iwyu_record.filename, line_number, file_lines[line_number].line)) # Check if this file has a header guard, which for our purposes is # an #ifdef (or #if) that covers an entire source file. Usually # this will be a standard .h header-guard, but it could be something # like '#if __linux/#endif'. The point here is that if an #ifdef # encloses the entire file, then we are willing to put new # #includes/fwd-declares inside the #ifdef (which normally we # wouldn't do). So we mark such #ifdefs with a special label. _MarkHeaderGuardIfPresent(file_lines) def _PreviousNondeletedLine(file_lines, line_number): """Returns the line number of the previous not-deleted line, or None.""" for line_number in range(line_number - 1, -1, -1): if not file_lines[line_number].deleted: return line_number return None def _NextNondeletedLine(file_lines, line_number): """Returns the line number of the next not-deleted line, or None.""" for line_number in range(line_number + 1, len(file_lines)): if not file_lines[line_number].deleted: return line_number return None def _LineNumberStartingPrecedingComments(file_lines, line_number): """Returns the line-number for the comment-lines preceding the given linenum. Looking at file_lines, look at the lines immediately preceding the given line-number. If they're comment lines, return the first line of the comment lines preceding the given line. Otherwise, return the given line number. As a special case, if the comments go all the way up to the first line of the file (line 1), we assume they're comment lines, which are special -- they're not associated with any source code line -- and we return line_number in that case. Arguments: file_lines: an array of LineInfo objects, with .type fields filled in. line_number: an index into file_lines. Returns: The first line number of the preceding comments, or line_number if there are no preceding comments or they appear to be a top-of-file copyright notice. """ retval = line_number while retval > 0 and file_lines[retval - 1].type == _COMMENT_LINE_RE: retval -= 1 if retval <= 1: # top-of-line comments retval = line_number # so ignore all the comment lines return retval def _CalculateMoveSpans(file_lines, forward_declare_spans): """Fills each input_line's move_span field. A 'move span' is a range of lines (from file_lines) that includes an #include or forward-declare, and all the comments preceding it. It is the unit we would move if we decided to move (or delete) this #include or forward-declare. For lines of type _INCLUDE_RE or _FORWARD_DECLARE_RE, the move span is set to the tuple [start_of_span, end_of_span). All other lines have the move span kept at None. Arguments: file_lines: an array of LineInfo objects, with .type fields filled in. forward_declare_spans: a set of line-number pairs [start_line, end_line), each representing a single namespace. In practice this comes from iwyu_record.seen_forward_declare_lines. """ # First let's do #includes. for line_number in range(len(file_lines)): if file_lines[line_number].type == _INCLUDE_RE: span_begin = _LineNumberStartingPrecedingComments(file_lines, line_number) for i in range(span_begin, line_number + 1): file_lines[i].move_span = (span_begin, line_number + 1) # Now forward-declares. These spans come as input to this function. for (span_begin, span_end) in forward_declare_spans: span_begin = _LineNumberStartingPrecedingComments(file_lines, span_begin) for i in range(span_begin, span_end): file_lines[i].move_span = (span_begin, span_end) def _ContainsBarrierInclude(file_lines, line_range): """Returns true iff some line in [line_range[0], line_range[1]) is BARRIER.""" for line_number in range(*line_range): if (not file_lines[line_number].deleted and _BARRIER_INCLUDES.search(file_lines[line_number].line)): return True return False def _LinesAreAllBlank(file_lines, start_line, end_line): """Returns true iff all lines in [start_line, end_line) are blank/deleted.""" for line_number in range(start_line, end_line): if (not file_lines[line_number].deleted and file_lines[line_number].type != _BLANK_LINE_RE): return False return True def _CalculateReorderSpans(file_lines): """Fills each input_line's reorder_span field. A 'reorder span' is a range of lines (from file_lines) that only has #includes and forward-declares in it (and maybe blank lines, and comments associated with #includes or forward-declares). In particular, it does not include any "real code" besides #includes and forward-declares: no functions, no static variable assignment, no macro #defines, no nothing. We are willing to reorder #includes and namespaces freely inside a reorder span. Calculating reorder_span is easy: they're just the union of contiguous move-spans (with perhaps blank lines and comments thrown in), because move-spans share the 'no actual code' requirement. There's one exception: if any move-span matches the _BARRIER_INCLUDES regexp, it means that we should consider that move-span to be a 'barrier': nothing should get reordered from one side of that move-span to the other. (This is used for #includes that depend on other #includes being before them to function properly.) We do that by putting them into their own reorder span. For lines of type _INCLUDE_RE or _FORWARD_DECLARE_RE, the reorder span is set to the tuple [start_of_span, end_of_span). All other lines have an arbitrary value for the reorder span. Arguments: file_lines: an array of LineInfo objects with .type and .move_span fields filled in. """ # Happily, move_spans are disjoint. Just make sure they're sorted and unique. move_spans = [s.move_span for s in file_lines if s.move_span is not None] sorted_move_spans = sorted(set(move_spans)) i = 0 while i < len(sorted_move_spans): reorder_span_start = sorted_move_spans[i][0] # If we're a 'nosort' include, we're always in a reorder span of # our own. Otherwise, add in the next move span if we're # connected to it only by blank lines. if not _ContainsBarrierInclude(file_lines, sorted_move_spans[i]): while i < len(sorted_move_spans) - 1: move_span_end = sorted_move_spans[i][1] next_move_span_start = sorted_move_spans[i+1][0] if (_LinesAreAllBlank(file_lines, move_span_end, next_move_span_start) and not _ContainsBarrierInclude(file_lines, sorted_move_spans[i+1])): i += 1 else: break reorder_span_end = sorted_move_spans[i][1] # We'll map every line in the span to the span-extent. for line_number in range(reorder_span_start, reorder_span_end): file_lines[line_number].reorder_span = (reorder_span_start, reorder_span_end) i += 1 def ParseOneFile(f, iwyu_record): """Given a file object, read and classify the lines of the file. For each file that iwyu_output mentions, we return a list of LineInfo objects, which is a parsed version of each line, including not only its content but its 'type', its 'key', etc. Arguments: f: an iterable object returning lines from a file. iwyu_record: the IWYUOutputRecord struct for this source file. Returns: An array of LineInfo objects. The first element is always a dummy element, so the first line of the file is at retval[1], matching the way iwyu counts line numbers. """ file_lines = [LineInfo(None)] for line in f: file_lines.append(LineInfo(line)) _CalculateLineTypesAndKeys(file_lines, iwyu_record) _CalculateMoveSpans(file_lines, iwyu_record.seen_forward_declare_lines) _CalculateReorderSpans(file_lines) return file_lines def _DeleteEmptyNamespaces(file_lines): """Delete namespaces with nothing in them. Empty namespaces could be caused by transformations that removed forward-declarations: namespace foo { class Myclass; } -> namespace foo { } We want to get rid of the 'empty' namespace in this case. This routine 'deletes' lines by setting their 'deleted' field to True. Arguments: file_lines: an array of LineInfo objects with .type fields filled in. Returns: The number of namespaces deleted. """ num_namespaces_deleted = 0 start_line = 0 while start_line < len(file_lines): line_info = file_lines[start_line] if (line_info.deleted or (line_info.type != _NAMESPACE_START_RE and line_info.type != _NAMESPACE_START_ALLMAN_RE and line_info.type != _NAMESPACE_START_MIXED_RE)): start_line += 1 continue if line_info.type in (_NAMESPACE_START_RE, _NAMESPACE_START_MIXED_RE): # Because multiple namespaces can be on one line # ("namespace foo { namespace bar { ..."), we need to count. # We use the max because line may have 0 '{'s if it's a macro. # TODO(csilvers): ignore { in comments. namespace_depth = max(line_info.line.count('{'), 1) elif line_info.type == _NAMESPACE_START_ALLMAN_RE: # For Allman namespaces, keep the start line and increment # the namespace depths when the actual brace is encountered. namespace_depth = 0 else: # We should have handled all the namespace styles above! assert False, ('unknown namespace type', _LINE_TYPES.index(line_info.type)) end_line = start_line + 1 while end_line < len(file_lines): line_info = file_lines[end_line] if line_info.deleted: end_line += 1 elif line_info.type in (_COMMENT_LINE_RE, _BLANK_LINE_RE): end_line += 1 # ignore blank lines elif line_info.type == _NAMESPACE_CONTINUE_ALLMAN_MIXED_RE: namespace_depth += 1 end_line += 1 elif line_info.type in (_NAMESPACE_START_RE, _NAMESPACE_START_MIXED_RE): # nested namespace namespace_depth += max(line_info.line.count('{'), 1) end_line += 1 elif line_info.type == _NAMESPACE_START_ALLMAN_RE: # nested Allman namespace end_line += 1 elif line_info.type == _NAMESPACE_END_RE: namespace_depth -= max(line_info.line.count('}'), 1) end_line += 1 if namespace_depth <= 0: # Delete any comments preceding this namespace as well. start_line = _LineNumberStartingPrecedingComments(file_lines, start_line) # And also blank lines. while (start_line > 0 and file_lines[start_line-1].type == _BLANK_LINE_RE): start_line -= 1 for line_number in range(start_line, end_line): file_lines[line_number].deleted = True num_namespaces_deleted += 1 break else: # bail: we're at a line indicating this isn't an empty namespace end_line = start_line + 1 # rewind to try again with nested namespaces break start_line = end_line return num_namespaces_deleted def _DeleteEmptyIfdefs(file_lines): """Deletes ifdefs with nothing in them. This could be caused by transformations that removed #includes: #ifdef OS_WINDOWS # include #endif -> #ifdef OS_WINDOWS #endif We want to get rid of the 'empty' #ifdef in this case. We also handle 'empty' #ifdefs with #else, if both sides of the #else are empty. We also handle #ifndef and #if. This routine 'deletes' lines by replacing their content with None. Arguments: file_lines: an array of LineInfo objects with .type fields filled in. Returns: The number of ifdefs deleted. """ num_ifdefs_deleted = 0 start_line = 0 while start_line < len(file_lines): if file_lines[start_line].type not in (_IF_RE, _HEADER_GUARD_RE): start_line += 1 continue end_line = start_line + 1 while end_line < len(file_lines): line_info = file_lines[end_line] if line_info.deleted: end_line += 1 elif line_info.type in (_ELSE_RE, _COMMENT_LINE_RE, _BLANK_LINE_RE): end_line += 1 # ignore blank lines elif line_info.type == _ENDIF_RE: end_line += 1 # Delete any comments preceding this #ifdef as well. start_line = _LineNumberStartingPrecedingComments(file_lines, start_line) # And also blank lines. while (start_line > 0 and file_lines[start_line-1].type == _BLANK_LINE_RE): start_line -= 1 for line_number in range(start_line, end_line): file_lines[line_number].deleted = True num_ifdefs_deleted += 1 break else: # bail: we're at a line indicating this isn't an empty ifdef end_line = start_line + 1 # rewind to try again with nested #ifdefs break start_line = end_line return num_ifdefs_deleted def _DeleteDuplicateLines(file_lines, line_ranges): """Goes through all lines in line_ranges, and if any are dups, deletes them. For all lines in line_ranges, if any is the same as a previously seen line, set its deleted bit to True. The purpose of line_ranges is to avoid lines in #ifdefs and namespaces, that may be identical syntactically but have different semantics. Ideally, line_ranges should include only 'top-level' lines. We ignore lines that consist only of comments (or are blank). We ignore end-of-line comments when comparing lines for equality. NOTE: Because our comment-finding RE is primitive, it's best if line_ranges covers only #include and forward-declare lines. In particular, it should not cover lines that may have C literal strings in them. We only delete whole move_spans, not lines within them. Arguments: file_lines: an array of LineInfo objects. line_ranges: a list of [start_line, end_line) pairs. """ seen_lines = set() for line_range in line_ranges: for line_number in range(*line_range): line_info = file_lines[line_number] if line_info.type in (_BLANK_LINE_RE, _COMMENT_LINE_RE): continue if line_number != line_info.move_span[0]: continue span_line_numbers = range(line_info.move_span[0], line_info.move_span[1]) line_infos_in_span = [file_lines[i] for i in span_line_numbers] uncommented_lines = [ _COMMENT_RE.sub('', inf.line.strip()) for inf in line_infos_in_span] uncommented_span = ' '.join(uncommented_lines) if uncommented_span in seen_lines: for info in line_infos_in_span: info.deleted = True elif not line_info.deleted: seen_lines.add(uncommented_span) def _DeleteExtraneousBlankLines(file_lines, line_range): """Deletes extraneous blank lines caused by line deletion. Here's a example file: class Foo { ... }; class Bar; class Baz { ... } If we delete the "class Bar;" line, we also want to delete one of the blank lines around it, otherwise we leave two blank lines between Foo and Baz which looks bad. The idea is that if we have whitespace on both sides of a deleted span of code, the whitespace on one of the sides is 'extraneous'. In this case, we should delete not only 'class Bar;' but also the whitespace line below it. That leaves one blank line between Foo and Bar, like people would expect. We're careful to only delete the minimum of the number of blank lines that show up on either side. If 'class Bar' had one blank line before it, and one hundred after it, we'd only delete one blank line when we delete 'class Bar'. This matches user's expecatations. The situation can get tricky when two deleted spans touch (we might think it's safe to delete the whitespace between them when it's not). To be safe, we only do this check when an entire reorder-span has been deleted. So we check the given line_range, and only do blank-line deletion if every line in the range is deleted. Arguments: file_lines: an array of LineInfo objects, with .type filled in. line_range: a range [start_line, end_line). It should correspond to a reorder-span. """ # First make sure the entire span is deleted. for line_number in range(*line_range): if not file_lines[line_number].deleted: return before_line = _PreviousNondeletedLine(file_lines, line_range[0]) after_line = _NextNondeletedLine(file_lines, line_range[1] - 1) while (before_line and file_lines[before_line].type == _BLANK_LINE_RE and after_line and file_lines[after_line].type == _BLANK_LINE_RE): # OK, we've got whitespace on both sides of a deleted span. We # only want to keep whitespace on one side, so delete on the other. file_lines[after_line].deleted = True before_line = _PreviousNondeletedLine(file_lines, before_line) after_line = _NextNondeletedLine(file_lines, after_line) def _ShouldInsertBlankLine(decorated_move_span, next_decorated_move_span, file_lines, flags): """Returns true iff we should insert a blank line between the two spans. Given two decorated move-spans, of the form (reorder_range, kind, noncomment_lines, all_lines) returns true if we should insert a blank line between them. We always put a blank line when transitioning from an #include to a forward-declare and back. When the appropriate commandline flag is set, we also put a blank line between the 'main' includes (foo.h) and the C/C++ system includes, and another between the system includes and the rest of the Google includes. If the two move spans are in different reorder_ranges, that means the first move_span is at the end of a reorder range. In that case, a different rule for blank lines applies: if the next line is contentful (eg 'static int x = 5;'), or a namespace start, we want to insert a blank line to separate the move-span from the next block. When figuring out if the next line is contentful, we skip over comments. Arguments: decorated_move_span: a decorated_move_span we may want to put a blank line after. next_decorated_move_span: the next decorated_move_span, which may be a sentinel decorated_move_span at end-of-file. file_lines: an array of LineInfo objects with .deleted filled in. flags: commandline flags, as parsed by optparse. We use flags.blank_lines, which controls whether we put blank lines between different 'kinds' of #includes. Returns: true if we should insert a blank line after decorated_move_span. """ # First handle the 'at the end of a reorder range' case. if decorated_move_span[0] != next_decorated_move_span[0]: next_line = _NextNondeletedLine(file_lines, decorated_move_span[0][1] - 1) # Skip over comments to figure out if the next line is contentful. while (next_line and next_line < len(file_lines) and file_lines[next_line].type == _COMMENT_LINE_RE): next_line += 1 return (next_line and next_line < len(file_lines) and file_lines[next_line].type in (_NAMESPACE_START_RE, _NAMESPACE_START_ALLMAN_RE, _NAMESPACE_START_MIXED_RE, None)) # We never insert a blank line between two spans of the same kind. # Nor do we ever insert a blank line at EOF. (this_kind, next_kind) = (decorated_move_span[1], next_decorated_move_span[1]) if this_kind == next_kind or next_kind == _EOF_KIND: return False # We also never insert a blank line between C and C++-style #includes, # no matter what the flag value. if (this_kind in [_C_SYSTEM_INCLUDE_KIND, _CXX_SYSTEM_INCLUDE_KIND] and next_kind in [_C_SYSTEM_INCLUDE_KIND, _CXX_SYSTEM_INCLUDE_KIND]): return False # Handle the case we're going from an include to fwd declare or # back. If we get here, we can't both be fwd-declares, so it # suffices to check if either of us is. if this_kind == _FORWARD_DECLARE_KIND or next_kind == _FORWARD_DECLARE_KIND: return True # Now, depending on the flag, we insert a blank line whenever the # kind changes (we handled the one case where a changing kind # doesn't introduce a blank line, above). if flags.blank_lines: return this_kind != next_kind return False def _GetToplevelReorderSpans(file_lines): """Returns a sorted list of all reorder_spans not inside an #ifdef/namespace. This routine looks at all the reorder_spans in file_lines, ignores reorder spans inside #ifdefs and namespaces -- except for the 'header guard' ifdef that encapsulates an entire .h file -- and returns the rest in sorted order. Arguments: file_lines: an array of LineInfo objects with .type and .reorder_span filled in. Returns: A list of [start_line, end_line) reorder_spans. """ in_ifdef = [False] * len(file_lines) # lines inside an #if ifdef_depth = 0 for line_number in range(len(file_lines)): line_info = file_lines[line_number] if line_info.deleted: continue if line_info.type == _IF_RE: # does not cover the header-guard ifdef ifdef_depth += 1 elif line_info.type == _ENDIF_RE: ifdef_depth -= 1 if ifdef_depth > 0: in_ifdef[line_number] = True # Figuring out whether a } ends a namespace or some other languague # construct is hard, so as soon as we see any 'contentful' line # inside a namespace, we assume the entire rest of the file is in # the namespace. in_namespace = [False] * len(file_lines) namespace_depth = 0 for line_number in range(len(file_lines)): line_info = file_lines[line_number] if line_info.deleted: continue if line_info.type in (_NAMESPACE_START_RE, _NAMESPACE_START_MIXED_RE): # The 'max' is because the namespace-re may be a macro. namespace_depth += max(line_info.line.count('{'), 1) elif line_info.type == _NAMESPACE_CONTINUE_ALLMAN_MIXED_RE: namespace_depth += 1 elif line_info.type == _NAMESPACE_END_RE: namespace_depth -= max(line_info.line.count('}'), 1) if namespace_depth > 0: in_namespace[line_number] = True if line_info.type is None: for i in range(line_number, len(file_lines)): # rest of file in_namespace[i] = True break reorder_spans = [fl.reorder_span for fl in file_lines if fl.reorder_span] reorder_spans = sorted(set(reorder_spans)) good_reorder_spans = [] for reorder_span in reorder_spans: for line_number in range(*reorder_span): if in_ifdef[line_number] or in_namespace[line_number]: break else: # for/else good_reorder_spans.append(reorder_span) # never in ifdef or namespace return good_reorder_spans def _GetNamespaceLevelReorderSpans(file_lines): """Returns a list of reorder-spans inside namespaces, if it's easy to do. This routine is meant to handle the simple case where code consists of includes and forward-declares, and then a 'namespace my_namespace'. We return the reorder spans of the inside-namespace forward-declares, which is a good place to insert new inside-namespace forward-declares (rather than putting these new forward-declares at the top level). So it goes through the top of the file, stopping at the first 'contentful' line. If that line has the form 'namespace {', it then continues until it finds a forward-declare line, or a non-namespace contentful line. In the former case, it figures out the reorder-span this forward-declare line is part of, while in the latter case it creates a new reorder-span. A list of these namespace reorder spans are returned so they can all be checked. These elements are in the form (enclosing_namespace, reorder_span). Arguments: file_lines: an array of LineInfo objects with .type and .reorder_span filled in. Returns: [] if we could not find any namespace-level reorder-spans, or [(enclosing_namespace, reorder_span), ...], where enclosing_namespace is a string that looks like (for instance) 'namespace ns1 { namespace ns2 {', and reorder-span is a [start_line, end_line) pair. """ def _GetNamespaceNames(namespace_line): """Returns a list of namespace names given a namespace line. Anonymous namespaces will return an empty string """ namespace_re = re.compile(r'\s*namespace\b(.*)') namespaces = [] namespace_line = namespace_line.split("/")[0] # remove C++ comments namespace_line = namespace_line.split("{") # extract all namespaces for namespace in namespace_line: m = namespace_re.match(namespace) if m: namespaces.append(m.group(1).strip()) return namespaces namespace_reorder_spans = {} try: namespace_prefixes = [] pending_namespace_prefix = '' ifdef_depth = 0 for line_number, line_info in enumerate(file_lines): if line_info.deleted: continue # If we're an empty line, just ignore us. Likewise with #include # lines, which aren't 'contentful' for our purposes, and the # header guard, which is (by definition) the only kind of #ifdef # that we can be inside and still considered at the "top level". if line_info.type in (_COMMENT_LINE_RE, _BLANK_LINE_RE, _INCLUDE_RE, _HEADER_GUARD_RE, _HEADER_GUARD_DEFINE_RE, _PRAGMA_ONCE_LINE_RE): continue # If we're a 'contentful' line such as a (non-header-guard) #ifdef, add # to the ifdef depth. If we encounter #endif, reduce the ifdef depth. # Only keep track of namespaces when ifdef depth is 0 elif line_info.type == _IF_RE: ifdef_depth += 1 elif line_info.type == _ELSE_RE: continue elif line_info.type == _ENDIF_RE: ifdef_depth -= 1 elif ifdef_depth != 0: continue # skip lines until we're outside of an ifdef block # Build the simplified namespace dictionary. When any new namespace is # encountered, add the namespace to the list using the next line to cover # namespaces without forward declarations. When a forward declare is # found, update the dictionary using the existing namespace span that the # forward declare contains. Once a contentful line (None) has been found # or any exception occurs, return the results that have been found. Any # forward declare that wasn't able to have a proper namespace name found # will still propagate to the top of the file. elif line_info.type == _NAMESPACE_START_RE: for namespace in _GetNamespaceNames(line_info.line): if not namespace: namespace_prefixes.append('namespace {') else: namespace_prefixes.append('namespace %s {' % namespace) namespace_reorder_spans[' '.join(namespace_prefixes)] = ( line_number+1, line_number+1) elif line_info.type == _NAMESPACE_START_ALLMAN_RE: pending_namespace_prefix = '' namespaces = _GetNamespaceNames(line_info.line) if len(namespaces) != 1: raise FixIncludesError('Allman namespace found containing multiple ' 'names: %s', line_info.line) for namespace in namespaces: if not namespace: pending_namespace_prefix += 'namespace' else: pending_namespace_prefix += 'namespace %s' % namespace elif line_info.type == _NAMESPACE_START_MIXED_RE: # For mixed namespace styles, we need to append normalized prefixes # using regular and Allman style. Treat the first elements as # normal and only treat the final element as Allman. By the # nature of mixed namespaces, there will always be more than # one namespace so it is okay to assume that _GetNamespaceNames # will always return multiple records. pending_namespace_prefix = '' namespaces = _GetNamespaceNames(line_info.line) for namespace in namespaces[:-1]: if not namespace: namespace_prefixes.append('namespace {') else: namespace_prefixes.append('namespace %s {' % namespace) if not namespaces[-1]: pending_namespace_prefix += 'namespace' else: pending_namespace_prefix += 'namespace %s' % namespaces[-1] elif line_info.type == _NAMESPACE_CONTINUE_ALLMAN_MIXED_RE: # Append to the simplified allman namespace. if pending_namespace_prefix == '': raise FixIncludesError('Namespace bracket found without an associated ' 'namespace name at line: %s', line_number) pending_namespace_prefix += ' {' namespace_prefixes.append(pending_namespace_prefix) namespace_reorder_spans[' '.join(namespace_prefixes)] = ( line_number+1, line_number+1) elif line_info.type == _NAMESPACE_END_RE: # Remove C++ comments and count the ending brackets. namespace_end_count = line_info.line.split("/")[0].count("}") namespace_prefixes = namespace_prefixes[:-namespace_end_count] elif line_info.type == _FORWARD_DECLARE_RE: # If we're not in a namespace, keep going. Otherwise, this is # just the situation we're looking for! Update the dictionary # with the better reorder span if len(namespace_prefixes) > 0: namespace_reorder_spans[' '.join(namespace_prefixes)] = ( line_info.reorder_span) elif line_info.type == None: break else: # We should have handled all the cases above! assert False, ('unknown line-info type', _LINE_TYPES.index(line_info.type)) except Exception as why: # Namespace detection could be tricky so take what we have and return. print('DEBUG: Namespace detection returned prematurely because of an ' 'exception: %s' % (why)) pass # return a reverse sorted list so longest matches are checked first return sorted(namespace_reorder_spans.items(), reverse=True) # These are potential 'kind' arguments to _FirstReorderSpanWith. # We also sort our output in this order, to the extent possible. _MAIN_CU_INCLUDE_KIND = 1 # e.g. #include "foo.h" when editing foo.cc _C_SYSTEM_INCLUDE_KIND = 2 # e.g. #include _CXX_SYSTEM_INCLUDE_KIND = 3 # e.g. #include _NONSYSTEM_INCLUDE_KIND = 4 # e.g. #include "bar.h" _PROJECT_INCLUDE_KIND = 5 # e.g. #include "myproject/quux.h" _FORWARD_DECLARE_KIND = 6 # e.g. class Baz; _EOF_KIND = 7 # used at eof def _IsSystemInclude(line_info): """Given a line-info, return true iff the line is a <>-style #include.""" # The key for #includes includes the <> or "", so this is easy. :-) return line_info.type == _INCLUDE_RE and line_info.key[0] == '<' def _IsMainCUInclude(line_info, filename): """Given a line-info, return true iff the line is a 'main-CU' #include line. A 'main-CU' #include line is one that is related to the file being edited. For instance, if we are editing foo.cc, foo.h is a main-CU #include, as is foo-inl.h. The same holds if we are editing foo_test.cc. The algorithm is like so: first, canonicalize the includee by removing the following suffixes: -inl.h .h Then canonicalize the includer by removing file extension and then the following suffixes: _unittest _regtest _test Rule 1: If the canonical names (filenames after removal) match -- including all directories -- the .h file is a main-cu #include. Rule 2: If the basenames of the canonnical names match -- that is, ignoring all directories -- the .h file is a main-cu #include *if* it is the first #include seen. Arguments: line_info: a LineInfo structure with .type, .is_first_line_of_this_type, and .key filled in. filename: the name of the file being edited. Returns: True if line_info is an #include of a main_CU file, False else. """ if line_info.type != _INCLUDE_RE or _IsSystemInclude(line_info): return False if _IWYU_PRAGMA_ASSOCIATED_RE.search(line_info.line): return True # First, normalize the includee by getting rid of -inl.h and .h # suffixes (for the #include) and the "'s around the #include line. canonical_include = re.sub(r'(-inl\.h|\.h|\.H)$', '', line_info.key.replace('"', '')) # Then normalize includer by stripping extension and Google's test suffixes. canonical_file, _ = os.path.splitext(filename) canonical_file = re.sub(r'(_unittest|_regtest|_test)$', '', canonical_file) # .h files in /public/ match .cc files in /internal/. canonical_include2 = re.sub(r'/public/', '/internal/', canonical_include) # Rule 1: if canonical_file in (canonical_include, canonical_include2): return True # Rule 2: if (line_info.is_first_line_of_this_type and os.path.basename(canonical_file) == os.path.basename(canonical_include)): return True return False def _GetPathRoot(path): """ Return the root of a path, i.e. the first path component. We allow / as an alternative path separator on Windows because it helps with testing and forward slashes are common even on Windows in portable codebases. """ first_sep = path.find(os.path.sep) if os.path.sep != '/' and first_sep == -1: first_sep = path.find('/') if first_sep == -1: return None return path[0:first_sep] def _IsSameProject(line_info, edited_file, project): """Return true if included file and edited file are in the same project. An included_file is in project 'project' if the project is a prefix of the included_file. 'project' should end with /. As a special case, if project is '', then the project is defined to be the top-level directory of edited_file. Arguments: line_info: a LineInfo structure with .key containing the file that is being included. edited_file: the name of the file being edited. project: if '', set the project path to be the top-level directory name of the file being edited. If not '', this value is used to specify the project directory. Returns: True if line_info and filename belong in the same project, False otherwise. """ included_file = line_info.key[1:] if project != '': return included_file.startswith(project) included_root = _GetPathRoot(included_file) edited_root = _GetPathRoot(edited_file) return (included_root and edited_root and included_root == edited_root) def _GetLineKind(file_line, filename, separate_project_includes): """Given a file_line + file being edited, return best *_KIND value or None.""" line_without_coments = _COMMENT_RE.sub('', file_line.line) if file_line.deleted: return None elif _IsMainCUInclude(file_line, filename): return _MAIN_CU_INCLUDE_KIND elif _IsSystemInclude(file_line) and '.' in line_without_coments: return _C_SYSTEM_INCLUDE_KIND elif _IsSystemInclude(file_line): return _CXX_SYSTEM_INCLUDE_KIND elif file_line.type == _INCLUDE_RE: if (separate_project_includes and _IsSameProject(file_line, filename, separate_project_includes)): return _PROJECT_INCLUDE_KIND return _NONSYSTEM_INCLUDE_KIND elif file_line.type == _FORWARD_DECLARE_RE: return _FORWARD_DECLARE_KIND else: return None def _FirstReorderSpanWith(file_lines, good_reorder_spans, kind, filename, flags): """Returns [start_line,end_line) of 1st reorder_span with a line of kind kind. This function iterates over all the reorder_spans in file_lines, and calculates the first one that has a line of the given kind in it. If no such reorder span is found, it takes the last span of 'lower' kinds (main-cu kind is lowest, forward-declare is highest). If no such reorder span is found, it takes the first span of 'higher' kind, but not considering the forward-declare kind (we don't want to put an #include with the first forward-declare, because it may be inside a class or something weird). If there's *still* no match, we return the first line past leading comments, whitespace, and #ifdef guard lines. If there's *still* no match, we just insert at end-of-file. As a special case, we never return a span for forward-declares that is after 'contentful' code, even if other forward-declares are there. For instance: using Foo::Bar; class Bang; We want to make sure to put 'namespace Foo { class Bar; }' *before* the using line! kind is one of the following enums, with examples: _MAIN_CU_INCLUDE_KIND: #include "foo.h" when editing foo.cc _C_SYSTEM_INCLUDE_KIND: #include _CXX_SYSTEM_INCLUDE_KIND: #include _NONSYSTEM_INCLUDE_KIND: #include "bar.h" _PROJECT_INCLUDE_KIND: #include "myproject/quux.h" _FORWARD_DECLARE_KIND: class Baz; Arguments: file_lines: an array of LineInfo objects with .type and .reorder_span filled in. good_reorder_spans: a sorted list of reorder_spans to consider (should not include reorder_spans inside #ifdefs or namespaces). kind: one of *_KIND values. filename: the name of the file that file_lines comes from. This is passed to _GetLineKind (are we a main-CU #include?) flags: commandline flags, as parsed by optparse. We use flags.separate_project_includes to sort the #includes for the current project separately from other #includes. Returns: A pair of line numbers, [start_line, end_line), that is the 'best' reorder_span in file_lines for the given kind. """ assert kind in (_MAIN_CU_INCLUDE_KIND, _C_SYSTEM_INCLUDE_KIND, _CXX_SYSTEM_INCLUDE_KIND, _NONSYSTEM_INCLUDE_KIND, _PROJECT_INCLUDE_KIND, _FORWARD_DECLARE_KIND), kind # Figure out where the first 'contentful' line is (after the first # 'good' span, so we skip past header guards and the like). Basically, # the first contentful line is a line not in any reorder span. for i in range(len(good_reorder_spans) - 1): if good_reorder_spans[i][1] != good_reorder_spans[i+1][0]: first_contentful_line = good_reorder_spans[i][1] break else: # got to the end of the file without finding a break in the spans if good_reorder_spans: first_contentful_line = good_reorder_spans[-1][1] else: first_contentful_line = 0 # Let's just find the first and last span for each kind. first_reorder_spans = {} last_reorder_spans = {} for reorder_span in good_reorder_spans: for line_number in range(*reorder_span): line_kind = _GetLineKind(file_lines[line_number], filename, flags.separate_project_includes) # Ignore forward-declares that come after 'contentful' code; we # never want to insert new forward-declares there. if (line_kind == _FORWARD_DECLARE_KIND and line_number > first_contentful_line): continue if line_kind is not None: first_reorder_spans.setdefault(line_kind, reorder_span) last_reorder_spans[line_kind] = reorder_span # Find the first span of our kind. if kind in first_reorder_spans: return first_reorder_spans[kind] # Second choice: last span of the kinds above us: for backup_kind in range(kind - 1, _MAIN_CU_INCLUDE_KIND - 1, -1): if backup_kind in last_reorder_spans: return last_reorder_spans[backup_kind] # Third choice: first span of the kinds below us, but not counting # _FORWARD_DECLARE_KIND. for backup_kind in range(kind + 1, _FORWARD_DECLARE_KIND): if backup_kind in first_reorder_spans: return first_reorder_spans[backup_kind] # There are no reorder-spans at all, or they are only # _FORWARD_DECLARE spans. Return the first line past the leading # comments, whitespace, and #ifdef guard lines, or the beginning # of the _FORWARD_DECLARE span, whichever is smaller. line_number = 0 seen_header_guard = False while line_number < len(file_lines): if file_lines[line_number].deleted: line_number += 1 elif file_lines[line_number].type == _HEADER_GUARD_RE: seen_header_guard = True line_number += 2 # skip over the header guard elif file_lines[line_number].type == _BLANK_LINE_RE: line_number += 1 elif file_lines[line_number].type == _PRAGMA_ONCE_LINE_RE: seen_header_guard = True line_number += 1 elif (file_lines[line_number].type == _COMMENT_LINE_RE and not seen_header_guard): # We put #includes after top-of-file comments. But comments # inside the header guard are no longer top-of-file comments; # #includes go before them. line_number += 1 else: # If the "first line" we would return is inside the forward-declare # reorder span, just return that span, rather than creating a new # span inside the existing one. if first_reorder_spans: assert list(first_reorder_spans.keys()) == [_FORWARD_DECLARE_KIND], \ first_reorder_spans if line_number >= first_reorder_spans[_FORWARD_DECLARE_KIND][0]: return first_reorder_spans[_FORWARD_DECLARE_KIND] return (line_number, line_number) # OK, I guess just insert at the end of the file return (len(file_lines), len(file_lines)) def _RemoveNamespacePrefix(fwd_decl_iwyu_line, namespace_prefix): """Return a version of the input line with namespace_prefix removed, or None. If fwd_decl_iwyu_line is namespace ns1 { namespace ns2 { namespace ns3 { foo } } } and namespace_prefix = 'namespace ns1 { namespace ns2 {', then this function returns 'namespace ns3 { foo }'. It removes the namespace_prefix, and any } }'s at the end of the line. If line does not fit this form, then this function returns None. Arguments: line: a line from iwyu about a forward-declare line to add namespace_prefix: a non-empty string of the form namespace { namespace { [...] Returns: A version of the input line with the namespaces in namespace prefix removed, or None if this is not possible because the input line is not of the right form. """ assert namespace_prefix, "_RemoveNamespaces requires a non-empty prefix" if not fwd_decl_iwyu_line.startswith(namespace_prefix): return None # Remove the prefix fwd_decl_iwyu_line = fwd_decl_iwyu_line[len(namespace_prefix):].lstrip() # Remove the matching trailing }'s, preserving comments. num_braces = namespace_prefix.count('{') ending_braces_re = re.compile(r'(\s*\}){%d}\s*$' % num_braces) m = ending_braces_re.search(fwd_decl_iwyu_line) if not m: return None fwd_decl_iwyu_line = fwd_decl_iwyu_line[:m.start(0)] return fwd_decl_iwyu_line def _DecoratedMoveSpanLines(iwyu_record, file_lines, move_span_lines, flags): """Given a span of lines from file_lines, returns a "decorated" result. First, we construct the actual contents of the move-span, as a list of strings (one per line). If we see an #include in the move_span, we replace its comments with the ones in iwyu_record, if present (iwyu_record will never have any comments if flags.comments is False). Second, we construct a string, of the 'contentful' part of the move_span -- that is, without the leading comments -- with whitespace removed, and a few other changes made. This is used for sorting (we remove whitespace so '# include ' compares properly against '#include '). Third, we figure out the 'kind' of this span: system include, main-cu include, etc. We return all of these together in a tuple, along with the reorder-span this move span is inside. We pick the best reorder-span if one isn't already present (because it's an #include we're adding in, for instance.) This allows us to sort all the moveable content. Arguments: iwyu_record: the IWYUOutputRecord struct for this source file. file_lines: a list of LineInfo objects holding the parsed output of the file in iwyu_record.filename move_span_lines: A list of LineInfo objects. For #includes and forward-declares already in the file, this will be a sub-list of file_lines. For #includes and forward-declares we're adding in, it will be a newly created list. flags: commandline flags, as parsed by optparse. We use flags.separate_project_includes to sort the #includes for the current project separately from other #includes. Returns: A tuple (reorder_span, kind, sort_key, all_lines_as_list) sort_key is the 'contentful' part of the move_span, which whitespace removed, and -inl.h changed to _inl.h (so it sorts later). all_lines_as_list is a list of strings, not of LineInfo objects. Returns None if the move-span has been deleted, or for some other reason lacks an #include or forward-declare line. """ # Get to the first contentful line. for i in range(len(move_span_lines)): if (not move_span_lines[i].deleted and move_span_lines[i].type in (_INCLUDE_RE, _FORWARD_DECLARE_RE)): first_contentful_line = i break else: # for/else # No include or forward-declare line seen, must be a deleted span. return None firstline = move_span_lines[first_contentful_line] m = _INCLUDE_RE.match(firstline.line) if m: # If we're an #include, the contentful lines are easy. But we have # to do the comment-replacing first. sort_key = firstline.line iwyu_version = iwyu_record.full_include_lines.get(m.group(1), '') if _COMMENT_LINE_RE.search(iwyu_version): # the iwyu version has comments sort_key = iwyu_version # replace the comments all_lines = ([li.line for li in move_span_lines[:-1] if not li.deleted] + [sort_key]) else: # We're a forward-declare. Also easy. contentful_list = [li.line for li in move_span_lines[first_contentful_line:] if not li.deleted] sort_key = ''.join(contentful_list) all_lines = [li.line for li in move_span_lines if not li.deleted] # Get rid of whitespace in the contentful_lines sort_key = re.sub(r'\s+', '', sort_key) # Replace -inl.h with _inl.h so foo-inl.h sorts after foo.h in #includes. sort_key = sort_key.replace('-inl.h', '_inl.h') # Next figure out the kind. kind = _GetLineKind(firstline, iwyu_record.filename, flags.separate_project_includes) # All we're left to do is the reorder-span we're in. Hopefully it's easy. reorder_span = firstline.reorder_span if reorder_span is None: # must be a new #include we're adding # If we're a forward-declare inside a namespace, see if there's a # reorder span inside the same namespace we can fit into. if kind == _FORWARD_DECLARE_KIND: namespace_reorder_spans = _GetNamespaceLevelReorderSpans(file_lines) for namespace_prefix, possible_reorder_span in namespace_reorder_spans: if (namespace_prefix and possible_reorder_span and firstline.line.startswith(namespace_prefix)): # Great, we can go into this reorder_span. We also need to # modify all-lines because this line doesn't need the # namespace prefix anymore. Make sure we can do that before # succeeding. new_firstline = _RemoveNamespacePrefix(firstline.line, namespace_prefix) if new_firstline: assert all_lines[first_contentful_line] == firstline.line all_lines[first_contentful_line] = new_firstline sort_key = re.sub(r'\s+', '', new_firstline) reorder_span = possible_reorder_span break # If that didn't work out, find a top-level reorder span to go into. if reorder_span is None: # TODO(csilvers): could make this more efficient by storing, per-kind. toplevel_reorder_spans = _GetToplevelReorderSpans(file_lines) reorder_span = _FirstReorderSpanWith(file_lines, toplevel_reorder_spans, kind, iwyu_record.filename, flags) return (reorder_span, kind, sort_key, all_lines) def _CommonPrefixLength(a, b): """Given two lists, returns the index of 1st element not common to both.""" end = min(len(a), len(b)) for i in range(end): if a[i] != b[i]: return i return end def _NormalizeNamespaceForwardDeclareLines(lines): """'Normalize' namespace lines in a list of output lines and return new list. When suggesting new forward-declares to insert, iwyu uses the following format, putting each class on its own line with all namespaces: namespace foo { namespace bar { class A; } } namespace foo { namespace bar { class B; } } namespace foo { namespace bang { class C; } } We convert this to 'normalized' form, which puts namespaces on their own line and collects classes together: namespace foo { namespace bar { class A; class B; } // namespace bar namespace bang { class C; } // namespace bang } // namespace foo Non-namespace lines are left alone. Only adjacent namespace lines from the input are merged. Arguments: lines: a list of output-lines -- that is, lines that are ready to be emitted as-is to the output file. Returns: A new version of lines, with namespace lines normalized as above. """ # iwyu input is very regular, which is nice. iwyu_namespace_re = re.compile(r'namespace ([^{]*) { ') iwyu_classname_re = re.compile(r'{ ([^{}]*) }') retval = [] current_namespaces = [] # We append a blank line so the final namespace-closing happens "organically". for line in lines + ['']: namespaces_in_line = iwyu_namespace_re.findall(line) differ_pos = _CommonPrefixLength(namespaces_in_line, current_namespaces) namespaces_to_close = reversed(current_namespaces[differ_pos:]) namespaces_to_open = namespaces_in_line[differ_pos:] retval.extend('} // namespace %s' % ns for ns in namespaces_to_close) retval.extend('namespace %s {' % ns for ns in namespaces_to_open) current_namespaces = namespaces_in_line # Now add the current line. If we were a namespace line, it's the # 'class' part of the line (everything but the 'namespace {'s). if namespaces_in_line: m = iwyu_classname_re.search(line) if not m: raise FixIncludesError('Malformed namespace line from iwyu: %s', line) retval.append(m.group(1)) else: retval.append(line) assert retval and retval[-1] == '', 'What happened to our sentinel line?' return retval[:-1] def _DeleteLinesAccordingToIwyu(iwyu_record, file_lines): """Deletes all lines that iwyu_record tells us to, and cleans up after.""" for line_number in iwyu_record.lines_to_delete: # Delete the entire move-span (us and our preceding comments). for i in range(*file_lines[line_number].move_span): file_lines[i].deleted = True while True: num_deletes = _DeleteEmptyNamespaces(file_lines) num_deletes += _DeleteEmptyIfdefs(file_lines) if num_deletes == 0: break # Also delete any duplicate lines in the input. To avoid trouble # (accidentally deleting inside an #ifdef, for instance), we only # check 'top-level' #includes and forward-declares. toplevel_reorder_spans = _GetToplevelReorderSpans(file_lines) _DeleteDuplicateLines(file_lines, toplevel_reorder_spans) # If a whole reorder span was deleted, check if it has extra # whitespace on both sides that we could trim. We've already # deleted extra blank lines inside #ifdefs and namespaces, # so looking at toplevel spans is enough. for reorder_span in toplevel_reorder_spans: _DeleteExtraneousBlankLines(file_lines, reorder_span) def _GetSymbolNameFromForwardDeclareLine(line): """Given a forward declare line to add from iwyu output, get symbol. Two possibilities: In or not in namespace(s). If in namespaces, then return foo::bar::sym. Else just sym. """ iwyu_namespace_re = re.compile(r'namespace ([^{]*) { ') symbolname_re = re.compile(r'([A-Za-z0-9_]+)') # Turn anonymous namespaces into their proper symbol representation. namespaces_in_line = iwyu_namespace_re.findall(line.replace( "namespace {", "namespace (anonymous namespace) {")) symbols_in_line = symbolname_re.findall(line) symbol_name = symbols_in_line[-1] if (namespaces_in_line): symbol_name = '::'.join(namespaces_in_line) + '::' + symbol_name return symbol_name def FixFileLines(iwyu_record, file_lines, flags, fileinfo): """Applies one block of lines from the iwyu output script. Called once we have read all the lines from the iwyu output script pertaining to a single source file, and parsed them into an iwyu_record. At that point we edit the source file, remove the old #includes and forward-declares, insert the #includes and forward-declares, and reorder the lot, all as specified by the iwyu output script. The resulting source code lines are returned. Arguments: iwyu_record: an IWYUOutputRecord object holding the parsed output of the include-what-you-use script (run at verbose level 1 or higher) pertaining to a single source file. file_lines: a list of LineInfo objects holding the parsed output of the file in iwyu_record.filename flags: commandline flags, as parsed by optparse. We use flags.safe_headers to turn off deleting lines, and use the other flags indirectly (via calls to other routines). fileinfo: FileInfo for the current file. Returns: An array of 'fixed' source code lines, after modifications as specified by iwyu. """ # First delete the includes and forward-declares that we should delete. # This is easy since iwyu tells us the line numbers. if not (flags.safe_headers and _MayBeHeaderFile(iwyu_record.filename)): _DeleteLinesAccordingToIwyu(iwyu_record, file_lines) # With these deletions, we may be able to merge together some # reorder-spans. Recalculate them to see. _CalculateReorderSpans(file_lines) # For every move-span in our file -- that's every #include and # forward-declare we saw -- 'decorate' the move-range to allow us # to sort them. move_spans = OrderedSet([fl.move_span for fl in file_lines if fl.move_span]) decorated_move_spans = [] for (start_line, end_line) in move_spans: decorated_span = _DecoratedMoveSpanLines(iwyu_record, file_lines, file_lines[start_line:end_line], flags) if decorated_span: decorated_move_spans.append(decorated_span) # Now let's add in a decorated move-span for all the new #includes # and forward-declares. symbol_names_seen = set() for line in iwyu_record.includes_and_forward_declares_to_add: line_info = LineInfo(line) m = _INCLUDE_RE.match(line) if m: line_info.type = _INCLUDE_RE line_info.key = m.group(1) else: # Avoid duplicates that can arise if different template args # were suggested by different iwyu analyses for this file. symbol_name = _GetSymbolNameFromForwardDeclareLine(line) if symbol_name in symbol_names_seen: continue symbol_names_seen.add(symbol_name) line_info.type = _FORWARD_DECLARE_RE decorated_span = _DecoratedMoveSpanLines(iwyu_record, file_lines, [line_info], flags) assert decorated_span, 'line to add is not an #include or fwd-decl?' decorated_move_spans.append(decorated_span) # Add a sentinel decorated move-span, to make life easy, and sort. decorated_move_spans.append(((len(file_lines), len(file_lines)), _EOF_KIND, '', [])) if flags.reorder: decorated_move_spans.sort() else: decorated_move_spans.sort(key=lambda x: x[0:-2]) # Now go through all the lines of the input file and construct the # output file. Before we get to the next reorder-span, we just # copy lines over verbatim (ignoring deleted lines, of course). # In a reorder-span, we just print the sorted content, introducing # blank lines when appropriate. output_lines = [] line_number = 0 while line_number < len(file_lines): current_reorder_span = decorated_move_spans[0][0] # Just copy over all the lines until the next reorder span. while line_number < current_reorder_span[0]: if not file_lines[line_number].deleted: output_lines.append(file_lines[line_number].line) line_number += 1 # Now fill in the contents of the reorder-span from decorated_move_spans new_lines = [] while (decorated_move_spans and decorated_move_spans[0][0] == current_reorder_span): new_lines.extend(decorated_move_spans[0][3]) # the full content if (len(decorated_move_spans) > 1 and _ShouldInsertBlankLine(decorated_move_spans[0], decorated_move_spans[1], file_lines, flags)): new_lines.append('') decorated_move_spans = decorated_move_spans[1:] # pop if not flags.keep_iwyu_namespace_format: # Now do the munging to convert namespace lines from the iwyu input # format to the 'official style' format: # 'namespace foo { class Bar; }\n' -> 'namespace foo {\nclass Bar;\n}' # along with collecting multiple classes in the same namespace. new_lines = _NormalizeNamespaceForwardDeclareLines(new_lines) # Add line separators to the new lines. new_lines = [nl.rstrip() + fileinfo.linesep for nl in new_lines] output_lines.extend(new_lines) line_number = current_reorder_span[1] # go to end of span return [line for line in output_lines if line is not None] def FixOneFile(iwyu_record, file_contents, flags, fileinfo): """Parse a file guided by an iwyu_record and flags and apply IWYU fixes. Returns two lists of lines (old, fixed). """ file_lines = ParseOneFile(file_contents, iwyu_record) old_lines = [fl.line for fl in file_lines if fl is not None and fl.line is not None] fixed_lines = FixFileLines(iwyu_record, file_lines, flags, fileinfo) return old_lines, fixed_lines def FixManyFiles(iwyu_records, flags): """Given a list of iwyu_records, fix each file listed in the record. For each iwyu record in the input, which lists the #includes and forward-declares to add, remove, and re-sort, loads the file, makes the fixes, and writes the fixed file to disk. The flags affect the details of the fixing. Arguments: iwyu_records: a collection of IWYUOutputRecord objects holding the parsed output of the include-what-you-use script (run at verbose level 1 or higher) pertaining to a single source file. iwyu_record.filename indicates what file to edit. flags: commandline flags, as parsed by optparse.. Returns: The number of files fixed (as opposed to ones that needed no fixing). """ files_fixed = 0 for iwyu_record in iwyu_records: try: fileinfo = FileInfo.parse(iwyu_record.filename) file_contents = _ReadFile(iwyu_record.filename, fileinfo) if not file_contents: continue print(">>> Fixing #includes in '%s'" % iwyu_record.filename) old_lines, fixed_lines = FixOneFile(iwyu_record, file_contents, flags, fileinfo) if old_lines == fixed_lines: print("No changes in file %s" % iwyu_record.filename) continue if flags.dry_run: PrintFileDiff(old_lines, fixed_lines) else: _WriteFile(iwyu_record.filename, fileinfo, fixed_lines) files_fixed += 1 except FixIncludesError as why: print('ERROR: %s - skipping file %s' % (why, iwyu_record.filename)) print('IWYU edited %d files on your behalf.\n' % files_fixed) return files_fixed def ProcessIWYUOutput(f, files_to_process, flags, cwd): """Fix the #include and forward-declare lines as directed by f. Given a file object that has the output of the include_what_you_use script, see every file to be edited and edit it, if appropriate. Arguments: f: an iterable object that is the output of include_what_you_use. files_to_process: A set of filenames, or None. If not None, we ignore files mentioned in f that are not in files_to_process. flags: commandline flags, as parsed by optparse. The only flag we use directly is flags.ignore_re, to indicate files not to process; we also pass the flags to other routines. cwd: the current working directory, externalized for testing. Returns: The number of files that had to be modified (because they weren't already all correct). In dry_run mode, returns the number of files that would have been modified. """ if files_to_process is not None: files_to_process = [NormalizeFilePath(cwd, fname) for fname in files_to_process] # First collect all the iwyu data from stdin. # Maintain sort order by using OrderedDict instead of dict iwyu_output_records = OrderedDict() # IWYUOutputRecords keyed by filename while True: iwyu_output_parser = IWYUOutputParser() try: iwyu_record = iwyu_output_parser.ParseOneRecord(f, flags) if not iwyu_record: break except FixIncludesError as why: print('ERROR: %s' % why) continue filename = NormalizeFilePath(flags.basedir, iwyu_record.filename) if files_to_process is not None and filename not in files_to_process: print('(skipping %s: not listed on commandline)' % filename) continue if flags.ignore_re and re.search(flags.ignore_re, filename): print('(skipping %s: it matches --ignore_re, which is %s)' % ( filename, flags.ignore_re)) continue if flags.only_re and not re.search(flags.only_re, filename): print('(skipping %s: it does not match --only_re, which is %s)' % ( filename, flags.only_re)) continue if filename in iwyu_output_records: iwyu_output_records[filename].Merge(iwyu_record) else: iwyu_output_records[filename] = iwyu_record # Now ignore all the files that never had any contentful changes # seen for them. (We have to wait until we're all done, since a .h # file may have a contentful change when #included from one .cc # file, but not another, and we need to have merged them above.) for filename in iwyu_output_records: if not iwyu_output_records[filename].HasContentfulChanges(): print('(skipping %s: iwyu reports no contentful changes)' % filename) # Mark that we're skipping this file by setting the record to None iwyu_output_records[filename] = None # Now do all the fixing, and return the number of files modified contentful_records = [ior for ior in iwyu_output_records.values() if ior] return FixManyFiles(contentful_records, flags) def NormalizeFilePath(basedir, filename): """ Normalize filename to be comparable. If basedir has a value and filename is not already absolute, make filename absolute. Otherwise return filename as-is. """ if basedir and not os.path.isabs(filename): return os.path.normpath(os.path.join(basedir, filename)) return filename def SortIncludesInFiles(files_to_process, flags): """For each file in files_to_process, sort its #includes. This reads each input file, sorts the #include lines, and replaces the input file with the result. SortIncludesInFiles does not add or remove any #includes. It also ignores forward-declares. Arguments: files_to_process: a list (or set) of filenames. flags: commandline flags, as parsed by optparse. We do not use any flags directly, but pass them to other routines. Returns: The number of files that had to be modified (because they weren't already all correct, that is, already in sorted order). """ sort_only_iwyu_records = [] for filename in files_to_process: filename = NormalizeFilePath(flags.basedir, filename) # An empty iwyu record has no adds or deletes, so its only effect # is to cause us to sort the #include lines. (Since fix_includes # gets all its knowledge of where forward-declare lines are from # the iwyu input, with an empty iwyu record it just ignores all # the forward-declare lines entirely.) sort_only_iwyu_records.append(IWYUOutputRecord(filename)) return FixManyFiles(sort_only_iwyu_records, flags) def main(argv): # Parse the command line. parser = optparse.OptionParser(usage=_USAGE) parser.add_option('-b', '--blank_lines', action='store_true', default=True, help=('Put a blank line between primary header file and' ' C/C++ system #includes, and another blank line' ' between system #includes and google #includes' ' [default]')) parser.add_option('--noblank_lines', action='store_false', dest='blank_lines') parser.add_option('--comments', action='store_true', default=False, help='Put comments after the #include lines') parser.add_option('--nocomments', action='store_false', dest='comments') parser.add_option('--safe_headers', action='store_true', default=True, help=('Do not remove unused #includes/fwd-declares from' ' header files; just add new ones [default]')) parser.add_option('--nosafe_headers', action='store_false', dest='safe_headers') parser.add_option('--reorder', action='store_true', default=False, help=('Re-order lines relative to other similar lines ' '(e.g. headers relative to other headers)')) parser.add_option('--noreorder', action='store_false', dest='reorder', help=('Do not re-order lines relative to other similar ' 'lines.')) parser.add_option('-s', '--sort_only', action='store_true', help=('Just sort #includes of files listed on cmdline;' ' do not add or remove any #includes')) parser.add_option('-n', '--dry_run', action='store_true', default=False, help=('Do not actually edit any files; just print diffs.' ' Return code is 0 if no changes are needed,' ' else min(the number of files that would be' ' modified, 100)')) parser.add_option('--ignore_re', default=None, help=('fix_includes.py will skip editing any file whose' ' name matches this regular expression.')) parser.add_option('--only_re', default=None, help='fix_includes.py will skip editing any file whose' ' name does not match this regular expression.') parser.add_option('--separate_project_includes', default=None, help=('Sort #includes for current project separately' ' from all other #includes. This flag specifies' ' the root directory of the current project.' ' If the value is "", #includes that share the' ' same top-level directory are assumed to be in the' ' same project. If not specified, project #includes' ' will be sorted with other non-system #includes.')) parser.add_option('-m', '--keep_iwyu_namespace_format', action='store_true', default=False, help=('Keep forward-declaration namespaces in IWYU format, ' 'eg. namespace n1 { namespace n2 { class c1; } }.' ' Do not convert to "normalized" Google format: ' 'namespace n1 {\\nnamespace n2 {\\n class c1;' '\\n}\\n}.')) parser.add_option('--nokeep_iwyu_namespace_format', action='store_false', dest='keep_iwyu_namespace_format') parser.add_option('--basedir', '-p', default=None, help=('Specify the base directory. fix_includes will ' 'interpret non-absolute filenames relative to this ' 'path.')) (flags, files_to_modify) = parser.parse_args(argv[1:]) if files_to_modify: files_to_modify = set(files_to_modify) else: files_to_modify = None if (flags.separate_project_includes and not flags.separate_project_includes.startswith('<') and # 'special' vals not flags.separate_project_includes.endswith(os.path.sep) and not flags.separate_project_includes.endswith('/')): flags.separate_project_includes += os.path.sep if flags.sort_only: if not files_to_modify: sys.exit('FATAL ERROR: -s flag requires a list of filenames') return SortIncludesInFiles(files_to_modify, flags) else: return ProcessIWYUOutput(sys.stdin, files_to_modify, flags, cwd=os.getcwd()) if __name__ == '__main__': num_files_fixed = main(sys.argv) sys.exit(min(num_files_fixed, 100)) include-what-you-use-clang_8.0/fix_includes_test.py000077500000000000000000003576141345265751700226440ustar00rootroot00000000000000#!/usr/bin/env python ##===--- fix_includes_test.py - test for fix_includes.py ------------------===## # # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. # ##===----------------------------------------------------------------------===## from __future__ import print_function """Test for fix_includes.py Test test test! """ __author__ = 'csilvers@google.com (Craig Silverstein)' try: from cStringIO import StringIO except ImportError: from io import StringIO import re import sys # I use unittest instead of googletest to ease opensourcing. import unittest import fix_includes class FakeFlags(object): def __init__(self): self.blank_lines = False self.comments = True self.dry_run = False self.ignore_re = None self.only_re = None self.safe_headers = False self.separate_project_includes = None self.keep_iwyu_namespace_format = False self.reorder = True self.basedir = None class FixIncludesBase(unittest.TestCase): """Does setup that every test will want.""" def _ReadFile(self, filename, fileinfo): assert filename in self.before_map, filename return self.before_map[filename] def _ParseFileInfo(self, filename): return fix_includes.FileInfo('\n', 'utf-8') def _WriteFile(self, filename, fileinfo, contents): return self.actual_after_contents.extend(contents) def setUp(self): self.flags = FakeFlags() # Map from filename to its contents (a list of lines) before fixing. self.before_map = {} # Map from filename to the 'correct' contents it should have after fixing. self.expected_after_map = {} # INPUT: fix_includes._ReadFile takes a filename # and returns the contents of filename (as a list). # FileInfo controls encoding details of the file, # wire it to return something that agrees with the # tests. fix_includes._ReadFile = self._ReadFile fix_includes.FileInfo.parse = self._ParseFileInfo # OUTPUT: Instead of writing to file, save full output. self.actual_after_contents = [] fix_includes._WriteFile = self._WriteFile # Stub out stdout self.stdout_stub = StringIO() fix_includes.sys.stdout = self.stdout_stub def RegisterFileContents(self, file_contents_map): """Parses and stores the given map from filename to file-contents. The values of the map are file 'contents', written in a simple markup language that allows us to encode both the 'before' and expected 'after' contents of a file. Every line is taken literally to be in both the before and after, with the following exceptions: 1) Lines that look like '///+foo' are removed from 'before', and replaced by 'foo' in 'after'. (This is an 'add' instruction.) 2) Lines that end in '///-' are removed from both 'after' and the '\s*///-' suffix is removed from 'before'. (This is a 'remove' instruction.) This function processes the input map to produce self.before_map and self.expected_after_map. Arguments: file_contents_map: a map from filename to 'contents'. Contents is a string, having the format mentioned above. """ remove_re = re.compile('\s*///-$') for (filename, contents) in file_contents_map.items(): before_contents = [] expected_after_contents = [] for line in contents.splitlines(True): m = remove_re.search(line) if m: # The trailing line separator is stripped, so append a '\n'. before_contents.append(line[:m.start()] + '\n') elif line.startswith('///+'): expected_after_contents.append(line[len('///+'):]) else: before_contents.append(line) expected_after_contents.append(line) self.before_map[filename] = before_contents self.expected_after_map[filename] = expected_after_contents def ProcessAndTest(self, iwyu_output, cmdline_files=None, unedited_files=[], expected_num_modified_files=None, cwd=None): """For all files mentioned in iwyu_output, compare expected and actual. Arguments: iwyu_output: the output the iwyu script gave when run over the set of input files. cmdline_files: files to pass in to ProcessIWYUOutput (that, in an actual fix_includes run, would come from the commandline). These limit what files fix_includes chooses to edit. unedited_files: the list of files that are listed in iwyu_output, but fix_files has chosen not to edit for some reason. expected_num_modified_files: what we expect ProcessIWYUOutput to return. If None, suppress this check. cwd: working directory passed to ProcessIWYUOutput, used to normalize paths in cmdline_files. If None, no normalization occurs. """ filenames = re.findall('^(\S+) should add these lines:', iwyu_output, re.M) if not filenames: # This is the other possible starting-line filenames = re.findall('^\((\S+) has correct #includes/fwd-decls\)', iwyu_output, re.M) expected_after = [] for filename in fix_includes.OrderedSet(filenames): # uniquify filename = fix_includes.NormalizeFilePath(self.flags.basedir, filename) if filename not in unedited_files: expected_after.extend(self.expected_after_map[filename]) iwyu_output_as_file = StringIO(iwyu_output) num_modified_files = fix_includes.ProcessIWYUOutput(iwyu_output_as_file, cmdline_files, self.flags, cwd=cwd) if expected_after != self.actual_after_contents: print("=== Expected:") for line in expected_after: print(line) print("=== Got:") for line in self.actual_after_contents: print(line) print("===") self.assertListEqual(expected_after, self.actual_after_contents) if expected_num_modified_files is not None: self.assertEqual(expected_num_modified_files, num_modified_files) class FixIncludesTest(FixIncludesBase): """End-to-end tests from input file to output file.""" def testSimple(self): infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ simple should add these lines: #include #include "used2.h" simple should remove these lines: - #include // lines 3-3 The full include-list for simple: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'simple': infile}) self.ProcessAndTest(iwyu_output, expected_num_modified_files=1) def testUnifiedDiffOutput(self): """Test the unified diff output generated by dry runs.""" infile = """ #include int main() { return 0; } """ iwyu_output = """\ unified_diff.cc should add these lines: unified_diff.cc should remove these lines: - #include // lines 2-2 The full include-list for unified_diff.cc: --- """ diff_expect = """\ >>> Fixing #includes in 'unified_diff.cc' @@ -1,4 +1,2 @@ - -#include int main() { return 0; } IWYU edited 1 files on your behalf. """ self.flags.dry_run = True self.RegisterFileContents({'unified_diff.cc': infile}) self.ProcessAndTest(iwyu_output, unedited_files=['unified_diff.cc']) self.assertEqual(self.stdout_stub.getvalue(), diff_expect) def testNodiffOutput(self): """Tests handling of the '( has correct #includes)' iwyu output.""" infile = """\ // Copyright 2010 #include #include // iwyu will not reorder, even though non-alphabetical namespace Foo; namespace Bar; int main() { return 0; } """ iwyu_output = "(nodiffs.h has correct #includes/fwd-decls)\n" self.RegisterFileContents({'nodiffs.h': infile}) # fix_includes gives special output when there are no changes, so # we can't use the normal ProcessAndTest. iwyu_output_as_file = StringIO(iwyu_output) num_modified_files = fix_includes.ProcessIWYUOutput(iwyu_output_as_file, None, self.flags, None) self.assertListEqual([], self.actual_after_contents) # 'no diffs' self.assertEqual(0, num_modified_files) def testNodiffOutputWithNoSorting(self): """Tests 'correct #includes' iwyu output, but does not need reordering.""" infile = """\ // Copyright 2010 #include #include namespace Foo; namespace Bar; int main() { return 0; } """ iwyu_output = "(nodiffs_nosorting.h has correct #includes/fwd-decls)\n" self.RegisterFileContents({'nodiffs_nosorting.h': infile}) # fix_includes gives special output when there are no changes, so # we can't use the normal ProcessAndTest. iwyu_output_as_file = StringIO(iwyu_output) num_modified_files = fix_includes.ProcessIWYUOutput(iwyu_output_as_file, None, self.flags, None) self.assertListEqual([], self.actual_after_contents) # 'no diffs' self.assertEqual(0, num_modified_files) def testRemoveEmptyNamespace(self): """Tests we remove a namespace if we remove all fwd-decls inside it.""" infile = """\ // Copyright 2010 #include namespace ns { ///- class Foo; ///- namespace ns2 { ///- namespace ns3 { ///- class Bar; ///- } } ///- class Baz; ///- } ///- ///- int main() { return 0; } """ iwyu_output = """\ empty_namespace should add these lines: empty_namespace should remove these lines: - class Foo; // lines 6-6 - namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } // lines 9-9 - namespace ns { class Baz; } } // lines 11-11 The full include-list for empty_namespace: #include --- """ self.RegisterFileContents({'empty_namespace': infile}) self.ProcessAndTest(iwyu_output) def testRemoveEmptyAllmanNamespace(self): """Tests we remove a namespace with Allman braces if we remove all fwd-decls inside it.""" infile = """\ // Copyright 2010 #include namespace ns ///- { ///- class Foo; ///- namespace ns2 ///- { ///- namespace ns3 ///- { ///- class Bar; ///- } ///- } ///- class Baz; ///- } ///- ///- int main() { return 0; } """ iwyu_output = """\ empty_namespace should add these lines: empty_namespace should remove these lines: - class Foo; // lines 7-7 - namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } // lines 12-12 - namespace ns { class Baz; } } // lines 15-15 The full include-list for empty_namespace: #include --- """ self.RegisterFileContents({'empty_namespace': infile}) self.ProcessAndTest(iwyu_output) def testRemoveEmptyMixedNamespace(self): """Tests we remove a namespace with mixed braces if we remove all fwd-decls inside it.""" infile = """\ // Copyright 2010 #include namespace ns ///- { ///- class Foo; ///- namespace ns2 { namespace ns3 ///- { ///- class Bar; ///- } ///- } ///- class Baz; ///- } ///- ///- int main() { return 0; } """ iwyu_output = """\ empty_namespace should add these lines: empty_namespace should remove these lines: - class Foo; // lines 7-7 - namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } // lines 10-10 - namespace ns { class Baz; } } // lines 13-13 The full include-list for empty_namespace: #include --- """ self.RegisterFileContents({'empty_namespace': infile}) self.ProcessAndTest(iwyu_output) def testCXX17NS(self): """Tests handling of output using the --cxx17ns switch.""" infile = """\ #include "cxx17ns-i1.h"///- ///+ ///+namespace a::b::c { ///+struct One; ///+} // namespace a::b::c ///+namespace a::b { ///+struct One2; ///+} // namespace a::b ///+namespace a { ///+struct One4; ///+struct One3; ///+} // namespace a struct Two { Two(a::b::c::One& one); Two(a::b::One2& one); Two(a::One3& one); Two(a::One4& one); }; """ iwyu_output = """\ cxx17ns.cc should add these lines: namespace a { namespace { struct One4; } } namespace a { struct One3; } namespace a::b { struct One2; } namespace a::b::c { struct One; } cxx17ns.cc should remove these lines: - #include "cxx17ns-i1.h" // lines 1-1 The full include-list for cxx17ns.cc: namespace a { namespace { struct One4; } } namespace a { struct One3; } namespace a::b { struct One2; } namespace a::b::c { struct One; } --- """ self.RegisterFileContents({'cxx17ns.cc': infile}) self.ProcessAndTest(iwyu_output) def testRemovePartOfEmptyNamespace(self): """Tests we remove a namespace if empty, but not enclosing namespaces.""" infile = """\ // Copyright 2010 namespace maps_transit_realtime { namespace service_alerts { class StaticServiceAlertStore; namespace trigger { ///- class Trigger; ///- } // namespace trigger ///- namespace ui { ///- class Alert; ///- } // namespace ui ///- } // namespace service_alerts } // namespace maps_transit_realtime int main() { return 0; } """ iwyu_output = """\ empty_internal_namespace should add these lines: empty_internal_namespace should remove these lines: - namespace maps_transit_realtime { namespace service_alerts { namespace trigger { class Trigger; } } } // lines 7-7 - namespace maps_transit_realtime { namespace service_alerts { namespace ui { class Alert; } } } // lines 10-10 The full include-list for empty_internal_namespace: namespace maps_transit_realtime { namespace service_alerts { class StaticServiceAlertStore; } } // lines 5-5 --- """ self.RegisterFileContents({'empty_internal_namespace': infile}) self.ProcessAndTest(iwyu_output) def testRemovePartOfEmptyAllmanNamespace(self): """Tests we remove a namespace with Allman braces if empty, but not enclosing namespaces.""" infile = """\ // Copyright 2010 namespace maps_transit_realtime { namespace service_alerts { class StaticServiceAlertStore; namespace trigger ///- { ///- class Trigger; ///- } // namespace trigger ///- namespace ui ///- { ///- class Alert; ///- } // namespace ui ///- } // namespace service_alerts } // namespace maps_transit_realtime int main() { return 0; } """ iwyu_output = """\ empty_internal_namespace should add these lines: empty_internal_namespace should remove these lines: - namespace maps_transit_realtime { namespace service_alerts { namespace trigger { class Trigger; } } } // lines 10-10 - namespace maps_transit_realtime { namespace service_alerts { namespace ui { class Alert; } } } // lines 14-14 The full include-list for empty_internal_namespace: namespace maps_transit_realtime { namespace service_alerts { class StaticServiceAlertStore; } } // lines 7-7 --- """ self.RegisterFileContents({'empty_internal_namespace': infile}) self.ProcessAndTest(iwyu_output) def testRemovePartOfEmptyMixedNamespace(self): """Tests we remove a namespace with mixed braces if empty, but not enclosing namespaces.""" infile = """\ // Copyright 2010 namespace maps_transit_realtime { class StaticServiceAlertStore; namespace service_alerts { namespace trigger ///- { ///- class Trigger; ///- } // namespace trigger ///- namespace ui ///- { ///- class Alert; ///- } // namespace ui ///- } // namespace service_alerts ///- } // namespace maps_transit_realtime int main() { return 0; } """ iwyu_output = """\ empty_internal_namespace should add these lines: empty_internal_namespace should remove these lines: - namespace maps_transit_realtime { namespace service_alerts { namespace trigger { class Trigger; } } } // lines 8-8 - namespace maps_transit_realtime { namespace service_alerts { namespace ui { class Alert; } } } // lines 12-12 The full include-list for empty_internal_namespace: namespace maps_transit_realtime { class StaticServiceAlertStore; } // lines 5-5 --- """ self.RegisterFileContents({'empty_internal_namespace': infile}) self.ProcessAndTest(iwyu_output) def testRemoveEmptyIfdef(self): """Tests we remove an #ifdef if we remove all #includes inside it.""" # Also makes sure we reorder properly around the removed ifdef. infile = """\ // Copyright 2010 #include ///+#include // Only on windows. ///- #ifdef OS_WINDOWS ///- #include ///- #include ///- #endif ///- #include "used.h" #include ///- ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ empty_ifdef should add these lines: #include "used2.h" empty_ifdef should remove these lines: - #include // lines 6-6 - #include // lines 7-7 The full include-list for empty_ifdef: #include #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'empty_ifdef': infile}) self.ProcessAndTest(iwyu_output) def testRemoveEmptyNestedIfdef(self): """Tests we remove an empty #ifdef inside a non-empty #ifdef.""" infile = """\ // Copyright 2010 #include #ifdef NDEBUG // Only on windows. ///- # ifdef OS_WINDOWS ///- # include ///- # include ///- # endif ///- # undef VERBOSE_LOGGING #endif ///+#include #include "used.h" #include ///- ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ empty_nested_ifdef should add these lines: #include "used2.h" empty_nested_ifdef should remove these lines: - #include // lines 7-7 - #include // lines 8-8 The full include-list for empty_nested_ifdef: #include #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'empty_nested_ifdef': infile}) self.ProcessAndTest(iwyu_output) def testNonEmptyIfdef(self): """Tests we keep an #ifdef if we don't remove all #includes inside it.""" infile = """\ // Copyright 2010 #include #ifdef OS_WINDOWS #include ///- #include #endif #include "used.h" ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ nonempty_ifdef should add these lines: #include "used2.h" nonempty_ifdef should remove these lines: - #include // lines 5-5 The full include-list for nonempty_ifdef: #include #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'nonempty_ifdef': infile}) self.ProcessAndTest(iwyu_output) def testKeepIfdefsWithNonIncludes(self): """Tests we keep an #ifdef if we have a non-#include inside it.""" infile = """\ // Copyright 2010 #include #ifdef OS_WINDOWS #define IN_WINDOWS #include ///- #endif #include "used.h" ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ nonempty_ifdef should add these lines: #include "used2.h" nonempty_ifdef should remove these lines: - #include // lines 6-6 The full include-list for nonempty_ifdef: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'nonempty_ifdef': infile}) self.ProcessAndTest(iwyu_output) def testRemoveComments(self): """Tests we remove comments above #includes.""" infile = """\ // Copyright 2010 #include // This file is not used. ///- #include ///- ///- // This file is not used either. ///- // It's not used. ///- // Not used at all. ///- #include ///- ///- #include "notused3.h" ///- // This comment should stay, it's not before an #include. const int kInt = 5; // This file is used. // It's definitedly used. #include "used.h" ///+#include "used2.h" const int kInt2 = 6; ///- // This forward-declare is in a reorder_span all by itself. ///- class NotUsed; ///- // This comment should stay, it's not before an #include. int main() { return 0; } """ iwyu_output = """\ remove_comments should add these lines: #include "used2.h" remove_comments should remove these lines: - #include // lines 5-5 - #include // lines 10-10 - #include "notused3.h" // lines 12-12 - class NotUsed; // lines 23-23 The full include-list for remove_comments: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'remove_comments': infile}) self.ProcessAndTest(iwyu_output) def testNoBlankLineAfterTopOfFileCxxComments(self): """Tests we don't remove top-of-file c++ comments right before #includes.""" infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ top_of_file_comments.cc should add these lines: #include #include "used2.h" top_of_file_comments.cc should remove these lines: - #include // lines 2-2 The full include-list for top_of_file_comments.cc: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'top_of_file_comments.cc': infile}) self.ProcessAndTest(iwyu_output) def testNoBlankLineAfterTopOfFileCComments(self): """Tests we don't remove top-of-file c comments right before #includes.""" infile = """\ /* * Copyright 2010 */ #include ///- /* This is a one-line c-style comment. */ ///- #include /* this is a c-style comment after a line */ ///- ///+#include #include "used.h" ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ top_of_file_comments.c should add these lines: #include #include "used2.h" top_of_file_comments.c should remove these lines: - #include // lines 4-4 - #include // lines 6-6 The full include-list for top_of_file_comments.c: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'top_of_file_comments.c': infile}) self.ProcessAndTest(iwyu_output) def testNotFullLineCComments(self): """Tests that we treat lines with c comments then code as code-lines.""" infile = """\ // Copyright 2010 ///+#include ///+ /* code here */ x = 4; int main() { return 0; } """ iwyu_output = """\ not_full_line_c_comments.c should add these lines: #include not_full_line_c_comments.c should remove these lines: The full include-list for not_full_line_c_comments.c: #include --- """ self.RegisterFileContents({'not_full_line_c_comments.c': infile}) self.ProcessAndTest(iwyu_output) def testUnusualHFileNames(self): """Tests we treat .pb.h files as header files.""" infile = """\ /* * Copyright 2010 */ #include ///- ///+#include #include "used.pb.h" ///+#include "used2.pb.h" int main() { return 0; } """ iwyu_output = """\ pb.h.cc should add these lines: #include #include "used2.pb.h" pb.h.cc should remove these lines: - #include // lines 4-4 The full include-list for pb.h.cc: #include #include "used.pb.h" #include "used2.pb.h" --- """ self.RegisterFileContents({'pb.h.cc': infile}) self.ProcessAndTest(iwyu_output) def testFwdDeclLines(self): """Tests that we keep or remove forward declares based on iwyu output.""" infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" struct KeepStruct; class NoKeepClass; ///- template class KeepTplClass; int main() { return 0; } """ iwyu_output = """\ fwd_decl should add these lines: #include #include "used2.h" fwd_decl should remove these lines: - #include // lines 3-3 - class NoKeepClass; // lines 7-7 The full include-list for fwd_decl: #include #include "used.h" #include "used2.h" struct KeepStruct; // lines 6-6 template class KeepTplClass; // lines 8-8 --- """ self.RegisterFileContents({'fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testMultiLineFwdDecls(self): """Tests we keep forward-decls that span more than one line.""" infile = """\ // Copyright 2010 struct KeepStruct; class NoKeepClass; ///- template class Keep2LineTplClass; template ///- class NoKeep2LineTplClass; ///- template class Keep3LineTplClass; template ///- class NoKeep3LineTplClass; ///- int main() { return 0; } """ iwyu_output = """\ multiline_fwd_decl should add these lines: multiline_fwd_decl should remove these lines: - class NoKeepClass; // lines 4-4 - template class NoKeep2LineTplClass; // lines 7-8 - template class NoKeep3LineTplClass; // lines 12-14 The full include-list for multiline_fwd_decl: struct KeepStruct; // lines 3-3 template class Keep2LineTplClass; // lines 5-6 template class Keep3LineTplClass; // lines 9-11 --- """ self.RegisterFileContents({'multiline_fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testKeepExplicitSpecializations(self): """Tests we don't interpret an explicit spec. as a forward-declare.""" infile = """\ // Copyright 2010 struct KeepStruct; class NoKeepClass; ///- template class KeepTplClass; ///+ template<> class KeepTplClass; template void TplFn(); int main() { return 0; } """ iwyu_output = """\ explicit_specialization should add these lines: explicit_specialization should remove these lines: - class NoKeepClass; // lines 4-4 The full include-list for explicit_specialization: struct KeepStruct; // lines 3-3 template class KeepTplClass; // lines 5-5 --- """ self.RegisterFileContents({'explicit_specialization': infile}) self.ProcessAndTest(iwyu_output) def testKeepNestedForwardDeclares(self): """Tests that we don't remove forward-declares inside classes/structs.""" infile = """\ // Copyright 2010 class Keep; class NoKeep; ///- ///+ class Nest { class NestedClass; ///+ class NestedClass { }; class NestedClass2 { }; // looks just like a fwd declare, except for the {} template class NestedTplClass; // test multi-line nested classes as well ///+ friend class NoKeep; template friend class NoKeepTpl; }; int main() { return 0; } """ iwyu_output = """\ nested_fwd_decl should add these lines: nested_fwd_decl should remove these lines: - class NoKeep; // lines 4-4 The full include-list for nested_fwd_decl: class Keep; // lines 3-3 class Nest::NestedClass; // lines 6-6 template class Nest::NestedTplClass; // lines 11-11 --- """ self.RegisterFileContents({'nested_fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareBeforeUsingStatement(self): """Tests we never add a forward-declare after a contentful line.""" infile = """\ // Copyright 2010 #include "foo.h" ///+namespace Bar { ///+class Baz; ///+} // namespace Bar ///+ using Bar::baz; namespace Foo { class Bang; } ///- ///+namespace Foo { ///+class Bang; ///+} // namespace Foo int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_before_using should add these lines: namespace Bar { class Baz; } add_fwd_decl_before_using should remove these lines: The full include-list for add_fwd_decl_before_using: #include "foo.h" namespace Bar { class Baz; } namespace Foo { class Bang; } // lines 7-7 --- """ self.RegisterFileContents({'add_fwd_decl_before_using': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInNamespace(self): """Make sure we normalize namespaces properly.""" infile = """\ // Copyright 2010 #include "foo.h" ///+namespace ns { ///+class Foo; ///+namespace ns2 { ///+namespace ns3 { ///+class Bar; ///+template class Bang; ///+} // namespace ns3 ///+} // namespace ns2 ///+namespace ns4 { ///+class Baz; ///+} // namespace ns4 ///+} // namespace ns ///+ int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_namespace should add these lines: namespace ns { class Foo; } namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } namespace ns { namespace ns2 { namespace ns3 { template class Bang; } } } namespace ns { namespace ns4 { class Baz; } } add_fwd_decl_inside_namespace should remove these lines: The full include-list for add_fwd_decl_inside_namespace: #include "foo.h" // lines 3-3 namespace ns { class Foo; } namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } namespace ns { namespace ns2 { namespace ns3 { template class Bang; } } } namespace ns { namespace ns4 { class Baz; } } --- """ self.RegisterFileContents({'add_fwd_decl_inside_namespace': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideNamespaceSometimes(self): """Tests that in special situations, we will put fwd-decls inside a ns.""" infile = """\ // Copyright 2010 #include "foo.h" class Bar; template class Baz; namespace ns { namespace ns2 { // we sure do love nesting our namespaces! class NsFoo; ///+namespace ns3 { ///+class NsBang; ///+template class NsBaz; ///+} // namespace ns3 template class NsBar; } } int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_namespace should add these lines: namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } } namespace ns { namespace ns2 { namespace ns3 { template class NsBaz; } } } add_fwd_decl_inside_namespace should remove these lines: The full include-list for add_fwd_decl_inside_namespace: #include "foo.h" // lines 3-3 class Bar; // lines 5-5 namespace ns { namespace ns2 { class NsFoo; } } // lines 12-12 namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } } namespace ns { namespace ns2 { namespace ns3 { template class NsBaz; } } } namespace ns { namespace ns2 { template class NsBar; } } // lines 13-13 template class Baz; // lines 6-6 --- """ self.RegisterFileContents({'add_fwd_decl_inside_namespace': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideNamespaceWithHeaderGuard(self): """Tests that the header guard doesn't confuse our in-ns algorithm.""" infile = """\ // Copyright 2010 #ifndef HDR_GUARD #define HDR_GUARD #include "foo.h" class Bar; template class Baz; namespace ns { namespace ns2 { // we sure do love nesting our namespaces! class NsFoo; ///+namespace ns3 { ///+class NsBang; ///+template class NsBaz; ///+} // namespace ns3 template class NsBar; } } #endif // HDR_GUARD """ iwyu_output = """\ add_fwd_decl_with_hdr_guard should add these lines: namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } } namespace ns { namespace ns2 { namespace ns3 { template class NsBaz; } } } add_fwd_decl_with_hdr_guard should remove these lines: The full include-list for add_fwd_decl_with_hdr_guard: #include "foo.h" // lines 6-6 class Bar; // lines 8-8 namespace ns { namespace ns2 { class NsFoo; } } // lines 15-15 namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } } namespace ns { namespace ns2 { namespace ns3 { template class NsBaz; } } } namespace ns { namespace ns2 { template class NsBar; } } // lines 16-16 template class Baz; // lines 9-9 --- """ self.RegisterFileContents({'add_fwd_decl_with_hdr_guard': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideNamespaceWithIfDef(self): """Tests that ifdef blocks are ignored when finding namespaces.""" infile = """\ // Copyright 2010 #include "foo.h" class Bar; template class Baz; #ifdef THIS_IS_A_CONTENTFUL_LINE #include "bar.h" #endif namespace ns { namespace ns2 { ///+class NsBang; class NsFoo; template class NsBar; ///+template class NsBaz; } } int main() { return 0; } """ iwyu_output = """\ add_forward_declares_after_ifdef_code should add these lines: namespace ns { namespace ns2 { class NsBang; } } namespace ns { namespace ns2 { template class NsBaz; } } add_forward_declares_after_ifdef_code should remove these lines: The full include-list for add_forward_declares_after_ifdef_code: #include "foo.h" // lines 3-3 class Bar; // lines 5-5 namespace ns { namespace ns2 { class NsBang; } } namespace ns { namespace ns2 { class NsFoo; } } // lines 16-16 namespace ns { namespace ns2 { template class NsBar; } } // lines 17-17 namespace ns { namespace ns2 { template class NsBaz; } } template class Baz; // lines 6-6 --- """ self.RegisterFileContents({'add_forward_declares_after_ifdef_code': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideNamespaceWithoutForwardDeclaresAlready(self): """Tests we put fwd-decls inside an ns even if the ns has no fwd-decl.""" infile = """\ // Copyright 2010 #include "foo.h" class Bar; template class Baz; namespace ns { namespace ns2 { // we sure do love nesting our namespaces! ///- ///+namespace ns3 { ///+class NsBang; ///+template class NsBaz; ///+} // namespace ns3 ///+ int MyFunction() { } } } int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_namespace_without_fwd_decl should add these lines: namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } } namespace ns { namespace ns2 { namespace ns3 { template class NsBaz; } } } add_fwd_decl_inside_namespace_without_fwd_decl should remove these lines: The full include-list for add_fwd_decl_inside_namespace_without_fwd_decl: #include "foo.h" // lines 3-3 class Bar; // lines 5-5 namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } } namespace ns { namespace ns2 { namespace ns3 { template class NsBaz; } } } template class Baz; // lines 6-6 --- """ self.RegisterFileContents({'add_fwd_decl_inside_namespace_without_fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideNamespaceWithCompactEndings(self): """Tests we put fwd-decls inside an ns when using compact namespace endings.""" infile = """\ // Copyright 2010 namespace ns { namespace ns1 { namespace ns2 { class Ns2Bang; }} // namespace ns2 // namespace ns1 ///+class NsBar; class NsBaz; ///- namespace ns3 { namespace ns4 { ///- class Ns4Bye; ///- }} // namespace ns4 // namespace ns3 ///- } // namespace ns int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_namespace_without_compact_endings should add these lines: namespace ns { class NsBar; } add_fwd_decl_inside_namespace_without_compact_endings should remove these lines: - namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { namespace ns4 { class Ns4Bye; } } } } } // lines 9-9 The full include-list for add_fwd_decl_inside_namespace_without_compact_endings: namespace ns { namespace ns1 { namespace ns2 { class Ns2Bang; } } } // lines 4-4 namespace ns { class NsBaz; } // lines 6-6 --- """ self.RegisterFileContents({'add_fwd_decl_inside_namespace_without_compact_endings': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideNamespaceWithUnnamedNamespace(self): """Tests that unnamed namespaces do not mess up our in-ns calculation.""" infile = """\ // Copyright 2010 #include "foo.h" class Bar; namespace ns { ///+class NsBang; ///+template class NsBaz; namespace { class NsFoo; template class NsBar; } } int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_namespace_unnamed_ns should add these lines: namespace ns { class NsBang; } namespace ns { template class NsBaz; } add_fwd_decl_inside_namespace_unnamed_ns should remove these lines: The full include-list for add_fwd_decl_inside_namespace_unnamed_ns: #include "foo.h" // lines 3-3 class Bar; // lines 5-5 namespace ns { namespace { class NsFoo; } } // lines 10-10 namespace ns { class NsBang; } namespace ns { template class NsBaz; } namespace ns { namespace { template class NsBar; } } // lines 11-11 --- """ self.RegisterFileContents({'add_fwd_decl_inside_namespace_unnamed_ns': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideNamespacesWithUnnamedNamespaceAndContent(self): """Tests that nested namespaces with forward declares still get new additions.""" infile = """\ // Copyright 2010 #include "foo.h" class Bar; ///+class Baz; namespace ns { ///+class NsBang; ///+template class NsBaz; namespace { ///+class NsBaz; class NsFoo; template class NsBar; } namespace ns1 { ///+class Ns1Bar; ///+class Ns1Baz; class Ns1Foo; int ns_int = 5; // here's my contentful line } } int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_namespaces_with_existing_content should add these lines: class Baz; namespace ns { class NsBang; } namespace ns { template class NsBaz; } namespace ns { namespace { class NsBaz; } } namespace ns { namespace ns1 { class Ns1Bar; } } namespace ns { namespace ns1 { class Ns1Baz; } } add_fwd_decl_inside_namespaces_with_existing_content should remove these lines: The full include-list for add_fwd_decl_inside_namespaces_with_existing_content: #include "foo.h" // lines 3-3 class Bar; // lines 5-5 class Baz; namespace ns { namespace { class NsFoo; } } // lines 10-10 namespace ns { namespace { class NsBaz; } } namespace ns { class NsBang; } namespace ns { template class NsBaz; } namespace ns { namespace { template class NsBar; } } // lines 11-11 namespace ns { namespace ns1 { class Ns1Foo; } } // lines 15-15 namespace ns { namespace ns1 { class Ns1Bar; } } namespace ns { namespace ns1 { class Ns1Baz; } } --- """ self.RegisterFileContents({'add_fwd_decl_inside_namespaces_with_existing_content': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideAllmanNamespacesWithUnnamedNamespaceAndContent(self): """Tests that nested Allman namespaces with forward declares still get new additions.""" infile = """\ // Copyright 2010 #include "foo.h" class Bar; ///+class Baz; namespace ns { ///+class NsBang; ///+template class NsBaz; namespace { ///+class NsBaz; class NsFoo; template class NsBar; } namespace ns1 { ///+class Ns1Bar; ///+class Ns1Baz; class Ns1Foo; int ns_int = 5; // here's my contentful line } } int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_allman_namespaces_with_existing_content should add these lines: class Baz; namespace ns { class NsBang; } namespace ns { template class NsBaz; } namespace ns { namespace { class NsBaz; } } namespace ns { namespace ns1 { class Ns1Bar; } } namespace ns { namespace ns1 { class Ns1Baz; } } add_fwd_decl_inside_allman_namespaces_with_existing_content should remove these lines: The full include-list for add_fwd_decl_inside_allman_namespaces_with_existing_content: #include "foo.h" // lines 3-3 class Bar; // lines 5-5 class Baz; namespace ns { namespace { class NsFoo; } } // lines 12-12 namespace ns { namespace { class NsBaz; } } namespace ns { class NsBang; } namespace ns { template class NsBaz; } namespace ns { namespace { template class NsBar; } } // lines 13-13 namespace ns { namespace ns1 { class Ns1Foo; } } // lines 18-18 namespace ns { namespace ns1 { class Ns1Bar; } } namespace ns { namespace ns1 { class Ns1Baz; } } --- """ self.RegisterFileContents({'add_fwd_decl_inside_allman_namespaces_with_existing_content': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideMixedNamespacesWithUnnamedNamespaceAndContent(self): """Tests that nested mixed namespaces with forward declares still get new additions.""" infile = """\ // Copyright 2010 #include "bar.h" ///+ ///+class Baz; ///+ namespace ns { namespace ns1 { namespace ns2 { ///+class Ns2Bang; ///+template class Ns2Baz; ///+ namespace { ///+class NsaBaz; class NsaFoo; template class NsaBar; } // namespace namespace ns3 { ///+class Ns3Bar; ///+class Ns3Baz; class Ns3Foo; ///+ int ns3_int = 5; // here's my contentful line } // namespace ns3 } // namespace ns2 } // namespace ns1 } // namespace ns int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_mixed_namespaces_with_existing_content should add these lines: class Baz; namespace ns { namespace ns1 { namespace ns2 { class Ns2Bang; } } } namespace ns { namespace ns1 { namespace ns2 { template class Ns2Baz; } } } namespace ns { namespace ns1 { namespace ns2 { namespace { class NsaBaz; } } } } namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { class Ns3Bar; } } } } namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { class Ns3Baz; } } } } add_fwd_decl_inside_mixed_namespaces_with_existing_content should remove these lines: The full include-list for add_fwd_decl_inside_mixed_namespaces_with_existing_content: #include "bar.h" // lines 3-3 #include "foo.h" class Baz; namespace ns { namespace ns1 { namespace ns2 { class Ns2Bang; } } } namespace ns { namespace ns1 { namespace ns2 { template class Ns2Baz; } } } namespace ns { namespace ns1 { namespace ns2 { namespace { class NsaFoo; } } } } // lines 8-8 namespace ns { namespace ns1 { namespace ns2 { namespace { template class NsaBar; } } } } // lines 9-9 namespace ns { namespace ns1 { namespace ns2 { namespace { class NsaBaz; } } } } namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { class Ns3Bar; } } } } namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { class Ns3Baz; } } } } namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { class Ns3Foo; } } } } // lines 12-12 --- """ self.RegisterFileContents({'add_fwd_decl_inside_mixed_namespaces_with_existing_content': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInsideNestedNamespacesAndTopLevelForComplexNamespaces(self): """Tests that nested namespaces still get new additions while putting hard to resolve forward declares at the top.""" infile = """\ // Copyright 2010 ///+namespace ns { ///+class NsBang; ///+namespace ns1 { ///+Ns1Bang; ///+} // namespace ns1 ///+} // namespace ns ///+ namespace ns { namespace ns1 { namespace ns2 { class Ns2Bang; class Ns2Bar; ///- ///+class Ns2Baz; ///+ namespace ns3 { ///+class Ns3Bang; class Ns3Baz; } // namespace ns3 } // namespace ns2 } // namespace ns1 } // namespace ns int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_inside_nested_namespaces_and_top_level_for_complex_namespaces should add these lines: namespace ns { class NsBang; } namespace ns { namespace ns1 { Ns1Bang; } namespace ns { namespace ns1 { namespace ns2 { class Ns2Baz; } } } namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { class Ns3Bang; } } } } add_fwd_decl_inside_nested_namespaces_and_top_level_for_complex_namespaces should remove these lines: - namespace ns { namespace ns1 { namespace ns2 { class Ns2Bar; } } } // lines 5-5 The full include-list for add_fwd_decl_inside_nested_namespaces_and_top_level_for_complex_namespaces: namespace ns { class NsBang; } namespace ns { namespace ns1 { Ns1Bang; } namespace ns { namespace ns1 { namespace ns2 { class Ns2Bang; } } } // lines 4-4 namespace ns { namespace ns1 { namespace ns2 { class Ns2Baz; } } } namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { class Ns3Bang; } } } } namespace ns { namespace ns1 { namespace ns2 { namespace ns3 { class Ns3Baz; } } } } // lines 7-7 --- """ self.RegisterFileContents({'add_fwd_decl_inside_nested_namespaces_and_top_level_for_complex_namespaces': infile}) self.ProcessAndTest(iwyu_output) def testRemoveNamespaces(self): """Tests that we keep or remove ns's based on fwd decl content.""" infile = """\ // Copyright 2010 namespace ns1 { struct KeepStruct; class NoKeepClass; ///- template class KeepTplClass; } ///- namespace ns1 { ///- namespace ns2 { ///- // This should all go away. ///- // Even with the multi-line comment here. ///- template class NoKeepTplClass; ///- } ///- } ///- int main() { return 0; } """ iwyu_output = """\ ns_fwd_decl should add these lines: ns_fwd_decl should remove these lines: - class NoKeepClass; // lines 5-5 - namespace ns1 { namespace ns2 { template class NoKeepTplClass; } } // lines 13-13 The full include-list for ns_fwd_decl: namespace ns1 { struct KeepStruct; } // lines 4-4 namespace ns1 { template class KeepTplClass; } // lines 6-6 --- """ self.RegisterFileContents({'ns_fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testKeepNamespacesWithNonForwardDecls(self): """Tests we never remove a ns with 'real' content in it.""" infile = """\ // Copyright 2010 namespace ns1 { int ns_int = 5; class NoKeepClass; ///- } int main() { return 0; } """ iwyu_output = """\ keep_ns_fwd_decl should add these lines: keep_ns_fwd_decl should remove these lines: - class NoKeepClass; // lines 5-5 The full include-list for keep_ns_fwd_decl: --- """ self.RegisterFileContents({'keep_ns_fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testICUNamespaces(self): """Tests we treat the icu namespace macros as namespaces.""" infile = """\ // Copyright 2010 U_NAMESPACE_BEGIN // macro from icu struct KeepStruct; class NoKeepClass; ///- template class KeepTplClass; U_NAMESPACE_END ///- U_NAMESPACE_BEGIN ///- template class NoKeepTplClass; ///- U_NAMESPACE_END ///- int main() { return 0; } """ iwyu_output = """\ icu_namespace should add these lines: icu_namespace should remove these lines: - class NoKeepClass; // lines 5-5 - template class NoKeepTplClass; // lines 10-10 The full include-list for icu_namespace: namespace ns1 { struct KeepStruct; } // lines 4-4 namespace ns1 { template class KeepTplClass; } // lines 6-6 --- """ self.RegisterFileContents({'icu_namespace': infile}) self.ProcessAndTest(iwyu_output) def testHashNamespaces(self): """Tests we treat the hash namespace macros as namespaces.""" infile = """\ // Copyright 2010 HASH_NAMESPACE_DECLARATION_START // macro from hash.h struct KeepStruct; class NoKeepClass; ///- template class KeepTplClass; HASH_NAMESPACE_DECLARATION_END ///- HASH_NAMESPACE_DECLARATION_START ///- template class NoKeepTplClass; ///- HASH_NAMESPACE_DECLARATION_END ///- int main() { return 0; } """ iwyu_output = """\ hash_namespace should add these lines: hash_namespace should remove these lines: - class NoKeepClass; // lines 5-5 - template class NoKeepTplClass; // lines 10-10 The full include-list for hash_namespace: namespace ns1 { struct KeepStruct; } // lines 4-4 namespace ns1 { template class KeepTplClass; } // lines 6-6 --- """ self.RegisterFileContents({'hash_namespace': infile}) self.ProcessAndTest(iwyu_output) def testElaboratedClasses(self): """Tests we don't remove lines like 'class Foo* fooptr'.""" infile = """\ // Copyright 2010 struct KeepStruct; class NoKeepClass; ///- ///+ struct NoKeepStruct* s; struct NoKeepStruct& t; int main() { return 0; } """ iwyu_output = """\ elaborated_class should add these lines: elaborated_class should remove these lines: - class NoKeepClass; // lines 4-4 The full include-list for elaborated_class: struct KeepStruct; // lines 3-3 --- """ self.RegisterFileContents({'elaborated_class': infile}) self.ProcessAndTest(iwyu_output) def testBFlag(self): """Tests that --b properly separates sections.""" self.flags.blank_lines = True infile = """\ // Copyright 2010 #include ///- ///+#include "subdir/bflag.h" ///+ ///+#include ///+ #include "used.h" ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ subdir/bflag.cc should add these lines: #include "subdir/bflag.h" #include #include "used2.h" subdir/bflag.cc should remove these lines: - #include // lines 3-3 The full include-list for subdir/bflag.cc: #include "subdir/bflag.h" #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'subdir/bflag.cc': infile}) self.ProcessAndTest(iwyu_output) def testSafeHeadersFlag(self): """Tests that --safe_headers causes us to not delete lines.""" self.flags.safe_headers = True infile = """\ // Copyright 2010 #include #include // Hello! ///+#include #include "used.h" ///+#include "used2.h" class Foo; template class Bar; int main() { return 0; } """ iwyu_output = """\ safe_flag.h should add these lines: #include #include "used2.h" safe_flag.h should remove these lines: - #include // lines 3-3 - #include // lines 4-4 - class Foo // lines 7-7 - class Bar // lines 8-9 The full include-list for safe_flag.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'safe_flag.h': infile}) self.ProcessAndTest(iwyu_output) def testSafeHeadersFlagTwice(self): """Tests running --safe_headers 2ce in a row doesn't duplicate comments.""" self.flags.safe_headers = True infile = """\ // Copyright 2010 #include // iwyu says this can be removed #include // Hello!; iwyu says this can be removed ///+#include #include "used.h" ///+#include "used2.h" class Foo; // iwyu says this can be removed template // iwyu says this can be removed class Bar; // iwyu says this can be removed int main() { return 0; } """ iwyu_output = """\ safe_flag_twice.h should add these lines: #include #include "used2.h" safe_flag_twice.h should remove these lines: - #include // lines 3-3 - #include // lines 4-4 - class Foo // lines 7-7 - class Bar // lines 8-9 The full include-list for safe_flag_twice.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'safe_flag_twice.h': infile}) self.ProcessAndTest(iwyu_output) def testSafeHeadersFlagOnCcFiles(self): """Tests that we delete even in --safe_headers mode, on .cc files.""" self.flags.safe_headers = True infile = """\ // Copyright 2010 #include ///- #include // Hello! ///- ///+#include #include "used.h" ///+#include "used2.h" class Foo; ///- template ///- class Bar; ///- ///- int main() { return 0; } """ iwyu_output = """\ safe_flag.cc should add these lines: #include #include "used2.h" safe_flag.cc should remove these lines: - #include // lines 3-3 - #include // lines 4-4 - class Foo // lines 7-7 - class Bar // lines 8-9 The full include-list for safe_flag.cc: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'safe_flag.cc': infile}) self.ProcessAndTest(iwyu_output) def testIncludeComments(self): """Tests that we properly include comments on #include lines.""" infile = """\ // Copyright 2010 #include ///- ///+#include "subdir/include_comments.h" ///+#include // for printf(), etc. #include "used.h" ///- ///+#include "used.h" // for Used ///+#include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==() int main() { return 0; } """ iwyu_output = """\ subdir/include_comments.cc should add these lines: #include "subdir/include_comments.h" #include // for printf(), etc. #include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==() subdir/include_comments.cc should remove these lines: - #include // lines 3-3 The full include-list for subdir/include_comments.cc: #include "subdir/include_comments.h" #include // for printf(), etc. #include "used.h" // for Used #include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==() --- """ self.RegisterFileContents({'subdir/include_comments.cc': infile}) self.ProcessAndTest(iwyu_output) def testNocommentsFlag(self): """Tests we properly don't include/modify comments with --nocomments.""" self.flags.comments = False infile = """\ // Copyright 2010 #include ///- ///+#include "subdir/include_comments.h" ///+#include #include "used.h" // my favorite #include! ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ subdir/include_comments.cc should add these lines: #include "subdir/include_comments.h" #include // for printf(), etc. #include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==() subdir/include_comments.cc should remove these lines: - #include // lines 3-3 The full include-list for subdir/include_comments.cc: #include "subdir/include_comments.h" #include // for printf(), etc. #include "used.h" // for Used #include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==() --- """ self.RegisterFileContents({'subdir/include_comments.cc': infile}) self.ProcessAndTest(iwyu_output) def testFixingTwoFiles(self): """Make sure data for one fix doesn't overlap with a second.""" file_a = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" #include "used_only_in_file_a.h" #include "used_only_in_file_b.h" ///- class FileAClass; // kept for file A, not for file B class FileBClass; // kept for file B, not for file A ///- """ file_b = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" #include "used_only_in_file_a.h" ///- #include "used_only_in_file_b.h" class FileAClass; // kept for file A, not for file B ///- class FileBClass; // kept for file B, not for file A """ iwyu_output = """\ file_a.cc should add these lines: #include #include "used2.h" file_a.cc should remove these lines: - #include // lines 3-3 - #include "used_only_in_file_b.h" // lines 6-6 - class FileBClass; // lines 9-9 The full include-list for file_a.cc: #include #include "used.h" #include "used2.h" #include "used_only_in_file_a.h" class FileAClass; // lines 8-8 --- file_b.cc should add these lines: #include #include "used2.h" file_b.cc should remove these lines: - #include // lines 3-3 - #include "used_only_in_file_a.h" // lines 5-5 - class FileAClass; // lines 8-8 The full include-list for file_b.cc: #include #include "used.h" #include "used2.h" #include "used_only_in_file_b.h" class FileBClass; // lines 9-9 --- """ self.RegisterFileContents({'file_a.cc': file_a, 'file_b.cc': file_b}) self.ProcessAndTest(iwyu_output) def testListingTheSameFileTwice(self): """Test when foo.cc is specified twice. It should fix conservatively.""" infile = """\ // Copyright 2010 #include ///- ///+#include ///+#include "include_this_file" // for reason 2 #include "used.h" ///+#include "used2.h" #include "used_only_in_file_a.h" #include "used_only_in_file_b.h" ///- class FileAClass; // kept for file A, not for file B class FileBClass; // kept for file B, not for file A ///- ///+namespace foo { ///+template ClassTemplate; ///+} // namespace foo ///+template ClassTemplate; """ iwyu_output = """\ twice.cc should add these lines: #include #include "include_this_file" // for reason 1 namespace foo { template ClassTemplate; } template ClassTemplate; twice.cc should remove these lines: - #include // lines 3-3 - #include "used_only_in_file_a.h" // lines 5-5 - #include "used_only_in_file_b.h" // lines 6-6 - class FileAClass; // lines 8-8 - class FileBClass; // lines 9-9 The full include-list for twice.cc: #include #include "include_this_file" // for reason 1 #include "used.h" namespace foo { template ClassTemplate; } template ClassTemplate; --- twice.cc should add these lines: #include "used2.h" #include "include_this_file" // for reason 2 namespace foo { template ClassTemplate; } template ClassTemplate; twice.cc should remove these lines: - #include // lines 3-3 - #include "used_only_in_file_b.h" // lines 6-6 - class FileBClass; // lines 9-9 The full include-list for twice.cc: #include "include_this_file" // for reason 2 #include "used.h" #include "used2.h" #include "used_only_in_file_a.h" class FileAClass; // lines 8-8 namespace foo { template ClassTemplate; } template ClassTemplate; --- """ self.RegisterFileContents({'twice.cc': infile}) self.ProcessAndTest(iwyu_output) def testListingTheSameFileTwiceAndOnceIsANoop(self): """Test when foo.cc is specified twice, once with 'all correct'.""" infile = """\ // Copyright 2010 #include ///+#include ///+#include "include_this_file" // for reason 1 #include "used.h" #include "used_only_in_file_a.h" class FileAClass; ///+namespace foo { ///+template ClassTemplate; ///+} // namespace foo ///+template ClassTemplate; """ iwyu_output = """\ twice.cc should add these lines: #include #include "include_this_file" // for reason 1 namespace foo { template ClassTemplate; } template ClassTemplate; twice.cc should remove these lines: - #include // lines 3-3 - #include "used_only_in_file_a.h" // lines 5-5 - class FileAClass; // lines 7-7 The full include-list for twice.cc: #include #include "include_this_file" // for reason 1 #include "used.h" namespace foo { template ClassTemplate; } template ClassTemplate; --- (twice.cc has correct #includes/fwd-decls) """ self.RegisterFileContents({'twice.cc': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclare(self): """Test adding a forward-declare, rather than keeping one.""" infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" ///+ ///+struct NotUsed; int main() { return 0; } """ iwyu_output = """\ new_fwd_decl should add these lines: #include #include "used2.h" struct NotUsed; new_fwd_decl should remove these lines: - #include // lines 3-3 The full include-list for new_fwd_decl: #include #include "used.h" #include "used2.h" struct NotUsed; --- """ self.RegisterFileContents({'new_fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testAddAndKeepForwardDeclare(self): """Test adding a forward-declare in addition to keeping one.""" infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" class ForwardDeclClass; ///+struct NotUsed; int main() { return 0; } """ iwyu_output = """\ new_and_keep_fwd_decl should add these lines: #include #include "used2.h" struct NotUsed; new_and_keep_fwd_decl should remove these lines: - #include // lines 3-3 The full include-list for new_and_keep_fwd_decl: #include #include "used.h" #include "used2.h" class ForwardDeclareClass; // lines 6-6 struct NotUsed; --- """ self.RegisterFileContents({'new_and_keep_fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeToFileThatHasOnlyForwardDeclarations(self): """Tests we add an #include in an appropriate place if none exist.""" infile = """\ // Copyright 2010 ///+#include ///+#include "used.h" ///+ const int kFoo = 5; // we should insert before the contentful line. class Foo; int main() { return 0; } """ iwyu_output = """\ no_include_fwd_decl should add these lines: #include #include "used.h" no_include_fwd_decl should remove these lines: The full include-list for no_include_fwd_decl: #include #include "used.h" class Foo; // lines 5-5 --- """ self.RegisterFileContents({'no_include_fwd_decl': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclarationToFileThatHasOnlyIncludes(self): """Tests we add a forward-declare in an appropriate place if none exist.""" infile = """\ // Copyright 2010 const int kFoo = 5; // make sure we don't just insert at the beginning #include #include "used.h" ///+ ///+class Foo; int main() { return 0; } """ iwyu_output = """\ no_fwd_decl_include should add these lines: class Foo; no_fwd_decl_include should remove these lines: The full include-list for no_fwd_decl_include: #include #include "used.h" class Foo; --- """ self.RegisterFileContents({'no_fwd_decl_include': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeToContentlessFile(self): """Tests we add an #include ok to a basically empty file..""" infile = """\ // Copyright 2010 ///+#include ///+#include "used.h" ///+ ///+class Foo; """ iwyu_output = """\ no_include should add these lines: #include #include "used.h" class Foo; no_include should remove these lines: The full include-list for no_include: #include #include "used.h" class Foo; --- """ self.RegisterFileContents({'no_include': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeToEmptyFile(self): """Tests we add an #include ok to an empty file..""" infile = '' iwyu_output = """\ empty_file should add these lines: #include #include "used.h" class Foo; empty_file should remove these lines: The full include-list for empty_file: #include #include "used.h" class Foo; --- """ self.RegisterFileContents({'empty_file': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeToOnlyOneContentfulLineFile(self): """Prevent regression when the only contentful line was the last.""" infile = """\ // Copyright 2010 ///+ ///+#include int main() { return 0; } """ iwyu_output = """\ only_one_contentful_line.c should add these lines: #include only_one_contentful_line.c should remove these lines: The full include-list for only_one_contentful_line.c: #include --- """ self.RegisterFileContents({'only_one_contentful_line.c': infile}) self.ProcessAndTest(iwyu_output) def testCommentsAtEndOfFile(self): """Tests we don't crash if a file ends with #includs and then a comment.""" infile = """\ // Copyright 2010 const int kFoo = 5; // make sure we don't just insert at the beginning #include #include "used.h" ///+ ///+class Foo; // Comments, and then...nothing """ iwyu_output = """\ comments_at_end_of_file should add these lines: class Foo; comments_at_end_of_file should remove these lines: The full include-list for comments_at_end_of_file: #include #include "used.h" class Foo; --- """ self.RegisterFileContents({'comments_at_end_of_file': infile}) self.ProcessAndTest(iwyu_output) def testAddSystemIncludeToFileWithoutAny(self): """Tests we add a system #include to a non-sys location when needed.""" infile = """\ // Copyright 2010 #ifdef HAVE_TYPE_TRAITS_H #include #endif ///+#include #include "used.h" int main() { return 0; } """ iwyu_output = """\ system_include should add these lines: #include system_include should remove these lines: The full include-list for system_include: #include #include "used.h" --- """ self.RegisterFileContents({'system_include': infile}) self.ProcessAndTest(iwyu_output) def testAddNonSystemHeaderUnderMainCUHeader(self): """Tests we distinguish main-cu headers from other non-system headers.""" infile = """\ // Copyright 2010 ///+#include "main_cu.h" #include "main_cu-inl.h" ///- #include ///+#include #ifdef WINDOWS #include #endif #include "used.h" ///+#include "used2.h" int main() { return 0; } """ iwyu_output = """\ main_cu_test.cc should add these lines: #include #include "main_cu.h" #include "used2.h" main_cu_test.cc should remove these lines: The full include-list for main_cu_test.cc: #include "main_cu.h" #include "main_cu-inl.h" #include #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'main_cu_test.cc': infile}) self.ProcessAndTest(iwyu_output) def testAddWithNearestIncludes(self): """Tests we add "includes" with when there's a choice.""" infile = """\ // Copyright 2010 #include "nearest_include.h" static int x = 6; #include ///+#include "used.h" static int y = 7; class Foo; int main() { return 0; } """ iwyu_output = """\ nearest_include.cc should add these lines: #include "used.h" nearest_include.cc should remove these lines: The full include-list for nearest_include.cc: #include "nearest_include.h" #include #include "used.h" class Foo; // lines 9-9 --- """ self.RegisterFileContents({'nearest_include.cc': infile}) self.ProcessAndTest(iwyu_output) def testFalseAlarmHeaderGuard(self): """Tests we calculate top-level-ness even in face of a fake header-guard.""" infile = """\ // Copyright 2010 #include "nearest_toplevel_include.h" static int x = 6; #include ///+#include "used.h" #ifndef MAP_ANONYMOUS // This is the fake header guard! # define MAP_ANONYMOUS MAP_ANON #endif #ifdef FOO #include #endif #if defined(BAR) #include #endif static int y = 7; class Foo; int main() { return 0; } """ iwyu_output = """\ nearest_toplevel_include.cc should add these lines: #include "used.h" nearest_toplevel_include.cc should remove these lines: The full include-list for nearest_toplevel_include.cc: #include "nearest_toplevel_include.h" #include #include #include #include "used.h" class Foo; // lines 9-9 --- """ self.RegisterFileContents({'nearest_toplevel_include.cc': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterHeaderGuard(self): """Test that we are willing to insert .h's inside a header guard.""" infile = """\ // Copyright 2010 #ifndef SIMPLE_H_ #define SIMPLE_H_ #include ///- ///+#include #include "used.h" ///+#include "used2.h" #endif """ iwyu_output = """\ simple.h should add these lines: #include #include "used2.h" simple.h should remove these lines: - #include // lines 6-6 The full include-list for simple.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'simple.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterSoloPragmaOnce(self): """Test that we are willing to insert .h's after #pragma once.""" infile = """\ // Copyright 2010 #pragma once #include ///- ///+#include #include "used.h" ///+#include "used2.h" """ iwyu_output = """\ pragma_once.h should add these lines: #include #include "used2.h" pragma_once.h should remove these lines: - #include // lines 5-5 The full include-list for pragma_once.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'pragma_once.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterPragmaOnceWithHeaderGuard(self): """Test that we are willing to insert .h's after #pragma once and header guard.""" infile = """\ // Copyright 2010 #pragma once #ifndef PRAGMA_ONCE_H_ #define PRAGMA_ONCE_H_ #include ///- ///+#include #include "used.h" ///+#include "used2.h" #endif """ iwyu_output = """\ pragma_once_with_guard.h should add these lines: #include #include "used2.h" pragma_once_with_guard.h should remove these lines: - #include // lines 7-7 The full include-list for pragma_once_with_guard.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'pragma_once_with_guard.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterEarlyPragmaOnce(self): """Test that we are willing to insert .h's after early #pragma once.""" infile = """\ #pragma once // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" """ iwyu_output = """\ early_pragma_once.h should add these lines: #include #include "used2.h" early_pragma_once.h should remove these lines: - #include // lines 4-4 The full include-list for early_pragma_once.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'early_pragma_once.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterEarlyPragmaOnceWithHeaderGuard(self): """Test that we are willing to insert .h's after early #pragma once and header guard.""" infile = """\ #pragma once // Copyright 2010 #ifndef PRAGMA_ONCE_H_ #define PRAGMA_ONCE_H_ #include ///- ///+#include #include "used.h" ///+#include "used2.h" #endif """ iwyu_output = """\ early_pragma_once_with_guard.h should add these lines: #include #include "used2.h" early_pragma_once_with_guard.h should remove these lines: - #include // lines 7-7 The full include-list for early_pragma_once_with_guard.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'early_pragma_once_with_guard.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterWeirdPragmaOnce(self): """Test that we are willing to insert .h's after creatively formatted #pragma once.""" infile = """\ # pragma once #include ///- ///+#include """ iwyu_output = """\ weird_pragma_once.h should add these lines: #include weird_pragma_once.h should remove these lines: - #include // lines 3-3 The full include-list for weird_pragma_once.h: #include --- """ self.RegisterFileContents({'weird_pragma_once.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeBeforePragmaMessage(self): """Test that non-once #pragmas are pushed after the #includes.""" infile = """\ ///+#include ///+ #pragma message "Hello world!" #include ///- """ iwyu_output = """\ weird_pragma_once.h should add these lines: #include weird_pragma_once.h should remove these lines: - #include // lines 3-3 The full include-list for weird_pragma_once.h: #include --- """ self.RegisterFileContents({'weird_pragma_once.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterWeirdHeaderGuard(self): """Test that we are willing to insert .h's inside a non-standard h-guard.""" infile = """\ // Copyright 2010 #if ! defined (SIMPLE_H_) #define SIMPLE_H_ #include ///- ///+#include #include "used.h" ///+#include "used2.h" #endif """ iwyu_output = """\ simple.h should add these lines: #include #include "used2.h" simple.h should remove these lines: - #include // lines 6-6 The full include-list for simple.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'simple.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterHeaderGuardLikeIfdef(self): """Test that we are willing to insert .h's inside a h-guard-*like* line.""" infile = """\ // Copyright 2010 #ifdef __linux // serves the same role as a header guard #include ///- ///+#include #include "used.h" ///+#include "used2.h" #endif // Comments are allowed after the header guard. """ iwyu_output = """\ os_header_guard.h should add these lines: #include #include "used2.h" os_header_guard.h should remove these lines: - #include // lines 5-5 The full include-list for os_header_guard.h: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'os_header_guard.h': infile}) self.ProcessAndTest(iwyu_output) def testAddIncludeAfterHeaderGuardButBeforeComments(self): """Test that we introduce new #includes right after a header guard.""" infile = """\ // Copyright 2010 #ifndef SIMPLE_WITH_COMMENT_H_ #define SIMPLE_WITH_COMMENT_H_ ///+#include ///+#include "used.h" ///+ // This is a comment void ForThisFunction(); #endif """ iwyu_output = """\ simple_with_comment.h should add these lines: #include #include "used.h" simple_with_comment.h should remove these lines: The full include-list for simple_with_comment.h: #include #include "used.h" --- """ self.RegisterFileContents({'simple_with_comment.h': infile}) self.ProcessAndTest(iwyu_output) def testIdentifyingHeaderGuardLines(self): """Test that not all #defines look like header guards.""" infile = """\ // Copyright 2010 #ifndef IDENTIFYING_HEADER_GUARD_LINES_H_ #define IDENTIFYING_HEADER_GUARD_LINES_H_ namespace foo { ///+namespace bar { ///+class Baz; ///+} // namespace bar ///+ // The namespace decl should come before this #define, not after. // It will, unless we wrongly say the #define is a header-guard define. #define NOT_A_HEADER_GUARD_LINE 1 } #endif """ iwyu_output = """\ identifying_header_guard_lines.h should add these lines: namespace foo { namespace bar { class Baz; } } identifying_header_guard_lines.h should remove these lines: The full include-list for identifying_header_guard_lines.h: namespace foo { namespace bar { class Baz; } } --- """ self.RegisterFileContents({'identifying_header_guard_lines.h': infile}) self.ProcessAndTest(iwyu_output) def testIncludeOfCcFile(self): """Test that iwyu leaves .cc #includes alone.""" infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" int kFoo = 5; #include "not_mentioned.cc" int main() { return 0; } """ iwyu_output = """\ cc_include should add these lines: #include #include "used2.h" cc_include should remove these lines: - #include // lines 3-3 The full include-list for cc_include: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'cc_include': infile}) self.ProcessAndTest(iwyu_output) def testCommentsBeforeIncludeLines(self): infile = """\ // Copyright 2010 #include ///- ///+// This is the first include. ///+// Or it will be, after we reorder. ///+#include // This is the second include. // Or *it* will be, after we reorder. #include "used.h" // This is the first include. ///- // Or it will be, after we reorder. ///- #include ///- int main() { return 0; } """ iwyu_output = """\ comments_with_includes should add these lines: comments_with_includes should remove these lines: - #include // lines 3-3 The full include-list for comments_with_includes: #include #include "used.h" --- """ self.RegisterFileContents({'comments_with_includes': infile}) self.ProcessAndTest(iwyu_output) def testRemoveDuplicateIncludes(self): """Tests we uniquify if an #include is in there twice.""" infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" #include "used2.h" #include "used.h" // same line even though it has a comment ///- // Even though these two comment-lines are the same, they won't get de-duped. // Even though these two comment-lines are the same, they won't get de-duped. #ifdef _WINDOWS // But keep this one because it's in an #ifdef. #include "used.h" #endif int main() { return 0; } """ iwyu_output = """\ remove_duplicate_includes should add these lines: #include remove_duplicate_includes should remove these lines: - #include // lines 3-3 The full include-list for remove_duplicate_includes: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'remove_duplicate_includes': infile}) self.ProcessAndTest(iwyu_output) def testRemoveDuplicateForwardDeclarations(self): """Tests we uniquify if an #include is in there twice.""" infile = """\ #include ///- class A; template // Comment in the middle not a problem class B; class A; ///- template ///- class B; ///- template class B; ///- int main() { return 0; } """ iwyu_output = """\ remove_duplicate_forward_declarations should add these lines: remove_duplicate_forward_declarations should remove these lines: - #include // lines 1-1 The full include-list for remove_duplicate_forward_declarations: class A; // lines 2-2 template class B; // lines 3-4 class A; // lines 5-5 template class B; // lines 6-7 template class B; // lines 8-8 --- """ self.RegisterFileContents({'remove_duplicate_forward_declarations': infile}) self.ProcessAndTest(iwyu_output) def testDontRemoveTemplateLines(self): """Tests we don't accidentally think repeated template lines are dupes.""" infile = """\ #include ///- template class A; template class B; void f(A&, B&); """ iwyu_output = """\ dont_remove_template_lines should add these lines: dont_remove_template_lines should remove these lines: - #include // lines 1-1 The full include-list for dont_remove_template_lines: template class A; // lines 2-3 template class B; // lines 4-5 --- """ self.RegisterFileContents({'dont_remove_template_lines': infile}) self.ProcessAndTest(iwyu_output) def testNestedNamespaces(self): infile = """\ // Copyright 2010 ///+#include ///+ namespace X { class OneA ///+ namespace Y { ///+class TwoA; class TwoB; class TwoA; ///- }} class Toplevel; ///- namespace A { ///- namespace B { namespace C { ///- class Delete1; ///- }}} ///- ///- namespace A { namespace B { class Delete2; } } ///- ///- namespace A { ///- namespace B { ///- class Delete3; ///- } ///- } // namespace A ///- int main() { return 0; } """ iwyu_output = """\ many_namespaces should add these lines: #include many_namespaces should remove these lines: - class Delete1; // lines 13-13 - class Delete2; // lines 16-16 - class Delete3; // lines 20-20 The full include-list for many_namespaces: #include class Toplevel; // lines 9-9 class TwoA; // lines 7-7 class TwoB; // lines 6-6 class OneA; // lines 4-4 --- """ self.RegisterFileContents({'many_namespaces': infile}) self.ProcessAndTest(iwyu_output) def testDoNotInsertIncludeIntoAClass(self): infile = """\ // Copyright 2010 ///+#include ///+ class Foo { }; class Bar { class FwdDecl; FwdDecl* f; } """ iwyu_output = """\ include_not_in_class should add these lines: #include include_not_in_class should remove these lines: The full include-list for include_not_in_class: #include class FwdDecl; // lines 7-7 --- """ self.RegisterFileContents({'include_not_in_class': infile}) self.ProcessAndTest(iwyu_output) def testIdenticalForwardDeclaredNamesInDifferentNamespaces(self): infile = """\ // Copyright 2010 ///+namespace ns1 { ///+class ForwardDeclared; ///+} // namespace ns1 ///+namespace ns2 { ///+class ForwardDeclared; ///+} // namespace ns2 """ iwyu_output = """\ identical_names should add these lines: namespace ns1 { class ForwardDeclared; } namespace ns2 { class ForwardDeclared; } identical_names should remove these lines: The full include-list for identical_names: namespace ns1 { class ForwardDeclared; } namespace ns2 { class ForwardDeclared; } --- """ self.RegisterFileContents({'identical_names': infile}) self.ProcessAndTest(iwyu_output) def testIterativeNamespaceDelete(self): """Tests deleting a namespace with an emptied #ifdef inside it.""" infile = """\ // Copyright 2010 ///- namespace foo { ///- #ifdef FWD_DECL ///- class Bar; ///- #endif ///- } ///- int main() { return 0; } """ iwyu_output = """\ iterative_namespace should add these lines: iterative_namespace should remove these lines: - class Bar; // lines 5-5 The full include-list for iterative_namespace: --- """ self.RegisterFileContents({'iterative_namespace': infile}) self.ProcessAndTest(iwyu_output) def testIterativeAllmanNamespaceDelete(self): """Tests deleting an Allman namespace with an emptied #ifdef inside it.""" infile = """\ // Copyright 2010 ///- namespace foo ///- { ///- #ifdef FWD_DECL ///- class Bar; ///- #endif ///- } ///- int main() { return 0; } """ iwyu_output = """\ iterative_namespace should add these lines: iterative_namespace should remove these lines: - class Bar; // lines 6-6 The full include-list for iterative_namespace: --- """ self.RegisterFileContents({'iterative_namespace': infile}) self.ProcessAndTest(iwyu_output) def testIterativeMixedNamespaceDelete(self): """Tests deleting a namespace with mixed braces with an emptied #ifdef inside it.""" infile = """\ // Copyright 2010 ///- namespace foo { namespace baz ///- { ///- #ifdef FWD_DECL ///- class Bar; ///- #endif ///- } ///- } ///- int main() { return 0; } """ iwyu_output = """\ iterative_namespace should add these lines: iterative_namespace should remove these lines: - class Bar; // lines 6-6 The full include-list for iterative_namespace: --- """ self.RegisterFileContents({'iterative_namespace': infile}) self.ProcessAndTest(iwyu_output) def testIterativeIfdefDelete(self): """Tests deleting an ifdef with an emptied namespace inside it.""" infile = """\ // Copyright 2010 ///- #ifdef FWD_DECL ///- namespace foo { ///- class Bar; ///- } ///- #endif ///- int main() { return 0; } """ iwyu_output = """\ iterative_ifdef should add these lines: iterative_ifdef should remove these lines: - class Bar; // lines 5-5 The full include-list for iterative_ifdef: --- """ self.RegisterFileContents({'iterative_ifdef': infile}) self.ProcessAndTest(iwyu_output) def testOutOfRangeLineNumber(self): """Test we skip editing completely if iwyu has a really big line number.""" # fix_includes skips the file-editing if it detects a problem, as # in this test case. The way that skipping is evidenced in the # test, is the output is empty. infile = """\ // Copyright 2010 ///- ///- #include ///- #include "used.h" ///- ///- int main() { return 0; } ///- """ iwyu_output = """\ out_of_range should add these lines: #include #include "used2.h" out_of_range should remove these lines: - #include // lines 3-3 - #include // lines 3000-3000 The full include-list for out_of_range: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'out_of_range': infile}) self.ProcessAndTest(iwyu_output) def testDeleteExtraneousBlankLines(self): """Test we delete blank lines around deleted spans correctly.""" infile = """\ // Copyright 2010 class Foo { }; ///- class Bar; ///- class Baz { }; class Bang; ///- ///- class Qux { }; int main() { return 0; } """ iwyu_output = """\ extraneous_blank_lines should add these lines: extraneous_blank_lines should remove these lines: - class Bar; // lines 5-5 - class Bang; // lines 11-11 The full include-list for extraneous_blank_lines: --- """ self.RegisterFileContents({'extraneous_blank_lines': infile}) self.ProcessAndTest(iwyu_output) def testKeepNolintComment(self): """Test we keep a nolint comment.""" infile = """\ // Copyright 2010 #include "bar.h" // NOLINT(iwyu) #include "baz.h" // NOLINT(iwyu): blah blah int main() { return 0; } """ iwyu_output = """\ keep_nolint should add these lines: keep_nolint should remove these lines: The full include-list for keep_nolint: #include "bar.h" // lines 3-3 #include "baz.h" // lines 4-4 --- """ self.RegisterFileContents({'keep_nolint': infile}) # No files are written, because there are no changes. self.ProcessAndTest(iwyu_output, unedited_files=['keep_nolint']) def testKeepNolintCommentInNocommentMode(self): """Test we keep a nolint comment even with --nocomments.""" self.flags.comments = False self.testKeepNolintComment() # Test the IWYUOutputParser method _MatchSectionHeading. def testIWYUOutputParserMatchSectionHeadingSuccess(self): parser = fix_includes.IWYUOutputParser() self.assertEqual(None, parser.current_section) self.assertEqual('', parser.filename) self.assertTrue(parser._ProcessOneLine('')) self.assertEqual(None, parser.current_section) self.assertEqual('', parser.filename) self.assertTrue(parser._ProcessOneLine( 'myfile.cc should add these lines:')) self.assertEqual(parser._ADD_SECTION_RE, parser.current_section) self.assertEqual('add', parser._RE_TO_NAME[parser.current_section]) self.assertEqual('myfile.cc', parser.filename) self.assertTrue(parser._ProcessOneLine( 'myfile.cc should remove these lines:')) self.assertEqual(parser._REMOVE_SECTION_RE, parser.current_section) self.assertEqual('remove', parser._RE_TO_NAME[parser.current_section]) self.assertEqual('myfile.cc', parser.filename) self.assertTrue(parser._ProcessOneLine( 'The full include-list for myfile.cc:')) self.assertEqual(parser._TOTAL_SECTION_RE, parser.current_section) self.assertEqual('total', parser._RE_TO_NAME[parser.current_section]) self.assertEqual('myfile.cc', parser.filename) self.assertTrue(not parser._ProcessOneLine('---')) self.assertEqual(parser._SECTION_END_RE, parser.current_section) self.assertEqual('end', parser._RE_TO_NAME[parser.current_section]) self.assertEqual('myfile.cc', parser.filename) def testIWYUOutputParserMatchSectionHeadingWindowsPaths(self): # Windows path names can contain the ':' character, so make sure that parses # correctly. IWYU uses POSIX-style forward slashes consistently, so follow # suit here. parser = fix_includes.IWYUOutputParser() self.assertTrue(parser._ProcessOneLine( 'C:/src/myfile.cc should add these lines:')) self.assertEqual(parser._ADD_SECTION_RE, parser.current_section) self.assertEqual('add', parser._RE_TO_NAME[parser.current_section]) self.assertEqual('C:/src/myfile.cc', parser.filename) self.assertTrue(parser._ProcessOneLine( 'C:/src/myfile.cc should remove these lines:')) self.assertEqual(parser._REMOVE_SECTION_RE, parser.current_section) self.assertEqual('remove', parser._RE_TO_NAME[parser.current_section]) self.assertEqual('C:/src/myfile.cc', parser.filename) self.assertTrue(parser._ProcessOneLine( 'The full include-list for C:/src/myfile.cc:')) self.assertEqual(parser._TOTAL_SECTION_RE, parser.current_section) self.assertEqual('total', parser._RE_TO_NAME[parser.current_section]) self.assertEqual('C:/src/myfile.cc', parser.filename) def testIWYUOutputParserProcessOneLineProcessNoEditsHeader(self): parser = fix_includes.IWYUOutputParser() line = '(myfile.cc has correct #includes/fwd-decls)' self.assertTrue(not parser._ProcessOneLine(line)) self.assertEqual(parser._NO_EDITS_RE, parser.current_section) self.assertEqual('no_edits', parser._RE_TO_NAME[parser.current_section]) self.assertEqual('myfile.cc', parser.filename) def testIWYUOutputParserProcessOneLineAddNotSeenFirst(self): parser = fix_includes.IWYUOutputParser() self.assertRaises(fix_includes.FixIncludesError, parser._ProcessOneLine, 'myfile.cc should remove these lines:') def testIWYUOutputParserProcessOneLineOutOfOrder(self): parser = fix_includes.IWYUOutputParser() self.assertTrue(parser._ProcessOneLine( 'myfile.cc should add these lines:')) self.assertRaises(fix_includes.FixIncludesError, parser._ProcessOneLine, 'The full include-list for myfile.cc:') def testIWYUOutputParserProcessOneLineIncorrectFilename(self): parser = fix_includes.IWYUOutputParser() self.assertTrue(parser._ProcessOneLine( 'myfile.cc should add these lines:')) self.assertRaises(fix_includes.FixIncludesError, parser._ProcessOneLine, 'not_myfile.cc should remove these lines:') def testIWYUOutputParserProcessOneLineNoMatcher(self): parser = fix_includes.IWYUOutputParser() # We successfully process this not-in-any-section line, but update no data. self.assertTrue(parser._ProcessOneLine('#include ')) self.assertEqual(None, parser.current_section) self.assertEqual('', parser.filename) def testIWYUOutputParserSuccess(self): """Tests the IWYUOutputParser method ParseOneRecord.""" iwyu_output = """\ simple should add these lines: #include #include "used2.h" namespace ns {class ForwardDeclared;} simple should remove these lines: - #include // lines 3-3 The full include-list for simple: #include #include "used.h" #include "used2.h" namespace ns {class ForwardDeclared;} --- """ parser = fix_includes.IWYUOutputParser() record = parser.ParseOneRecord(iwyu_output.splitlines(), self.flags) self.assertEqual('simple', record.filename) self.assertSetEqual(set([3]), record.lines_to_delete) self.assertSetEqual(set(('#include ', '#include "used2.h"', 'namespace ns {class ForwardDeclared;}')), record.includes_and_forward_declares_to_add) def testIWYUOutputParserRemoveLineNoComment(self): iwyu_output = """\ no_comment should add these lines: no_comment should remove these lines: - #include The full include-list for no_key: --- """ parser = fix_includes.IWYUOutputParser() self.assertRaises(fix_includes.FixIncludesError, parser.ParseOneRecord, iwyu_output.splitlines(), self.flags) def testFileSpecifiedOnCommandline(self): """Test we limit editing to files specified on the commandline.""" changed_infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" int main() { return 0; } """ unchanged_infile = """\ // Copyright 2010 #include #include "used.h" int main() { return 0; } """ iwyu_output = """\ changed should add these lines: #include #include "used2.h" changed should remove these lines: - #include // lines 3-3 The full include-list for changed: #include #include "used.h" #include "used2.h" --- """ # Have the exact same iwyu output for 'unchanged' as for 'changed'. iwyu_output += iwyu_output.replace('changed', 'unchanged') self.RegisterFileContents({'changed': changed_infile, 'unchanged': unchanged_infile}) # unchanged should not be edited, since it is not listed on the 'cmdline'. self.ProcessAndTest(iwyu_output, cmdline_files=['changed'], unedited_files=['unchanged']) def testIgnoreRe(self): """Test the behavior of the --ignore_re flag.""" changed_infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" int main() { return 0; } """ unchanged_infile = """\ // Copyright 2010 #include #include "used.h" int main() { return 0; } """ iwyu_output = """\ changed should add these lines: #include #include "used2.h" changed should remove these lines: - #include // lines 3-3 The full include-list for changed: #include #include "used.h" #include "used2.h" --- """ # Have the exact same iwyu output for 'unchanged' as for 'changed'. iwyu_output += iwyu_output.replace('changed', 'unchanged') self.RegisterFileContents({'changed': changed_infile, 'unchanged': unchanged_infile}) # unchanged should not be edited, since it matches ignore_re. self.flags.ignore_re = 'nch' self.ProcessAndTest(iwyu_output, unedited_files=['unchanged']) def testOnlyRe(self): """Test the behavior of the --only_re flag.""" changed_infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" int main() { return 0; } """ unchanged_infile = """\ // Copyright 2010 #include #include "used.h" int main() { return 0; } """ iwyu_output = """\ output should add these lines: #include #include "used2.h" output should remove these lines: - #include // lines 3-3 The full include-list for output: #include #include "used.h" #include "used2.h" --- """ # Have the exact same iwyu output for 'alice.cpp' as for 'bob.cpp'. iwyu_output = (iwyu_output.replace('output', 'alice.cpp') + iwyu_output.replace('output', 'bob.cpp')) self.RegisterFileContents({'alice.cpp': changed_infile, 'bob.cpp': unchanged_infile}) # only alice.cpp should be edited, since it matches only_re. self.flags.only_re = 'lice' self.ProcessAndTest(iwyu_output, unedited_files=['bob.cpp']) def testIgnoreAndOnlyRe(self): """Test the behavior of both --ignore_re and --only_re flags.""" changed_infile = """\ // Copyright 2010 #include ///- ///+#include #include "used.h" ///+#include "used2.h" int main() { return 0; } """ unchanged_infile = """\ // Copyright 2010 #include #include "used.h" int main() { return 0; } """ iwyu_output = """\ output should add these lines: #include #include "used2.h" output should remove these lines: - #include // lines 3-3 The full include-list for output: #include #include "used.h" #include "used2.h" --- """ # Have the exact same iwyu output for 'alice.cpp' as for 'bob.cpp' and 'charlie.cpp' iwyu_output = (iwyu_output.replace('output', 'alice.cpp') + iwyu_output.replace('output', 'bob.cpp') + iwyu_output.replace('output', 'charlie.cpp')) self.RegisterFileContents({'alice.cpp': changed_infile, 'bob.cpp': unchanged_infile, 'charlie.cpp': changed_infile}) # only alice.cpp should be edited, since it matches only_re and not ignore_re self.flags.only_re = 'li' self.flags.ignore_re = 'char' self.ProcessAndTest(iwyu_output, unedited_files=['bob.cpp', 'charlie.cpp']) def testSortIncludes(self): """Test sorting includes only -- like running fix_includes.py -s.""" infile = """\ // Copyright 2010 #include // This file is not used. #include // This file is not used either. // It's not used. // Not used at all. #include #include "notused3.h" // This comment should stay, it's not before an #include. const int kInt = 5; // This file is used. // It's definitedly used. #include "used.h" #include const int kInt2 = 6; #include "foo.cc" // This comment should stay, it's not before an #include. int main() { return 0; } """ expected_output = """\ // Copyright 2010 // This file is not used. #include // This file is not used either. // It's not used. // Not used at all. #include #include #include "notused3.h" // This comment should stay, it's not before an #include. const int kInt = 5; #include // This file is used. // It's definitedly used. #include "used.h" const int kInt2 = 6; #include "foo.cc" // This comment should stay, it's not before an #include. int main() { return 0; } """ self.RegisterFileContents({'sort': infile}) num_files_modified = fix_includes.SortIncludesInFiles(['sort'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) def testSortingMultipleFiles(self): """Tests passing more than one argument to SortIncludesInFiles().""" infile1 = """\ #include #include #include """ infile2 = """\ #include "z.h" #include "y.h" #include "x.y" """ expected_output = """\ #include #include #include #include "x.y" #include "y.h" #include "z.h" """ self.RegisterFileContents({'f1': infile1, 'f2': infile2}) num_files_modified = fix_includes.SortIncludesInFiles(['f1', 'f2'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(2, num_files_modified) def testSortingIncludesAlreadySorted(self): """Tests sorting includes only, when includes are already sorted.""" infile = """\ // Copyright 2010 #include #include namespace Foo; // fwd-decls are out of order, but sorter ignores them namespace Bar; int main() { return 0; } """ self.RegisterFileContents({'sort_nosorting.h': infile}) num_files_modified = fix_includes.SortIncludesInFiles(['sort_nosorting.h'], self.flags) self.assertListEqual([], self.actual_after_contents) self.assertEqual(0, num_files_modified) def testBarrierIncludes(self): """Tests that we correctly sort 'around' _BARRIER_INCLUDES.""" infile = """\ // Copyright 2010 #include #include ///- #include ///- #include ///+#include #include "user/include.h" ///+#include "user/new_include.h" #include #include #include #include ///+#include #include int main() { return 0; } """ iwyu_output = """\ barrier_includes.h should add these lines: #include "user/new_include.h" #include barrier_includes.h should remove these lines: - #include // lines 5-5 The full include-list for barrier_includes.h: #include "user/include.h" #include "user/new_include.h" #include #include #include #include #include #include #include #include #include --- """ self.RegisterFileContents({'barrier_includes.h': infile}) self.ProcessAndTest(iwyu_output) def testSortingMainCUIncludeInSameDirectory(self): """Check that we identify when first .h file is a main-cu #include.""" infile = """\ #include #include "me/subdir0/foo.h" #include "other/baz.h" """ expected_output = """\ #include "me/subdir0/foo.h" #include #include "other/baz.h" """ self.RegisterFileContents({'me/subdir0/foo.cc': infile}) num_files_modified = fix_includes.SortIncludesInFiles( ['me/subdir0/foo.cc'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) def testSortingMainCUIncludeViaPragma(self): """Check that we treat (potentially multiple) associated headers as main-cu #includes.""" infile = """\ #include #include "other/dir/bar.h" // IWYU pragma: associated #include "other/baz.h" // IWYU pragma: associated """ expected_output = """\ #include "other/baz.h" // IWYU pragma: associated #include "other/dir/bar.h" // IWYU pragma: associated #include """ self.RegisterFileContents({'me/subdir0/foo.cc': infile}) num_files_modified = fix_includes.SortIncludesInFiles( ['me/subdir0/foo.cc'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) def testSortingMainCUIncludeWithUpperCaseH(self): """Check that we identify when first .H file is a main-cu #include.""" infile = """\ #include #include "foo.H" """ expected_output = """\ #include "foo.H" #include """ self.RegisterFileContents({'foo.cc': infile}) num_files_modified = fix_includes.SortIncludesInFiles( ['foo.cc'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) def testSortingMainCUIncludeInSameDirectoryWithInl(self): """Check that we identify when first -inl.h file is a main-cu #include.""" infile = """\ #include #include "me/subdir0/foo-inl.h" #include "other/baz.h" """ expected_output = """\ #include "me/subdir0/foo-inl.h" #include #include "other/baz.h" """ self.RegisterFileContents({'me/subdir0/foo.cc': infile}) num_files_modified = fix_includes.SortIncludesInFiles( ['me/subdir0/foo.cc'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) def testSortingMainCUIncludeInDifferentDirectory(self): """Check that we identify when first .h file is a main-cu #include.""" infile = """\ #include "me/subdir0/foo.h" #include #include "other/baz.h" """ self.RegisterFileContents({'me/other_subdir/foo.cc': infile}) num_files_modified = fix_includes.SortIncludesInFiles( ['me/other_subdir/foo.cc'], self.flags) self.assertListEqual([], self.actual_after_contents) self.assertEqual(0, num_files_modified) def testSortingMainCUIncludeInDifferentDirectoryWhenNotFirst(self): """Check that we don't let second .h be a main-cu #include.""" infile = """\ #include #include "me/subdir0/foo.h" #include "other/baz.h" """ self.RegisterFileContents({'me/other_subdir/foo.cc': infile}) num_files_modified = fix_includes.SortIncludesInFiles( ['me/other_subdir/foo.cc'], self.flags) self.assertListEqual([], self.actual_after_contents) self.assertEqual(0, num_files_modified) def testSortingProjectIncludesAuto(self): """Check that project includes can be sorted separately.""" infile = """\ #include "me/subdir0/foo.h" #include #include "me/subdir2/bar.h" #include "me/subdir1/bar.h" #include "me/subdir0/bar.h" #include "other/baz.h" """ expected_output = """\ #include "me/subdir0/foo.h" #include #include "other/baz.h" #include "me/subdir0/bar.h" #include "me/subdir1/bar.h" #include "me/subdir2/bar.h" """ self.RegisterFileContents({'me/subdir0/foo.cc': infile}) self.flags.separate_project_includes = '' num_files_modified = fix_includes.SortIncludesInFiles(['me/subdir0/foo.cc'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) def testSortingProjectIncludesUserSpecified(self): """Test user-specified project directory name.""" infile = """\ #include "me/subdir0/foo.h" #include #include "me/subdir2/bar.h" #include "me/subdir1/bar.h" #include "me/subdir0/bar.h" #include "other/baz.h" """ expected_output = """\ #include "me/subdir0/foo.h" #include #include "me/subdir1/bar.h" #include "me/subdir2/bar.h" #include "other/baz.h" #include "me/subdir0/bar.h" """ self.RegisterFileContents({'me/subdir0/foo.cc': infile}) self.flags.separate_project_includes = 'me/subdir0' num_files_modified = fix_includes.SortIncludesInFiles(['me/subdir0/foo.cc'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) def testAddingNewIncludesAfterRemovingOldOnes(self): infile = """\ // Copyright 2008 Google Inc. All Rights Reserved. // Author: zhifengc@google.com (Zhifeng Chen) #ifndef STRUCTUREDSEARCH_COMMON_INTERNAL_DFS_H_ #define STRUCTUREDSEARCH_COMMON_INTERNAL_DFS_H_ #include "util/task/status.h" ///- #include "strings/stringpiece.h" ///- ///+#include // for string ///+#include "base/macros.h" // for DISALLOW_COPY_AND_ASSIGN ///+#include "base/scoped_ptr.h" // for scoped_ptr class Query; ///+namespace util { ///+class Status; ///+} // namespace util namespace structuredsearch { ///+class FieldSpecification; class FieldTokenizer; class FieldSpecification; ///- class TokenizationSpec; class QueryXlator { ... }; #endif // #define STRUCTUREDSEARCH_COMMON_INTERNAL_DFS_H_ """ iwyu_output = """\ structuredsearch/common/internal/query_field_xlate.h should add these lines: #include // for string #include "base/macros.h" // for DISALLOW_COPY_AND_ASSIGN #include "base/scoped_ptr.h" // for scoped_ptr namespace util { class Status; } structuredsearch/common/internal/query_field_xlate.h should remove these lines: - #include "strings/stringpiece.h" // lines 8-8 - #include "util/task/status.h" // lines 7-7 The full include-list for structuredsearch/common/internal/query_field_xlate.h: #include // for string #include "base/macros.h" // for DISALLOW_COPY_AND_ASSIGN #include "base/scoped_ptr.h" // for scoped_ptr class Query; // lines 10-10 namespace structuredsearch { class FieldSpecification; } // lines 15-15 namespace structuredsearch { class FieldTokenizer; } // lines 14-14 namespace structuredsearch { class TokenizationSpec; } // lines 16-16 namespace util { class Status; } --- """ self.RegisterFileContents( {'structuredsearch/common/internal/query_field_xlate.h': infile}) self.ProcessAndTest(iwyu_output) def testDryRun(self): """Tests that --dry_run mode does not modify files.""" self.flags.dry_run = True infile = """\ // Copyright 2010 #include #include #include "used.h" #include "used2.h" int main() { return 0; } """ iwyu_output = """\ dry_run should add these lines: #include #include "used2.h" dry_run should remove these lines: - #include // lines 3-3 The full include-list for dry_run: #include #include "used.h" #include "used2.h" --- """ self.RegisterFileContents({'dry_run': infile}) num_modified_files = fix_includes.ProcessIWYUOutput( StringIO(iwyu_output), ['dry_run'], self.flags, None) self.assertListEqual([], self.actual_after_contents) self.assertEqual(1, num_modified_files) def testAddForwardDeclareAndKeepIwyuNamespaceFormat(self): """Tests that --keep_iwyu_namespace_format writes namespace lines using the IWYU one-line format. Input code similar to case testAddForwardDeclareInNamespace.""" self.flags.keep_iwyu_namespace_format = True infile = """\ // Copyright 2010 #include "foo.h" ///+namespace ns { class Foo; } ///+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } ///+namespace ns { namespace ns2 { namespace ns3 { template class Bang; } } } ///+namespace ns { namespace ns4 { class Baz; } } ///+ int main() { return 0; } """ iwyu_output = """\ add_fwd_declare_keep_iwyu_namespace should add these lines: namespace ns { class Foo; } namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } namespace ns { namespace ns2 { namespace ns3 { template class Bang; } } } namespace ns { namespace ns4 { class Baz; } } add_fwd_declare_keep_iwyu_namespace should remove these lines: The full include-list for add_fwd_declare_keep_iwyu_namespace: #include "foo.h" // lines 3-3 namespace ns { class Foo; } namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } namespace ns { namespace ns2 { namespace ns3 { template class Bang; } } } namespace ns { namespace ns4 { class Baz; } } --- """ self.RegisterFileContents({'add_fwd_declare_keep_iwyu_namespace': infile}) self.ProcessAndTest(iwyu_output, expected_num_modified_files=1) def testAddNestedForwardDeclaresWithKeepIwyuNamespaceFormat(self): """Tests that --keep_iwyu_namespace_format writes namespace lines using the IWYU one-line format. Input code similar to case testAddForwardDeclareInsideNamespaceWithoutForwardDeclaresAlready.""" self.flags.keep_iwyu_namespace_format = True infile = """\ // Copyright 2010 #include "foo.h" class Bar; ///+class Foo; ///+namespace ns1 { class NsFoo; } ///+namespace ns1 { namespace ns2 { namespace ns3 { class NsBaz; } } } ///+namespace ns1 { namespace ns2 { namespace ns3 { template class NsBang; } } } template class Baz; namespace ns { ///- ///+class NsFoo; ///+namespace ns2 { namespace ns3 { class NsBaz; } } ///+namespace ns2 { namespace ns3 { template class NsBang; } } ///+ class NsBar; namespace ns2 { // we sure do love nesting our namespaces! int MyFunction() { } } } int main() { return 0; } """ iwyu_output = """\ add_fwd_decl_with_keep_iwyu_format should add these lines: class Foo; namespace ns { class NsFoo; } namespace ns { namespace ns2 { namespace ns3 { class NsBaz; } } } namespace ns { namespace ns2 { namespace ns3 { template class NsBang; } } } namespace ns1 { class NsFoo; } namespace ns1 { namespace ns2 { namespace ns3 { class NsBaz; } } } namespace ns1 { namespace ns2 { namespace ns3 { template class NsBang; } } } add_fwd_decl_with_keep_iwyu_format should remove these lines: The full include-list for add_fwd_decl_with_keep_iwyu_format: #include "foo.h" // lines 3-3 class Bar; // lines 5-5 class Foo; namespace ns { class NsFoo; } namespace ns { namespace ns2 { class NsBar; } } namespace ns { namespace ns2 { namespace ns3 { class NsBaz; } } } namespace ns { namespace ns2 { namespace ns3 { template class NsBang; } } } namespace ns1 { class NsFoo; } namespace ns1 { namespace ns2 { namespace ns3 { class NsBaz; } } } namespace ns1 { namespace ns2 { namespace ns3 { template class NsBang; } } } template class Baz; // lines 6-6 --- """ self.RegisterFileContents({'add_fwd_decl_with_keep_iwyu_format': infile}) self.ProcessAndTest(iwyu_output) def testAddForwardDeclareInNamespaceWithKeepIwyuNamespaceFormat(self): """Tests that --keep_iwyu_namespace_format writes namespace lines using the IWYU one-line format. Input code similar to case testAddForwardDeclareInNamespace.""" self.flags.keep_iwyu_namespace_format = True infile = """\ // Copyright 2010 #include "foo.h" ///+namespace ns { class Foo; } ///+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } ///+namespace ns { namespace ns2 { namespace ns3 { template class Bang; } } } ///+namespace ns { namespace ns4 { class Baz; } } ///+ int main() { return 0; } """ iwyu_output = """\ add_fwd_declare_keep_iwyu_namespace should add these lines: namespace ns { class Foo; } namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } namespace ns { namespace ns2 { namespace ns3 { template class Bang; } } } namespace ns { namespace ns4 { class Baz; } } add_fwd_declare_keep_iwyu_namespace should remove these lines: The full include-list for add_fwd_declare_keep_iwyu_namespace: #include "foo.h" // lines 3-3 namespace ns { class Foo; } namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } namespace ns { namespace ns2 { namespace ns3 { template class Bang; } } } namespace ns { namespace ns4 { class Baz; } } --- """ self.RegisterFileContents({'add_fwd_declare_keep_iwyu_namespace': infile}) self.ProcessAndTest(iwyu_output, expected_num_modified_files=1) def testBasedir(self): self.flags.basedir = "/project/build/" iwyu_output = """\ ../src/source.cc should add these lines: ../src/source.cc should remove these lines: - #include // lines 1-1 The full include-list for ../src/source.cc: #include --- """ infile = """\ #include ///- #include int main() { return 0; } """ self.RegisterFileContents({'/project/src/source.cc': infile}) self.ProcessAndTest(iwyu_output, expected_num_modified_files=1) def testBasedirWithFilesToProcess(self): self.flags.basedir = "/project/build/" iwyu_output = """\ ../src/changed.cc should add these lines: ../src/changed.cc should remove these lines: - #include // lines 1-1 The full include-list for ../src/changed.cc: #include --- """ changed_file = """\ #include ///- #include int main() { return 0; } """ unchanged_file = """\ #include #include int main() { return 0; } """ iwyu_output += iwyu_output.replace('changed.cc', 'unchanged.cc') self.RegisterFileContents({ '/project/src/changed.cc': changed_file, '/project/src/unchanged.cc': unchanged_file }) self.ProcessAndTest(iwyu_output, cmdline_files=['/project/src/changed.cc'], unedited_files=['/project/src/unchanged.cc']) def testBasedirWithRelativeCmdlineFiles(self): self.flags.basedir = "/project/build/" iwyu_output = """\ ../src/changed.cc should add these lines: ../src/changed.cc should remove these lines: - #include // lines 1-1 The full include-list for ../src/changed.cc: #include --- """ changed_file = """\ #include ///- #include int main() { return 0; } """ self.RegisterFileContents({ # File path is normalized to absolute by ProcessIWYUOutput. '/project/src/changed.cc': changed_file, }) self.ProcessAndTest(iwyu_output, cmdline_files=['changed.cc'], cwd='/project/src') def testMain(self): """Make sure calling main doesn't crash. Inspired by a syntax-error bug.""" # Give an empty stdin so we don't actually try to parse anything. old_stdin = sys.stdin try: sys.stdin = StringIO() fix_includes.main(['fix_includes.py']) # argv[0] doesn't really matter finally: sys.stdin = old_stdin def testFilenamesForSortingInMain(self): """Make sure if we use s, we have a filename specified, in main().""" # -s without any files to sort. self.assertRaises(SystemExit, fix_includes.main, ['fix_includes.py', '-s']) def testReorderingInclusions(self): """Show that the --reorder flag causes #includes to be sorted.""" infile = """\ // namespace B namespace B { class BC; } // B // namespace A namespace A { class AC; } // A // b #include "b" // b // c #include // c // a #include // a // a #include "a" // a // asdf #ifdef asdf // x #include // x // endif #endif """ expected_output = """\ // namespace B namespace B { class BC; } // B // namespace A namespace A { class AC; } // A // a #include // a // c #include // c // a #include "a" // a // b #include "b" // b // asdf #ifdef asdf // x #include // x // endif #endif """ self.RegisterFileContents({'inclusions_reordered.cc': infile}) self.flags.reorder = True num_files_modified = fix_includes.SortIncludesInFiles( ['inclusions_reordered.cc'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) def testNoReorderingInclusions(self): """Show that the --noreorder flag causes #includes not to be sorted.""" infile = """\ // namespace B namespace B { class BC; } // B // namespace A namespace A { class AC; } // A // b #include "b" // b // c #include // c // a #include // a // a #include "a" // a // asdf #ifdef asdf // x #include // x // endif #endif """ expected_output = """\ // namespace B namespace B { class BC; } // B // namespace A namespace A { class AC; } // A // c #include // c // a #include // a // b #include "b" // b // a #include "a" // a // asdf #ifdef asdf // x #include // x // endif #endif """ self.RegisterFileContents({'inclusions_not_reordered.cc': infile}) self.flags.reorder = False num_files_modified = fix_includes.SortIncludesInFiles( ['inclusions_not_reordered.cc'], self.flags) self.assertListEqual(expected_output.splitlines(True), self.actual_after_contents) self.assertEqual(1, num_files_modified) class FileInfoTest(unittest.TestCase): """ Unit test for file info detection """ def testEndingsWindows(self): buf = b'first\r\nsecond\r\nthird\r\n' self.assertEqual('\r\n', fix_includes.FileInfo.guess_linesep(buf)) def testEndingsUnix(self): buf = b'first\nsecond\nthird\n' self.assertEqual('\n', fix_includes.FileInfo.guess_linesep(buf)) def testEndingsMixedUnixMajority(self): buf = b'first\nsecond\nsecond-and-a-half\r\nthird\nfourth\r\n' self.assertEqual('\n', fix_includes.FileInfo.guess_linesep(buf)) def testEndingsMixedWindowsMajority(self): buf = b'first\nsecond\r\nsecond-and-a-half\r\nthird\nfourth\r\n' self.assertEqual('\r\n', fix_includes.FileInfo.guess_linesep(buf)) def testEndingsMixedTie(self): buf = b'first\nsecond\nthird\r\nfourth\r\n' self.assertEqual(fix_includes.FileInfo.DEFAULT_LINESEP, fix_includes.FileInfo.guess_linesep(buf)) def testEncodingASCII(self): buf = b'abcdefgh' self.assertEqual('ascii', fix_includes.FileInfo.guess_encoding(buf)) def testEncodingUTF8BOM(self): buf = b'\xef\xbb\xbfSomeASCIIButWithTheBOM' self.assertEqual('utf-8-sig', fix_includes.FileInfo.guess_encoding(buf)) def testEncodingUTF8NoBOM(self): # This is a recurring test input in Swedish, translates to "shrimp sandwich" # and contains all three Swedish exotic characters. buf = b'r\xc3\xa4ksm\xc3\xb6rg\xc3\xa5s' self.assertEqual('utf-8', fix_includes.FileInfo.guess_encoding(buf)) def testEncodingISO8859_1(self): # Yours truly buf = b'Kim Gr\xe4sman' self.assertEqual('windows-1250', fix_includes.FileInfo.guess_encoding(buf)) if __name__ == '__main__': unittest.main() include-what-you-use-clang_8.0/gcc-8.intrinsics.imp000066400000000000000000000102411345265751700223260ustar00rootroot00000000000000# These mappings based on #error pragmas in the header files below in gcc 8.1.0 # backwards compatibility tested on gcc 4.8.4, 4.9.3, 6.2.0, 7.3.0 [ { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # files that list two possible public headers { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # one rule for backwards compatibility with gcc 6.1 and 6.2 { include: ["", private, "", public ] }, ] include-what-you-use-clang_8.0/gcc.libc.imp000066400000000000000000000341571345265751700207210ustar00rootroot00000000000000# Mappings for GNU libc # ( cd /usr/include && grep '^ *# *include' {sys/,net/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: [ "<$2>", private, "<$1>", public ] },@' | grep bits/ | sort ) # When I saw more than one mapping for these, I typically picked # what I thought was the "best" one. [ { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, # Sometimes libc tells you what mapping to do via an '#error': # # error "Never use directly; include instead." # or # # error "Never include directly; use instead." # ( cd /usr/include && grep -R '^ *# *error "Never use\|include' * | perl -nle 'm/<([^>]+).*directly.*<([^>]+)/ && print qq@ { include: [ "<$1>", private, "<$2>", public ] },@' | sort ) { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, # Top-level #includes that just forward to another file: # $ for i in /usr/include/*; do [ -f $i ] } && [ `wc -l < $i` = 1 ] } && echo $i; done # (poll.h, syscall.h, syslog.h, ustat.h, wait.h). # For each file, I looked at the list of canonical header files -- # http://www.opengroup.org/onlinepubs/9699919799/idx/head.html -- # to decide which of the two files is canonical. If neither is # on the POSIX.1 1998 list, I just choose the top-level one. { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, # These are all files in bits/ that delegate to asm/ and linux/ to # do all (or lots) of the work. Note these are private->private. # $ for i in /usr/include/bits/*; do for dir in asm linux; do grep -H -e $dir/`basename $i` $i; done; done { include: [ "", private, "", private ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", private ] }, # Some asm files have 32- and 64-bit variants: # $ ls /usr/include/asm/*_{32,64}.h { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", private ] }, { include: [ "", private, "", private ] }, # I don't know what grep would have found these. I found them # via user report. { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, # PATH_MAX { include: [ "", private, "", public ] }, { include: [ "", private, "", public ] }, ] include-what-you-use-clang_8.0/gcc.stl.headers.imp000066400000000000000000000545771345265751700222340ustar00rootroot00000000000000# GCC STL headers [ # Headers explicitly annotated with `@headername` # ( cd /usr/include/c++/8 && grep -r headername | perl -nle 'm/^([^:]+).*@headername\{([^,]*)\}/ && print qq@ { include: ["<$1>", private, "<$2>", public ] },@' | sort -u ) { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # ( cd /usr/include/x86_64-linux-gnu/c++/8 && grep -r headername | perl -nle 'm/^([^:]+).*@headername\{([^,]*)\}/ && print qq@ { include: ["<$1>", private, "<$2>", public ] },@' | sort -u ) { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include' {ext/,tr1/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | grep -e bits/ -e tr1_impl/ | sort -u) # I removed a lot of 'meaningless' dependencies -- for instance, # //includes , but if someone is # using strings, isn't enough to satisfy iwyu. # We may need to add other dirs in future versions of gcc. { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # Hash and hashtable-based containers. { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # All .tcc files are gcc internal-include files. We get them from # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep -R '^ *# *include.*tcc' * | perl -nle 'm/^([^:]+).*[<"]([^>"]+)[>"]/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | sort ) # I had to manually edit some of the entries to say the map-to is private. { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", private ] }, # Some bits->bits //includes: A few files in bits re-export # symbols from other files in bits. # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include.*bits/' bits/* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: ["<$2>", private, "<$1>", private ] },@' | grep bits/ | sort -u) # and carefully picked reasonable-looking results (algorithm # *uses* pair but doesn't *re-export* pair, for instance). { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, { include: ["", private, "", private ] }, # I don't think we want to be having people move to 'backward/' # yet. (These hold deprecated STL classes that we still use # actively.) These are the ones that turned up in an analysis of { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # We have backward as part of the -I search path now, so have the # non-backwards-prefix version as well. { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, { include: ["", private, "", public ] }, # (This one should perhaps be found automatically somehow.) { include: ["", private, "", public ] }, # The iostream .h files are confusing. Lots of private headers, # which are handled above, but we also have public headers # #including each other (eg //includes ). We # are pretty forgiving: if a user specifies any public header, we # generally don't require the others. # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && egrep '^ *# *include <(istream|ostream|iostream|fstream|sstream|streambuf|ios|iosfwd)>' *stream* ios | perl -nle 'm/^([^:]+).*[<"]([^>"]+)[>"]/ and print qq@ { include: ["<$2>", public, "<$1>", public ] },@' | sort -u ) { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, { include: ["", public, "", public ] }, # The location of exception_defines.h varies by GCC version. It should # never be included directly. { include: ["", private, "", public ] }, ] include-what-you-use-clang_8.0/gcc.symbols.imp000066400000000000000000000235661345265751700215020ustar00rootroot00000000000000# For library symbols that can be defined in more than one header # file, maps from symbol-name to legitimate header files. # This list was generated via # grep -R '__.*_defined' /usr/include | perl -nle 'm,/usr/include/([^:]*):#\s*\S+ __(.*)_defined, and print qq@ { symbol: [ "$2", public, "<$1>", public ] },@' | sort -u # I ignored all entries that only appeared once on the list (eg uint32_t). # I then added in NULL, which according to [diff.null] C.2.2.3, can # be defined in , , , , # , , or . We also allow their C # equivalents. # In each case, I ordered them so was first, if it was # an option for this type. That's the preferred #include all else # equal. The visibility on the symbol-name is ignored; by convention # we always set it to private. [ { symbol: [ "blksize_t", private, "", public ] }, { symbol: [ "blkcnt_t", private, "", public ] }, { symbol: [ "blkcnt_t", private, "", public ] }, { symbol: [ "blksize_t", private, "", public ] }, { symbol: [ "clock_t", private, "", public ] }, { symbol: [ "clock_t", private, "", public ] }, { symbol: [ "daddr_t", private, "", public ] }, { symbol: [ "daddr_t", private, "", public ] }, { symbol: [ "dev_t", private, "", public ] }, { symbol: [ "dev_t", private, "", public ] }, { symbol: [ "error_t", private, "", public ] }, { symbol: [ "error_t", private, "", public ] }, { symbol: [ "error_t", private, "", public ] }, { symbol: [ "fsblkcnt_t", private, "", public ] }, { symbol: [ "fsblkcnt_t", private, "", public ] }, { symbol: [ "fsfilcnt_t", private, "", public ] }, { symbol: [ "fsfilcnt_t", private, "", public ] }, { symbol: [ "gid_t", private, "", public ] }, { symbol: [ "gid_t", private, "", public ] }, { symbol: [ "gid_t", private, "", public ] }, { symbol: [ "gid_t", private, "", public ] }, { symbol: [ "gid_t", private, "", public ] }, { symbol: [ "gid_t", private, "", public ] }, { symbol: [ "gid_t", private, "", public ] }, { symbol: [ "id_t", private, "", public ] }, { symbol: [ "id_t", private, "", public ] }, { symbol: [ "ino64_t", private, "", public ] }, { symbol: [ "ino64_t", private, "", public ] }, { symbol: [ "ino_t", private, "", public ] }, { symbol: [ "ino_t", private, "", public ] }, { symbol: [ "ino_t", private, "", public ] }, { symbol: [ "int8_t", private, "", public ] }, { symbol: [ "int8_t", private, "", public ] }, { symbol: [ "int16_t", private, "", public ] }, { symbol: [ "int32_t", private, "", public ] }, { symbol: [ "int64_t", private, "", public ] }, { symbol: [ "uint8_t", private, "", public ] }, { symbol: [ "uint16_t", private, "", public ] }, { symbol: [ "uint32_t", private, "", public ] }, { symbol: [ "uint64_t", private, "", public ] }, { symbol: [ "intptr_t", private, "", public ] }, { symbol: [ "uintptr_t", private, "", public ] }, { symbol: [ "intptr_t", private, "", public ] }, { symbol: [ "key_t", private, "", public ] }, { symbol: [ "key_t", private, "", public ] }, { symbol: [ "mode_t", private, "", public ] }, { symbol: [ "mode_t", private, "", public ] }, { symbol: [ "mode_t", private, "", public ] }, { symbol: [ "mode_t", private, "", public ] }, { symbol: [ "nlink_t", private, "", public ] }, { symbol: [ "nlink_t", private, "", public ] }, { symbol: [ "off64_t", private, "", public ] }, { symbol: [ "off64_t", private, "", public ] }, { symbol: [ "off_t", private, "", public ] }, { symbol: [ "off_t", private, "", public ] }, { symbol: [ "off_t", private, "", public ] }, { symbol: [ "off_t", private, "", public ] }, { symbol: [ "pid_t", private, "", public ] }, { symbol: [ "pid_t", private, "", public ] }, { symbol: [ "pid_t", private, "", public ] }, { symbol: [ "pid_t", private, "", public ] }, { symbol: [ "pid_t", private, "", public ] }, { symbol: [ "pid_t", private, "", public ] }, { symbol: [ "pid_t", private, "", public ] }, { symbol: [ "pid_t", private, "", public ] }, { symbol: [ "sigset_t", private, "", public ] }, { symbol: [ "sigset_t", private, "", public ] }, { symbol: [ "sigset_t", private, "", public ] }, { symbol: [ "socklen_t", private, "", private ] }, { symbol: [ "socklen_t", private, "", public ] }, { symbol: [ "socklen_t", private, "", public ] }, { symbol: [ "ssize_t", private, "", public ] }, { symbol: [ "ssize_t", private, "", public ] }, { symbol: [ "ssize_t", private, "", public ] }, { symbol: [ "ssize_t", private, "", public ] }, { symbol: [ "suseconds_t", private, "", public ] }, { symbol: [ "suseconds_t", private, "", public ] }, { symbol: [ "suseconds_t", private, "", public ] }, { symbol: [ "time_t", private, "", public ] }, { symbol: [ "time_t", private, "", public ] }, { symbol: [ "timespec", private, "", public ] }, { symbol: [ "timeval", private, "", public ] }, { symbol: [ "u_char", private, "", public ] }, { symbol: [ "u_char", private, "", public ] }, { symbol: [ "uid_t", private, "", public ] }, { symbol: [ "uid_t", private, "", public ] }, { symbol: [ "uid_t", private, "", public ] }, { symbol: [ "uid_t", private, "", public ] }, { symbol: [ "uid_t", private, "", public ] }, { symbol: [ "uid_t", private, "", public ] }, { symbol: [ "uid_t", private, "", public ] }, { symbol: [ "useconds_t", private, "", public ] }, { symbol: [ "useconds_t", private, "", public ] }, # glob.h seems to define size_t if necessary, but it should come from stddef. { symbol: [ "size_t", private, "", public ] }, { symbol: [ "size_t", private, "", public ] }, { symbol: [ "size_t", private, "", public ] }, { symbol: [ "size_t", private, "", public ] }, { symbol: [ "size_t", private, "", public ] }, { symbol: [ "size_t", private, "", public ] }, { symbol: [ "size_t", private, "", public ] }, # Macros that can be defined in more than one file, don't have the # same __foo_defined guard that other types do, so the grep above # doesn't discover them. Until I figure out a better way, I just # add them in by hand as I discover them. { symbol: [ "EOF", private, "", public ] }, { symbol: [ "EOF", private, "", public ] }, { symbol: [ "FILE", private, "", public ] }, { symbol: [ "va_list", private, "", public ] }, # These are symbols that could be defined in either stdlib.h or # malloc.h, but we always want the stdlib location. { symbol: [ "malloc", private, "", public ] }, { symbol: [ "calloc", private, "", public ] }, { symbol: [ "realloc", private, "", public ] }, { symbol: [ "free", private, "", public ] }, # Entries for NULL { symbol: [ "NULL", private, "", public ] }, # 'canonical' location for NULL { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, { symbol: [ "NULL", private, "", public ] }, # Kludge time: almost all STL types take an allocator, but they # almost always use the default value. Usually we detect that # and don't try to do IWYU, but sometimes it passes through. # For instance, when adding two strings, we end up calling # template<_CharT,_Traits,_Alloc> ... operator+( # basic_string<_CharT,_Traits,_Alloc>, ...) # These look like normal template args to us, so we see they're # used and declare an iwyu dependency, even though we don't need # to #include the traits or alloc type ourselves. The surest way # to deal with this is to just say that everyone provides # std::allocator. We can add more here at need. { symbol: [ "std::allocator", private, "", public ] }, { symbol: [ "std::allocator", private, "", public ] }, { symbol: [ "std::allocator", private, "", public ] }, { symbol: [ "std::allocator", private, "", public ] }, { symbol: [ "std::allocator", private, "", public ] }, # A similar kludge for std::char_traits. basic_string, # basic_ostream and basic_istream have this as a default template # argument, and sometimes it bleeds through when clang desugars the # string/ostream/istream type. { symbol: [ "std::char_traits", private, "", public ] }, { symbol: [ "std::char_traits", private, "", public ] }, { symbol: [ "std::char_traits", private, "", public ] } ] include-what-you-use-clang_8.0/iwyu.cc000066400000000000000000005317251345265751700200550ustar00rootroot00000000000000//===--- iwyu.cc - main logic and driver for include-what-you-use ---------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // A Clang-based tool that catches Include-What-You-Use violations: // // The analysis enforces the following rule: // // - For every symbol (variable, function, constant, type, and macro) // X in C++ file CU.cc, X must be declared in CU.cc or in a header // file directly included by itself, CU.h, or CU-inl.h. Likewise // for CU.h and CU-inl.h. // // The rule has a few slight wrinkles: // 1) CU_test.cc can also 'inherit' #includes from CU.h and CU-inl.h. // Likewise for CU_unittest.cc, CU_regtest.cc, etc. // 2) CU.cc can inherit #includes from ../public/CU.h in addition to // ./CU.h (likewise for -inl.h). // 3) For system #includes, and a few google #includes, we hard-code // in knowledge of which #include files are public and which are not. // (For instance, is public, is not.) // We force CU.cc, CU.h, and CU-inl.h to #include the public version. // // iwyu.cc checks if a symbol can be forward-declared instead of fully // declared. If so, it will enforce the rule that the symbol is // forward-declared in the file that references it. We only forward- // declare classes and structs (possibly templatized). We will not // try to forward-declare variables or functions. // // Checking iwyu violations for variables, functions, constants, and // macros is easy. Types can be trickier. Obviously, if you declare // a variable of type Foo in cu.cc, it's straightforward to check // whether it's an iwyu violation. But what if you call a function // that returns a type, e.g. 'if (FnReturningSomeSTLType()->empty())'? // Is it an iwyu violation if you don't #include the header for that // STL type? We say no: whatever file provided the function // FnReturningSomeSTLType is also responsible for providing whatever // the STL type is, so we don't have to. Otherwise, we get into an // un-fun propagation problem if we change the signature of // FnReturningSomeSTLType to return a different type of STL type. So // in general, types are only iwyu-checked if they appear explicitly // in the source code. // // It can likewise be difficult to say whether a template arg is // forward-declable: set x does not require the full type info // for Foo, but remove_pointer::type does. And f() doesn't // require full type info for Foo if f doesn't actually use Foo in it. // For now we do the simple heuristic that if the template arg is a // pointer, it's ok if it's forward-declared, and if not, it's not. // // We use the following terminology: // // - A *symbol* is the name of a function, variable, constant, type, // macro, etc. // // - A *quoted include path* is an include path with the surrounding <> // or "", e.g. or "ads/util.h". // // - Any #include falls into exactly one of three (non-overlapping) // categories: // // * it's said to be *necessary* if it's a compiler or IWYU error to // omit the #include; // // * it's said to be *optional* if the #include is unnecessary but // having it is not an IWYU error either (e.g. if bar.h is a // necessary #include of foo.h, and foo.cc uses symbols from // bar.h, it's optional for foo.cc to #include bar.h.); // // * it's said to be *undesired* if it's an IWYU error to have the // #include. // // Therefore, when we say a #include is *desired*, we mean that it's // either necessary or optional. // // - We also say that a #include is *recommended* if the IWYU tool // recommends to have it in the C++ source file. Obviously, any // necessary #include must be recommended, and no undesired // #include can be recommended. An optional #include can be // either recommended or not -- the IWYU tool can decide which // case it is. For example, if foo.cc desires bar.h, but can // already get it via foo.h, IWYU won't recommend foo.cc to // #include bar.h, unless it already does so. #include // for swap, find, make_pair #include // for size_t #include // for snprintf #include // for atoi, exit #include #include // for swap #include // for find #include // for swap #include // for map, swap, etc #include // for unique_ptr #include // for set, set<>::iterator, swap #include // for string, operator+, etc #include // for pair, make_pair #include // for vector, swap #include "iwyu_ast_util.h" #include "iwyu_cache.h" #include "iwyu_globals.h" #include "iwyu_lexer_utils.h" #include "iwyu_location_util.h" #include "iwyu_output.h" #include "iwyu_path_util.h" #include "iwyu_use_flags.h" // This is needed for // preprocessor_info().PublicHeaderIntendsToProvide(). Somehow IWYU // removes it mistakenly. #include "iwyu_preprocessor.h" // IWYU pragma: keep #include "iwyu_stl_util.h" #include "iwyu_string_util.h" #include "iwyu_verrs.h" #include "port.h" // for CHECK_ #include "llvm/Support/Casting.h" #include "llvm/Support/raw_ostream.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/OperationKinds.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/Stmt.h" #include "clang/AST/TemplateBase.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" #include "clang/Basic/SourceLocation.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendAction.h" #include "clang/Lex/Preprocessor.h" #include "clang/Sema/Sema.h" namespace clang { class FileEntry; class PPCallbacks; } // namespace clang namespace include_what_you_use { // I occasionally clean up this list by running: // $ grep "using clang":: iwyu.cc | cut -b14- | tr -d ";" | while read t; do grep -q "[^:]$t" iwyu.cc || echo $t; done using clang::ASTConsumer; using clang::ASTContext; using clang::ASTFrontendAction; using clang::Attr; using clang::CXXConstructExpr; using clang::CXXConstructorDecl; using clang::CXXCtorInitializer; using clang::CXXDeleteExpr; using clang::CXXDestructorDecl; using clang::CXXMethodDecl; using clang::CXXNewExpr; using clang::CXXOperatorCallExpr; using clang::CXXRecordDecl; using clang::CallExpr; using clang::ClassTemplateDecl; using clang::ClassTemplateSpecializationDecl; using clang::CompilerInstance; using clang::ConstructorUsingShadowDecl; using clang::Decl; using clang::DeclContext; using clang::DeclRefExpr; using clang::ElaboratedType; using clang::EnumType; using clang::Expr; using clang::FileEntry; using clang::FriendDecl; using clang::FriendTemplateDecl; using clang::FunctionDecl; using clang::FunctionProtoType; using clang::FunctionTemplateDecl; using clang::FunctionType; using clang::ImplicitCastExpr; using clang::LValueReferenceType; using clang::LinkageSpecDecl; using clang::MemberExpr; using clang::NamedDecl; using clang::NestedNameSpecifier; using clang::NestedNameSpecifierLoc; using clang::OverloadExpr; using clang::ParmVarDecl; using clang::PPCallbacks; using clang::PointerType; using clang::QualType; using clang::QualifiedTypeLoc; using clang::RecordDecl; using clang::RecursiveASTVisitor; using clang::ReferenceType; using clang::SourceLocation; using clang::Stmt; using clang::SubstTemplateTypeParmType; using clang::TagDecl; using clang::TagType; using clang::TemplateArgument; using clang::TemplateArgumentList; using clang::TemplateArgumentLoc; using clang::TemplateName; using clang::TemplateSpecializationType; using clang::TranslationUnitDecl; using clang::Type; using clang::TypeLoc; using clang::TypedefDecl; using clang::TypedefNameDecl; using clang::TypedefType; using clang::UnaryExprOrTypeTraitExpr; using clang::UsingDecl; using clang::UsingDirectiveDecl; using clang::UsingShadowDecl; using clang::ValueDecl; using clang::VarDecl; using llvm::cast; using llvm::dyn_cast; using llvm::dyn_cast_or_null; using llvm::errs; using llvm::isa; using std::make_pair; using std::map; using std::set; using std::string; using std::swap; using std::vector; namespace { string IntToString(int i) { char buf[64]; // big enough for any number snprintf(buf, sizeof(buf), "%d", i); return buf; } bool CanIgnoreLocation(SourceLocation loc) { // If we're in a macro expansion, we always want to treat this as // being in the expansion location, never the as-written location, // since that's what the compiler does. CanIgnoreCurrentASTNode() // is an optimization, so we want to be conservative about what we // ignore. const FileEntry* file_entry = GetFileEntry(loc); const FileEntry* file_entry_after_macro_expansion = GetFileEntry(GetInstantiationLoc(loc)); // ignore symbols used outside foo.{h,cc} + check_also return (!ShouldReportIWYUViolationsFor(file_entry) && !ShouldReportIWYUViolationsFor(file_entry_after_macro_expansion)); } } // anonymous namespace // ---------------------------------------------------------------------- // --- BaseAstVisitor // ---------------------------------------------------------------------- // // We have a hierarchy of AST visitor classes, to keep the logic // as clear as possible. The top level, BaseAstVisitor, has some // basic, not particularly iwyu-related, functionality: // // 1) Maintain current_ast_node_, the current chain in the AST tree. // 2) Provide functions related to the current location. // 3) Print each node we're visiting, depending on --verbose settings. // 4) Add appropriate implicit text. iwyu acts as if all constructor // initializers were explicitly written, all default constructors // were explicitly written, etc, even if they're not. We traverse // the implicit stuff as if it were explicit. // 5) Add two callbacks that subclasses can override (just like any // other AST callback): TraverseImplicitDestructorCall and // HandleFunctionCall. TraverseImplicitDestructorCall is a // callback for a "pseudo-AST" node that covers destruction not // specified in source, such as a destructor destroying one of the // fields in its class. HandleFunctionCall is a convenience // callback that bundles callbacks from many different kinds of // function-calling callbacks (CallExpr, CXXConstructExpr, etc) // into one place. // // To maintain current_ast_node_ properly, this class also implements // VisitNestedNameSpecifier, VisitTemplateName, VisitTemplateArg, and // VisitTemplateArgLoc, which are parallel to the Visit*Decl()/etc // visitors. Subclasses should override these Visit routines, and not // the Traverse routine directly. template class BaseAstVisitor : public RecursiveASTVisitor { public: typedef RecursiveASTVisitor Base; // We need to create implicit ctor/dtor nodes, which requires // non-const methods on CompilerInstance, so the var can't be const. explicit BaseAstVisitor(CompilerInstance* compiler) : compiler_(compiler), current_ast_node_(nullptr) {} virtual ~BaseAstVisitor() = default; //------------------------------------------------------------ // Pure virtual methods that a subclass must implement. // Returns true if we are not interested in the current ast node for // any reason (for instance, it lives in a file we're not // analyzing). virtual bool CanIgnoreCurrentASTNode() const = 0; // Returns true if we should print the information for the // current AST node, given what file it's in. For instance, // except at very high verbosity levels, we don't print AST // nodes from system header files. virtual bool ShouldPrintSymbolFromCurrentFile() const = 0; // A string to add to the information we print for each symbol. // Each subclass can thus annotate if it's handling a node. // The return value, if not empty, should start with a space! virtual string GetSymbolAnnotation() const = 0; //------------------------------------------------------------ // (1) Maintain current_ast_node_ // How subclasses can access current_ast_node_; const ASTNode* current_ast_node() const { return current_ast_node_; } ASTNode* current_ast_node() { return current_ast_node_; } void set_current_ast_node(ASTNode* an) { current_ast_node_ = an; } bool TraverseDecl(Decl* decl) { if (current_ast_node_->StackContainsContent(decl)) return true; // avoid recursion ASTNode node(decl, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); return Base::TraverseDecl(decl); } bool TraverseStmt(Stmt* stmt) { if (current_ast_node_->StackContainsContent(stmt)) return true; // avoid recursion ASTNode node(stmt, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); return Base::TraverseStmt(stmt); } bool TraverseType(QualType qualtype) { if (qualtype.isNull()) return Base::TraverseType(qualtype); const Type* type = qualtype.getTypePtr(); if (current_ast_node_->StackContainsContent(type)) return true; // avoid recursion ASTNode node(type, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); return Base::TraverseType(qualtype); } // RecursiveASTVisitor has a hybrid type-visiting system: it will // call TraverseTypeLoc when it can, but will call TraverseType // otherwise. For instance, if we see a FunctionDecl, and it // exposes the return type via a TypeLoc, it will recurse via // TraverseTypeLoc. If it exposes the return type only via a // QualType, though, it will recurse via TraverseType. The upshot // is we need two versions of all the Traverse*Type routines. (We // don't need two versions the Visit*Type routines, since the // default behavior of Visit*TypeLoc is to just call Visit*Type.) bool TraverseTypeLoc(TypeLoc typeloc) { // QualifiedTypeLoc is a bit of a special case in the typeloc // system, off to the side. We don't care about qualifier // positions, so avoid the need for special-casing by just // traversing the unqualified version instead. if (typeloc.getAs()) { typeloc = typeloc.getUnqualifiedLoc(); } if (current_ast_node_->StackContainsContent(&typeloc)) return true; // avoid recursion ASTNode node(&typeloc, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); return Base::TraverseTypeLoc(typeloc); } bool TraverseNestedNameSpecifier(NestedNameSpecifier* nns) { if (nns == nullptr) return true; ASTNode node(nns, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); if (!this->getDerived().VisitNestedNameSpecifier(nns)) return false; return Base::TraverseNestedNameSpecifier(nns); } bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc nns_loc) { if (!nns_loc) // using NNSLoc::operator bool() return true; ASTNode node(&nns_loc, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); // TODO(csilvers): have VisitNestedNameSpecifierLoc instead. if (!this->getDerived().VisitNestedNameSpecifier( nns_loc.getNestedNameSpecifier())) return false; return Base::TraverseNestedNameSpecifierLoc(nns_loc); } bool TraverseTemplateName(TemplateName template_name) { ASTNode node(&template_name, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); if (!this->getDerived().VisitTemplateName(template_name)) return false; return Base::TraverseTemplateName(template_name); } bool TraverseTemplateArgument(const TemplateArgument& arg) { ASTNode node(&arg, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); if (!this->getDerived().VisitTemplateArgument(arg)) return false; return Base::TraverseTemplateArgument(arg); } bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc& argloc) { ASTNode node(&argloc, *GlobalSourceManager()); CurrentASTNodeUpdater canu(¤t_ast_node_, &node); if (!this->getDerived().VisitTemplateArgumentLoc(argloc)) return false; return Base::TraverseTemplateArgumentLoc(argloc); } //------------------------------------------------------------ // (2) Provide functions related to the current location. SourceLocation CurrentLoc() const { CHECK_(current_ast_node_ && "Call CurrentLoc within Visit* or Traverse*"); return current_ast_node_->GetLocation(); } string CurrentFilePath() const { return GetFilePath(CurrentLoc()); } const FileEntry* CurrentFileEntry() const { return GetFileEntry(CurrentLoc()); } string PrintableCurrentLoc() const { return PrintableLoc(CurrentLoc()); } //------------------------------------------------------------ // (3) Print each node we're visiting. // The current file location, the class or decl or type name in // brackets, along with annotations such as the indentation depth, // etc. string AnnotatedName(const string& name) const { return (PrintableCurrentLoc() + ": (" + IntToString(current_ast_node_->depth()) + GetSymbolAnnotation() + (current_ast_node_->in_forward_declare_context() ? ", fwd decl" : "") + ") [ " + name + " ] "); } // At verbose level 7 and above, returns a printable version of // the pointer, suitable for being emitted after AnnotatedName. // At lower verbose levels, returns the empty string. string PrintablePtr(const void* ptr) const { if (ShouldPrint(7)) { char buffer[32]; snprintf(buffer, sizeof(buffer), "%p ", ptr); return buffer; } return ""; } // The top-level Decl class. All Decls call this visitor (in // addition to any more-specific visitors that apply for a // particular decl). bool VisitDecl(clang::Decl* decl) { if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName(string(decl->getDeclKindName()) + "Decl") << PrintablePtr(decl) << PrintableDecl(decl) << "\n"; } return true; } bool VisitStmt(clang::Stmt* stmt) { if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName(stmt->getStmtClassName()) << PrintablePtr(stmt); PrintStmt(stmt); errs() << "\n"; } return true; } bool VisitType(clang::Type* type) { if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName(string(type->getTypeClassName()) + "Type") << PrintablePtr(type) << PrintableType(type) << "\n"; } return true; } // Make sure our logging message shows we're in the TypeLoc hierarchy. bool VisitTypeLoc(clang::TypeLoc typeloc) { if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName(string(typeloc.getTypePtr()->getTypeClassName()) + "TypeLoc") << PrintableTypeLoc(typeloc) << "\n"; } return true; } bool VisitNestedNameSpecifier(NestedNameSpecifier* nns) { if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName("NestedNameSpecifier") << PrintablePtr(nns) << PrintableNestedNameSpecifier(nns) << "\n"; } return true; } bool VisitTemplateName(TemplateName template_name) { if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName("TemplateName") << PrintableTemplateName(template_name) << "\n"; } return true; } bool VisitTemplateArgument(const TemplateArgument& arg) { if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName("TemplateArgument") << PrintablePtr(&arg) << PrintableTemplateArgument(arg) << "\n"; } return true; } bool VisitTemplateArgumentLoc(const TemplateArgumentLoc& argloc) { if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName("TemplateArgumentLoc") << PrintablePtr(&argloc) << PrintableTemplateArgumentLoc(argloc) << "\n"; } return true; } //------------------------------------------------------------ // (4) Add implicit text. // When we see an object that has implicit text that iwyu // wants to look at, we make callbacks as if that text had // been explicitly written. Here's text we consider: // // * CXXDestructorDecl: a destructor call for each non-POD field // in the dtor's class, and each base type of that class. // * CXXConstructorDecl: a constructor call for each type/base // of the class that is not explicitly listed in an initializer. // * CXXRecordDecl: a CXXConstructorDecl for each implicit // constructor (zero-arg and copy). A CXXDestructor decl // if the destructor is implicit. A CXXOperatorCallDecl if // operator= is explicit. bool TraverseCXXConstructorDecl(clang::CXXConstructorDecl* decl) { if (!Base::TraverseCXXConstructorDecl(decl)) return false; if (CanIgnoreCurrentASTNode()) return true; // We only care about classes that are actually defined. if (!decl || !decl->isThisDeclarationADefinition()) return true; // RAV's TraverseCXXConstructorDecl already handles // explicitly-written initializers, so we just want the rest. for (CXXConstructorDecl::init_const_iterator it = decl->init_begin(); it != decl->init_end(); ++it) { const CXXCtorInitializer* init = *it; if (!init->isWritten()) { if (!this->getDerived().TraverseStmt(init->getInit())) return false; } } return true; } bool TraverseCXXDestructorDecl(clang::CXXDestructorDecl* decl) { if (!Base::TraverseCXXDestructorDecl(decl)) return false; if (CanIgnoreCurrentASTNode()) return true; // We only care about calls that are actually defined. if (!decl || !decl->isThisDeclarationADefinition()) return true; // Collect all the fields (and bases) we destroy, and call the dtor. set member_types; const CXXRecordDecl* record = decl->getParent(); for (clang::RecordDecl::field_iterator it = record->field_begin(); it != record->field_end(); ++it) { member_types.insert(it->getType().getTypePtr()); } for (clang::CXXRecordDecl::base_class_const_iterator it = record->bases_begin(); it != record->bases_end(); ++it) { member_types.insert(it->getType().getTypePtr()); } for (const Type* type : member_types) { const NamedDecl* member_decl = TypeToDeclAsWritten(type); // We only want those fields that are c++ classes. if (const CXXRecordDecl* cxx_field_decl = DynCastFrom(member_decl)) { if (const CXXDestructorDecl* field_dtor = cxx_field_decl->getDestructor()) { if (!this->getDerived().TraverseImplicitDestructorCall( const_cast(field_dtor), type)) return false; } } } return true; } // clang lazily constructs the implicit methods of a C++ class (the // default constructor and destructor, etc) -- it only bothers to // create a CXXMethodDecl if someone actually calls these classes. // But we need to be non-lazy: iwyu depends on analyzing what future // code *may* call in a class, not what current code *does*. So we // force all the lazy evaluation to happen here. This will // (possibly) add a bunch of MethodDecls to the AST, as children of // decl. We're hoping it will always be safe to modify the AST // while it's being traversed! void InstantiateImplicitMethods(CXXRecordDecl* decl) { if (decl->isDependentType()) // only instantiate if class is instantiated return; clang::Sema& sema = compiler_->getSema(); DeclContext::lookup_result ctors = sema.LookupConstructors(decl); for (NamedDecl* ctor_lookup : ctors) { // Ignore templated or inheriting constructors. if (isa(ctor_lookup) || isa(ctor_lookup) || isa(ctor_lookup)) continue; CXXConstructorDecl* ctor = cast(ctor_lookup); if (!ctor->hasBody() && !ctor->isDeleted() && ctor->isImplicit()) { if (sema.getSpecialMember(ctor) == clang::Sema::CXXDefaultConstructor) { sema.DefineImplicitDefaultConstructor(CurrentLoc(), ctor); } else { // TODO(nlewycky): enable this! //sema.DefineImplicitCopyConstructor(CurrentLoc(), ctor); } } // Unreferenced template constructors stay uninstantiated on purpose. } if (CXXDestructorDecl* dtor = sema.LookupDestructor(decl)) { if (!dtor->isDeleted()) { if (!dtor->hasBody() && dtor->isImplicit()) sema.DefineImplicitDestructor(CurrentLoc(), dtor); if (!dtor->isDefined() && dtor->getTemplateInstantiationPattern()) sema.PendingInstantiations.emplace_back(dtor, CurrentLoc()); } } // TODO(nlewycky): copy assignment operator // clang queues up method instantiations. We need to process them now. sema.PerformPendingInstantiations(); } // clang doesn't bother to set a TypeSourceInfo for implicit // methods, since, well, they don't have a location. But // RecursiveASTVisitor crashes without one, so when we lie and say // we're not implicit, we have to lie and give a location as well. // (We give the null location.) This is a small memory leak. void SetTypeSourceInfoForImplicitMethodIfNeeded(FunctionDecl* decl) { if (decl->getTypeSourceInfo() == nullptr) { ASTContext& ctx = compiler_->getASTContext(); decl->setTypeSourceInfo(ctx.getTrivialTypeSourceInfo(decl->getType())); } } // RAV.h's TraverseDecl() ignores implicit nodes, so we lie a bit. // TODO(csilvers): figure out a more principled way. bool TraverseImplicitDeclHelper(clang::FunctionDecl* decl) { CHECK_(decl->isImplicit() && "TraverseImplicitDecl is for implicit decls"); decl->setImplicit(false); SetTypeSourceInfoForImplicitMethodIfNeeded(decl); bool retval = this->getDerived().TraverseDecl(decl); decl->setImplicit(true); return retval; } // Handle implicit methods that otherwise wouldn't be seen by RAV. bool TraverseCXXRecordDecl(clang::CXXRecordDecl* decl) { if (!Base::TraverseCXXRecordDecl(decl)) return false; if (CanIgnoreCurrentASTNode()) return true; // We only care about classes that are actually defined. if (!decl || !decl->isThisDeclarationADefinition()) return true; InstantiateImplicitMethods(decl); // Check to see if there are any implicit constructors. Can be // several: implicit default constructor, implicit copy constructor. for (CXXRecordDecl::ctor_iterator it = decl->ctor_begin(); it != decl->ctor_end(); ++it) { CXXConstructorDecl* ctor = *it; if (ctor->isImplicit() && !ctor->isDeleted()) { if (!TraverseImplicitDeclHelper(ctor)) return false; } } // Check the (single) destructor. bool has_implicit_declared_destructor = (!decl->needsImplicitDestructor() && !decl->hasUserDeclaredDestructor()); if (has_implicit_declared_destructor) { if (!TraverseImplicitDeclHelper(decl->getDestructor())) return false; } // Check copy and move assignment operators. for (CXXRecordDecl::method_iterator it = decl->method_begin(); it != decl->method_end(); ++it) { bool is_assignment_operator = it->isCopyAssignmentOperator() || it->isMoveAssignmentOperator(); if (is_assignment_operator && it->isImplicit()) { if (!TraverseImplicitDeclHelper(*it)) return false; } } return true; } //------------------------------------------------------------ // (5) Add TraverseImplicitDestructorCall and HandleFunctionCall. // TraverseImplicitDestructorCall: This is a callback this class // introduces that is a first-class callback just like any AST-node // callback. It is used to cover two places where the compiler // destroys objects, but there's no written indication of that in // the text: (1) when a local variable or a temporary goes out of // scope (NOTE: in this case, we attribute the destruction to the // same line as the corresponding construction, not to where the // scope ends). (2) When a destructor destroys one of the fields of // a class. For instance: 'class Foo { MyClass b; }': In addition // to executing its body, Foo::~Foo calls MyClass::~Myclass on b. // Note we only call this if an actual destructor is being executed: // we don't call it when an int goes out of scope! // // HandleFunctionCall: A convenience callback that 'bundles' // the following Expr's, each of which causes one or more // function calls when evaluated (though most of them are // not a child of CallExpr): // * CallExpr (obviously) // * CXXMemberCallExpr // * CXXOperatorCallExpr -- a call to operatorXX() // * CXXConstructExpr -- calls a constructor to create an object, // and maybe a destructor when the object goes out of scope. // * CXXTemporaryObjectExpr -- subclass of CXXConstructExpr // * CXXNewExpr -- calls operator new and a constructor // * CXXDeleteExpr -- calls operator delete and a destructor // * DeclRefExpr -- if the declref is a function pointer, we // treat it as a function call, since it can act like one // in the future // * ImplicitDestructorCall -- calls a destructor // Each of these calls HandleFunctionCall for the function calls // it does. A subclass interested only in function calls, and // not exactly what expression caused them, can override // HandleFunctionCall. Note: subclasses should expect that // the first argument to HandleFunctionCall may be nullptr (e.g. when // constructing a built-in type), in which case the handler should // immediately return. // If the function being called is a member of a class, parent_type // is the type of the method's owner (parent), as it is written in // the source. (We need the type-as-written so we can distinguish // explicitly-written template args from default template args.) We // also pass in the CallExpr (or CXXConstructExpr, etc). This may // be nullptr if the function call is implicit. bool HandleFunctionCall(clang::FunctionDecl* callee, const clang::Type* parent_type, const clang::Expr* calling_expr) { if (!callee) return true; if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName("FunctionCall") << PrintablePtr(callee) << PrintableDecl(callee) << "\n"; } return true; } bool TraverseImplicitDestructorCall(clang::CXXDestructorDecl* decl, const Type* type_being_destroyed) { if (CanIgnoreCurrentASTNode()) return true; if (!decl) return true; if (ShouldPrintSymbolFromCurrentFile()) { errs() << AnnotatedName("Destruction") << PrintableType(type_being_destroyed) << "\n"; } return this->getDerived().HandleFunctionCall(decl, type_being_destroyed, static_cast(nullptr)); } bool TraverseCallExpr(clang::CallExpr* expr) { if (!Base::TraverseCallExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; return this->getDerived().HandleFunctionCall(expr->getDirectCallee(), TypeOfParentIfMethod(expr), expr); } bool TraverseCXXMemberCallExpr(clang::CXXMemberCallExpr* expr) { if (!Base::TraverseCXXMemberCallExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; return this->getDerived().HandleFunctionCall(expr->getDirectCallee(), TypeOfParentIfMethod(expr), expr); } bool TraverseCXXOperatorCallExpr(clang::CXXOperatorCallExpr* expr) { if (!Base::TraverseCXXOperatorCallExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; const Type* parent_type = TypeOfParentIfMethod(expr); // If we're a free function -- bool operator==(MyClass a, MyClass b) -- // we still want to have a parent_type, as if we were defined as // MyClass::operator==. So we go through the arguments and take the // first one that's a class, and associate the function with that. if (!parent_type) { if (const Expr* first_argument = GetFirstClassArgument(expr)) parent_type = GetTypeOf(first_argument); } return this->getDerived().HandleFunctionCall(expr->getDirectCallee(), parent_type, expr); } bool TraverseCXXConstructExpr(clang::CXXConstructExpr* expr) { if (!Base::TraverseCXXConstructExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; if (!this->getDerived().HandleFunctionCall(expr->getConstructor(), GetTypeOf(expr), expr)) return false; // When creating a local variable or a temporary, but not a pointer, the // constructor is also responsible for destruction (which happens // implicitly when the variable goes out of scope). Only when initializing // a field of a class does the constructor not have to worry // about destruction. It turns out it's easier to check for that. bool will_call_implicit_destructor_on_leaving_scope = !IsCXXConstructExprInInitializer(current_ast_node()) && !IsCXXConstructExprInNewExpr(current_ast_node()); if (will_call_implicit_destructor_on_leaving_scope) { // Create the destructor if it hasn't been lazily created yet. InstantiateImplicitMethods(expr->getConstructor()->getParent()); if (const CXXDestructorDecl* dtor_decl = GetSiblingDestructorFor(expr)) { if (!this->getDerived().TraverseImplicitDestructorCall( const_cast(dtor_decl), GetTypeOf(expr))) return false; } } return true; } bool TraverseCXXTemporaryObjectExpr(clang::CXXTemporaryObjectExpr* expr) { if (!Base::TraverseCXXTemporaryObjectExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; // In this case, we *know* we're responsible for destruction as well. InstantiateImplicitMethods(expr->getConstructor()->getParent()); CXXConstructorDecl* ctor_decl = expr->getConstructor(); CXXDestructorDecl* dtor_decl = const_cast(GetSiblingDestructorFor(expr)); const Type* type = GetTypeOf(expr); return (this->getDerived().HandleFunctionCall(ctor_decl, type, expr) && this->getDerived().HandleFunctionCall(dtor_decl, type, expr)); } bool TraverseCXXNewExpr(clang::CXXNewExpr* expr) { if (!Base::TraverseCXXNewExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; const Type* parent_type = expr->getAllocatedType().getTypePtrOrNull(); // 'new' calls operator new in addition to the ctor of the new-ed type. if (FunctionDecl* operator_new = expr->getOperatorNew()) { // If operator new is a method, it must (by the semantics of // per-class operator new) be a method on the class we're newing. const Type* op_parent = nullptr; if (isa(operator_new)) op_parent = parent_type; if (!this->getDerived().HandleFunctionCall(operator_new, op_parent, expr)) return false; } return true; } bool TraverseCXXDeleteExpr(clang::CXXDeleteExpr* expr) { if (!Base::TraverseCXXDeleteExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; const Type* parent_type = expr->getDestroyedType().getTypePtrOrNull(); // We call operator delete in addition to the dtor of the deleted type. if (FunctionDecl* operator_delete = expr->getOperatorDelete()) { // If operator delete is a method, it must (by the semantics of per- // class operator delete) be a method on the class we're deleting. const Type* op_parent = nullptr; if (isa(operator_delete)) op_parent = parent_type; if (!this->getDerived().HandleFunctionCall(operator_delete, op_parent, expr)) return false; } const CXXDestructorDecl* dtor = GetDestructorForDeleteExpr(expr); return this->getDerived().HandleFunctionCall( const_cast(dtor), parent_type, expr); } // This is to catch function pointers to templates. // For instance, 'MyFunctionPtr p = &TplFn;': we need to // expand TplFn to see if it needs full type info for MyClass. bool TraverseDeclRefExpr(clang::DeclRefExpr* expr) { if (!Base::TraverseDeclRefExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; if (FunctionDecl* fn_decl = DynCastFrom(expr->getDecl())) { // If fn_decl has a class-name before it -- 'MyClass::method' -- // it's a method pointer. const Type* parent_type = nullptr; if (expr->getQualifier() && expr->getQualifier()->getAsType()) parent_type = expr->getQualifier()->getAsType(); if (!this->getDerived().HandleFunctionCall(fn_decl, parent_type, expr)) return false; } return true; } protected: CompilerInstance* compiler() { return compiler_; } private: template friend class BaseAstVisitor; CompilerInstance* const compiler_; // The currently active decl/stmt/type/etc -- that is, the node // being currently visited in a Visit*() or Traverse*() method. The // advantage of ASTNode over the object passed in to Visit*() and // Traverse*() is ASTNode knows its parent. ASTNode* current_ast_node_; }; // ---------------------------------------------------------------------- // --- AstTreeFlattenerVisitor // ---------------------------------------------------------------------- // // This simple visitor just creates a set of all AST nodes (stored as // void*'s) seen while traversing via BaseAstVisitor. class AstFlattenerVisitor : public BaseAstVisitor { public: typedef BaseAstVisitor Base; // We divide our set of nodes into category by type. For most AST // nodes, we can store just a pointer to the node. However, for // some AST nodes we don't get a pointer into the AST, we get a // temporary (stack-allocated) object, and have to store the full // object ourselves and use its operator== to test for equality. // These types each get their own set (or, usually, vector, since // the objects tend not to support operator< or hash<>()). class NodeSet { public: // We could add more versions, but these are the only useful ones so far. bool Contains(const Type* type) const { return ContainsKey(others, type); } bool Contains(const Decl* decl) const { return ContainsKey(others, decl); } bool Contains(const ASTNode& node) const { if (const TypeLoc* tl = node.GetAs()) { return ContainsValue(typelocs, *tl); } else if (const NestedNameSpecifierLoc* nl = node.GetAs()) { return ContainsValue(nnslocs, *nl); } else if (const TemplateName* tn = node.GetAs()) { // The best we can do is to compare the associated decl if (tn->getAsTemplateDecl() == nullptr) return false; // be conservative if we can't compare decls for (const TemplateName& tpl_name : tpl_names) { if (tpl_name.getAsTemplateDecl() == tn->getAsTemplateDecl()) return true; } return false; } else if (const TemplateArgument* ta = node.GetAs()) { // TODO(csilvers): figure out how to compare template arguments (void)ta; return false; } else if (const TemplateArgumentLoc* tal = node.GetAs()) { // TODO(csilvers): figure out how to compare template argument-locs (void)tal; return false; } else { return ContainsKey(others, node.GetAs()); } } void AddAll(const NodeSet& that) { Extend(&typelocs, that.typelocs); Extend(&nnslocs, that.nnslocs); Extend(&tpl_names, that.tpl_names); Extend(&tpl_args, that.tpl_args); Extend(&tpl_arglocs, that.tpl_arglocs); InsertAllInto(that.others, &others); } // Needed since we're treated like an stl-like object. bool empty() const { return (typelocs.empty() && nnslocs.empty() && tpl_names.empty() && tpl_args.empty() && tpl_arglocs.empty() && others.empty()); } void clear() { typelocs.clear(); nnslocs.clear(); tpl_names.clear(); tpl_args.clear(); tpl_arglocs.clear(); others.clear(); } private: friend class AstFlattenerVisitor; // It's ok not to check for duplicates; we're just traversing the tree. void Add(TypeLoc tl) { typelocs.push_back(tl); } void Add(NestedNameSpecifierLoc nl) { nnslocs.push_back(nl); } void Add(TemplateName tn) { tpl_names.push_back(tn); } void Add(TemplateArgument ta) { tpl_args.push_back(ta); } void Add(TemplateArgumentLoc tal) { tpl_arglocs.push_back(tal); } void Add(const void* o) { others.insert(o); } vector typelocs; vector nnslocs; vector tpl_names; vector tpl_args; vector tpl_arglocs; set others; }; //------------------------------------------------------------ // Public interface: explicit AstFlattenerVisitor(CompilerInstance* compiler) : Base(compiler) { } const NodeSet& GetNodesBelow(Decl* decl) { CHECK_(seen_nodes_.empty() && "Nodes should be clear before GetNodesBelow"); NodeSet* node_set = &nodeset_decl_cache_[decl]; if (node_set->empty()) { if (decl->isImplicit()) { // TODO: For now, it is only working for functions. Check if it could // make sense for other implicit decls too (e.g. BuiltinTemplateDecl) if (FunctionDecl* func = DynCastFrom(decl)) { TraverseImplicitDeclHelper(func); } } else { TraverseDecl(decl); } swap(*node_set, seen_nodes_); // move the seen_nodes_ into the cache } return *node_set; // returns the cache entry } //------------------------------------------------------------ // Pure virtual methods that the base class requires. bool CanIgnoreCurrentASTNode() const override { return false; } bool ShouldPrintSymbolFromCurrentFile() const override { return false; } string GetSymbolAnnotation() const override { return "[Uninstantiated template AST-node] "; } //------------------------------------------------------------ // Top-level handlers that construct the tree. bool VisitDecl(Decl*) { AddCurrentAstNodeAsPointer(); return true; } bool VisitStmt(Stmt*) { AddCurrentAstNodeAsPointer(); return true; } bool VisitType(Type*) { AddCurrentAstNodeAsPointer(); return true; } bool VisitTypeLoc(TypeLoc typeloc) { VERRS(7) << GetSymbolAnnotation() << PrintableTypeLoc(typeloc) << "\n"; seen_nodes_.Add(typeloc); return true; } bool VisitNestedNameSpecifier(NestedNameSpecifier*) { AddCurrentAstNodeAsPointer(); return true; } bool VisitTemplateName(TemplateName tpl_name) { VERRS(7) << GetSymbolAnnotation() << PrintableTemplateName(tpl_name) << "\n"; seen_nodes_.Add(tpl_name); return true; } bool VisitTemplateArgument(const TemplateArgument& tpl_arg) { VERRS(7) << GetSymbolAnnotation() << PrintableTemplateArgument(tpl_arg) << "\n"; seen_nodes_.Add(tpl_arg); return true; } bool VisitTemplateArgumentLoc(const TemplateArgumentLoc& tpl_argloc) { VERRS(7) << GetSymbolAnnotation() << PrintableTemplateArgumentLoc(tpl_argloc) << "\n"; seen_nodes_.Add(tpl_argloc); return true; } bool TraverseImplicitDestructorCall(clang::CXXDestructorDecl* decl, const Type* type) { VERRS(7) << GetSymbolAnnotation() << "[implicit dtor] " << static_cast(decl) << (decl ? PrintableDecl(decl) : "nullptr") << "\n"; AddAstNodeAsPointer(decl); return Base::TraverseImplicitDestructorCall(decl, type); } bool HandleFunctionCall(clang::FunctionDecl* callee, const clang::Type* parent_type, const clang::Expr* calling_expr) { VERRS(7) << GetSymbolAnnotation() << "[function call] " << static_cast(callee) << (callee ? PrintableDecl(callee) : "nullptr") << "\n"; AddAstNodeAsPointer(callee); return Base::HandleFunctionCall(callee, parent_type, calling_expr); } //------------------------------------------------------------ // Class logic. void AddAstNodeAsPointer(const void* node) { seen_nodes_.Add(node); } void AddCurrentAstNodeAsPointer() { if (ShouldPrint(7)) { errs() << GetSymbolAnnotation() << current_ast_node()->GetAs() << " "; PrintASTNode(current_ast_node()); errs() << "\n"; } AddAstNodeAsPointer(current_ast_node()->GetAs()); } private: NodeSet seen_nodes_; // Because we make a new AstFlattenerVisitor each time we flatten, we // need to make this map static. // TODO(csilvers): just have one flattener, so this needn't be static. static map nodeset_decl_cache_; }; map AstFlattenerVisitor::nodeset_decl_cache_; // ---------------------------------------------------------------------- // --- VisitorState // ---------------------------------------------------------------------- // // This is a simple struct holding data that IwyuBaseASTVisitor will // need to access and manipulate. It's held separately from // IwyuBaseASTVisitor because we want this information to be shared // between the IwyuASTConsumer and the InstantiatedTemplateVisitor, // each of which gets its own copy of IwyuBaseASTVisitor data. So to // share data, we need to hold it somewhere else. struct VisitorState { VisitorState(CompilerInstance* c, const IwyuPreprocessorInfo& ipi) : compiler(c), preprocessor_info(ipi) {} CompilerInstance* const compiler; // Information gathered at preprocessor time, including #include info. const IwyuPreprocessorInfo& preprocessor_info; // When we see an overloaded function that depends on a template // parameter, we can't resolve the overload until the template // is instantiated (e.g., MyFunc in the following example): // template MyFunc() { OverloadedFunction(T()); } // However, sometimes we can do iwyu even before resolving the // overload, if *all* potential overloads live in the same file. We // mark the location of such 'early-processed' functions here, so // when we see the function again at template-instantiation time, we // know not to do iwyu-checking on it again. (Since the actual // function-call exprs are different between the uninstantiated and // instantiated calls, we can't store the exprs themselves, but have // to store their location.) set processed_overload_locs; // When we see a using declaration, we want to keep track of what // file it's in, because other files may depend on that using // declaration to get the names of their types right. We want to // make sure we don't replace an #include with a forward-declare // when we might need the #include's using declaration. // The key is the type being 'used', the FileEntry is the file // that has the using decl. If there are multiple using decls // for a file, we prefer the one that has NamedDecl in it. multimap using_declarations; }; // ---------------------------------------------------------------------- // --- IwyuBaseAstVisitor // ---------------------------------------------------------------------- // // We use two AST visitor classes to implement IWYU: IwyuAstConsumer // is the main visitor that traverses the AST corresponding to what's // actually written in the source code, and // InstantiatedTemplateVisitor is for traversing template // instantiations. This class template holds iwyu work that is be // shared by both. template class IwyuBaseAstVisitor : public BaseAstVisitor { public: typedef BaseAstVisitor Base; explicit IwyuBaseAstVisitor(VisitorState* visitor_state) : Base(visitor_state->compiler), visitor_state_(visitor_state) {} ~IwyuBaseAstVisitor() override = default; // To avoid having this-> pointers everywhere, we re-export Base's // functions that we use in this class. This is a language nit(?) // when a templated class subclasses from another templated class. using Base::CanIgnoreCurrentASTNode; using Base::CurrentLoc; using Base::CurrentFileEntry; using Base::PrintableCurrentLoc; using Base::current_ast_node; //------------------------------------------------------------ // Pure virtual methods that a subclass must implement. // Returns true if we are not interested in iwyu information for the // given type, where the type is *not* the current AST node. // TODO(csilvers): check we're calling this consistent with its API. virtual bool CanIgnoreType(const Type* type) const = 0; // Returns true if we are not interested in doing an iwyu check on // the given decl, where the decl is *not* the current AST node. // TODO(csilvers): check we're calling this consistent with its API. virtual bool CanIgnoreDecl(const Decl* decl) const = 0; //------------------------------------------------------------ // IWYU logic. // Helper for MapPrivateDeclToPublicDecl. Returns true if the decl // is a template specialization whose (written qualified) name matches // the given name, has the given number of template arguments, and // whose specified tpl argument is a type. bool DeclIsTemplateWithNameAndNumArgsAndTypeArg( const Decl* decl, const string& name, size_t num_args, size_t type_arg_idx) const { const ClassTemplateSpecializationDecl* tpl_decl = DynCastFrom(decl); if (!tpl_decl) return false; const string actual_name = GetWrittenQualifiedNameAsString(tpl_decl); if (name != actual_name) return false; const TemplateArgumentList& tpl_args = tpl_decl->getTemplateArgs(); if (tpl_args.size() != num_args) return false; if (tpl_args.get(type_arg_idx).getKind() != TemplateArgument::Type) return false; return true; } // This requires the above function to have been called on decl, first. const Type* GetTplTypeArg(const Decl* decl, size_t type_arg_idx) const { const ClassTemplateSpecializationDecl* tpl_decl = DynCastFrom(decl); CHECK_(tpl_decl && "Must call DeclIsTemplateWithNameAndNumArgsAndTypeArg"); const TemplateArgumentList& tpl_args = tpl_decl->getTemplateArgs(); CHECK_(tpl_args.size() > type_arg_idx && "Invalid type_arg_idx"); CHECK_(tpl_args.get(type_arg_idx).getKind() == TemplateArgument::Type); return tpl_args.get(type_arg_idx).getAsType().getTypePtr(); } // Some types, such as __gnu_cxx::__normal_iterator or std::__wrap_iter, are // private types that should not be exposed to the user. Instead, they're // exposed to the user via typedefs, like vector::iterator. // Sometimes, the typedef gets lost (such as for find(myvec.begin(), // myvec.end(), foo)), so we need to manually map back. We map // __normal_iterator to vector<> and __wrap_iter to foo, // assuming that the vector<> class includes the typedef. Likewise, we map // any free function taking a private iterator (such as operator==) the // same way, assuming that that (templatized) function is instantiated // as part of the vector class. // We do something similar for _List_iterator and _List_const_iterator // from GNU libstdc++, and for __list_iterator and __list_const_iterator // from libc++. These private names are defined in stl_list.h and list // respectively, so we don't need to re-map them, but we do want to re-map // reverse_iterator<_List_iterator> to something in list header. // If the input decl does not correspond to one of these private // decls, we return nullptr. This method is actually a helper for // MapPrivateDeclToPublicDecl() and MapPrivateTypeToPublicType(). const Type* MapPrivateDeclToPublicType(const NamedDecl* decl) const { const NamedDecl* class_decl = decl; // If we're a member method, then the __normal_iterator or __wrap_iter will // be the parent: __normal_iterator::operator=. If we're a free // overloaded operator, then the __normal_iterator will be the // first argument: operator==(__normal_iterator<...>& lhs, ...); if (const CXXMethodDecl* method_decl = DynCastFrom(class_decl)) { class_decl = method_decl->getParent(); } else if (const FunctionDecl* fn = DynCastFrom(decl)) { if (fn->isOverloadedOperator() && fn->getNumParams() >= 1) { const Type* firstarg_type = fn->getParamDecl(0)->getType().getTypePtr(); firstarg_type = RemovePointersAndReferencesAsWritten(firstarg_type); class_decl = TypeToDeclAsWritten(firstarg_type); } } // In addition to __normal_iterator and __wrap_iter, we want // to handle reverse_iterator<__normal_iterator>, and in the same way. if (DeclIsTemplateWithNameAndNumArgsAndTypeArg( class_decl, "std::reverse_iterator", 1, 0)) { const Type* reversed_iterator_type = GetTplTypeArg(class_decl, 0); // Gets class_decl to be reversed iterator. class_decl = TypeToDeclAsWritten(reversed_iterator_type); // If it's reverse_iterator<_List_iterator>, map to // _List_iterator, which is defined in stl_list like we want. Also map // reverse_iterator<__list_iterator> to __list_iterator which is defined // in list. if (DeclIsTemplateWithNameAndNumArgsAndTypeArg( class_decl, "std::_List_iterator", 1, 0) || DeclIsTemplateWithNameAndNumArgsAndTypeArg( class_decl, "std::_List_const_iterator", 1, 0) || DeclIsTemplateWithNameAndNumArgsAndTypeArg( class_decl, "std::__list_iterator", 2, 0) || DeclIsTemplateWithNameAndNumArgsAndTypeArg( class_decl, "std::__list_const_iterator", 2, 0)) { return reversed_iterator_type; } } if (DeclIsTemplateWithNameAndNumArgsAndTypeArg( class_decl, "__gnu_cxx::__normal_iterator", 2, 1)) { return GetTplTypeArg(class_decl, 1); } if (DeclIsTemplateWithNameAndNumArgsAndTypeArg( class_decl, "std::__wrap_iter", 1, 0)) { return GetTplTypeArg(class_decl, 0); } return nullptr; } const NamedDecl* MapPrivateDeclToPublicDecl(const NamedDecl* decl) const { const Type* public_type = MapPrivateDeclToPublicType(decl); if (public_type) return TypeToDeclAsWritten(public_type); return decl; } const Type* MapPrivateTypeToPublicType(const Type* type) const { const NamedDecl* private_decl = TypeToDeclAsWritten(type); const Type* public_type = MapPrivateDeclToPublicType(private_decl); if (public_type) return public_type; return type; } // Get the canonical use location for a (location, decl) pair. // Decide whether the file expanding the macro or the file defining the macro // should be held responsible for a use. SourceLocation GetCanonicalUseLocation(SourceLocation use_loc, const NamedDecl* decl) { // If we're not in a macro, just echo the use location. if (!use_loc.isMacroID()) return use_loc; VERRS(5) << "Trying to determine use location for '" << PrintableDecl(decl) << "'\n"; clang::SourceManager* sm = GlobalSourceManager(); SourceLocation spelling_loc = sm->getSpellingLoc(use_loc); SourceLocation expansion_loc = sm->getExpansionLoc(use_loc); // If the file defining the macro contains a forward decl, keep it around // and treat it as a hint that the expansion loc is responsible for the // symbol. const FileEntry* macro_def_file = GetLocFileEntry(spelling_loc); VERRS(5) << "Macro is defined in file '" << GetFilePath(macro_def_file) << "'. Looking for fwd-decl hint...\n"; const NamedDecl* fwd_decl = nullptr; for (const NamedDecl* redecl : GetClassRedecls(decl)) { if (GetFileEntry(redecl) == macro_def_file && IsForwardDecl(redecl)) { fwd_decl = redecl; // Make sure we keep that forward-declaration, even if it's probably // unused in this file. IwyuFileInfo* file_info = preprocessor_info().FileInfoFor(macro_def_file); file_info->ReportForwardDeclareUse( spelling_loc, fwd_decl, ComputeUseFlags(current_ast_node()), nullptr); break; } } // Resolve the best use location based on our current knowledge. // // 1) If the use_loc is in , we assume it's formed by macro // argument concatenation, and attribute responsibility to the expansion // location. // 2) If the macro definition file forward-declares the used decl, that's a // hint that it wants the expansion location to take responsibility. // // Otherwise, the spelling loc is responsible. if (IsInScratchSpace(spelling_loc)) { VERRS(5) << "Spelling location is in , presumably as a " "result of macro arg concatenation.\n"; use_loc = expansion_loc; } else if (fwd_decl != nullptr) { VERRS(5) << "Found a forward-decl in macro definition file.\n"; use_loc = expansion_loc; } else { use_loc = spelling_loc; } VERRS(4) << "Attributing use of '" << PrintableDecl(decl) << "' to location at " << PrintableLoc(use_loc) << ".\n"; return use_loc; } // There are a few situations where iwyu is more restrictive than // C++: where C++ allows a forward-declare but iwyu wants the full // type. One is in a typedef: if you write 'typedef Foo MyTypedef', // iwyu says that you are responsible for #including "foo.h", but // the language allows a forward-declare. Another is for // 'autocast': if your function has a parameter with a conversion // (one-arg, not-explicit) constructor, iwyu requires that the // function-author provides the full type of that parameter, but // the language doesn't. (It's ok with all callers providing the // full type instead.) // // In each of these situations, we allow the user to say that iwyu // should not require #includes for these underlying types, but // allow forward-declares instead. The author can do this by // explicitly forward-declaring in the same file: for instance, they // would do // class Foo; typedef Foo MyTypedef; // can be on different lines :-) // class AutocastType; void MyFunc(AutocastType); // but in same file // If a definition- or declaration-site does this forward-declaring // *and* does not directly #include the necessary file for Foo or // AutocastType, we take that as a signal from the code-author that // iwyu should relax its policies. These functions calculate the // types (which may have many component-types if it's a templated // type) for which the code-author has made this decision. bool CodeAuthorWantsJustAForwardDeclare(const Type* type, SourceLocation use_loc) { const NamedDecl* decl = TypeToDeclAsWritten(type); if (decl == nullptr) // only class-types are candidates for returning true return false; // If we're a template specialization, we also accept // forward-declarations of the underlying template (vector, not // vector). set redecls = GetClassRedecls(decl); if (const ClassTemplateSpecializationDecl* spec_decl = DynCastFrom(decl)) { InsertAllInto(GetClassRedecls(spec_decl->getSpecializedTemplate()), &redecls); } // Check if the author forward-declared the class in the same file. bool found_earlier_forward_declare_in_same_file = false; for (const NamedDecl* redecl : redecls) { if (IsBeforeInSameFile(redecl, use_loc)) { found_earlier_forward_declare_in_same_file = true; break; } } if (!found_earlier_forward_declare_in_same_file) return false; // Check if the the author is not #including the file with the // definition. PublicHeaderIntendsToProvide has exactly the // semantics we want. Note if there's no definition anywhere, we // say the author does not want the full type (which is a good // thing, since there isn't one!) if (const NamedDecl* dfn = GetDefinitionForClass(decl)) { if (IsBeforeInSameFile(dfn, use_loc)) return false; if (preprocessor_info().PublicHeaderIntendsToProvide( GetFileEntry(use_loc), GetFileEntry(dfn))) { return false; } } // OK, looks like the author has stated they don't want the fulll type. return true; } // Returns the first type that is not a typedef in a template. For example, // for template // // template class Foo { // typedef T value_type; // typedef value_type& reference; // }; // // for type 'reference' it will return type T with which Foo was instantiated. const Type* DesugarDependentTypedef(const TypedefType* typedef_type) { const DeclContext* parent = typedef_type->getDecl()->getLexicalDeclContext(); if (const ClassTemplateSpecializationDecl* template_parent = DynCastFrom(parent)) { return DesugarDependentTypedef(typedef_type, template_parent); } return typedef_type; } const Type* DesugarDependentTypedef( const TypedefType* typedef_type, const RecordDecl* parent) { const Type* underlying_type = typedef_type->getDecl()->getUnderlyingType().getTypePtr(); if (const TypedefType* underlying_typedef = DynCastFrom(underlying_type)) { if (underlying_typedef->getDecl()->getLexicalDeclContext() == parent) { return DesugarDependentTypedef(underlying_typedef, parent); } } return underlying_type; } set GetCallerResponsibleTypesForTypedef( const TypedefDecl* decl) { set retval; const Type* underlying_type = decl->getUnderlyingType().getTypePtr(); // If the underlying type is itself a typedef, we recurse. if (const TypedefType* underlying_typedef = DynCastFrom(underlying_type)) { if (const TypedefDecl* underlying_typedef_decl = DynCastFrom(TypeToDeclAsWritten(underlying_typedef))) { // TODO(csilvers): if one of the intermediate typedefs // #includes the necessary definition of the 'final' // underlying type, do we want to return the empty set here? return GetCallerResponsibleTypesForTypedef(underlying_typedef_decl); } } const Type* deref_type = RemovePointersAndReferencesAsWritten(underlying_type); if (CodeAuthorWantsJustAForwardDeclare(deref_type, GetLocation(decl))) { retval.insert(deref_type); // TODO(csilvers): include template type-args if appropriate. // This requires doing an iwyu visit of the instantiated // underlying type and seeing which type-args we require full // use for. Also have to handle the case where the type-args // are themselves templates. It will require pretty substantial // iwyu surgery. } return retval; } // ast_node is the node for the autocast CastExpr. We use it to get // the parent CallExpr to figure out what function is being called. set GetCallerResponsibleTypesForAutocast( const ASTNode* ast_node) { while (ast_node && !ast_node->IsA()) ast_node = ast_node->parent(); CHECK_(ast_node && "Should only check Autocast if under a CallExpr"); const CallExpr* call_expr = ast_node->GetAs(); const FunctionDecl* fn_decl = call_expr->getDirectCallee(); if (!fn_decl) // TODO(csilvers): what to do for fn ptrs and the like? return set(); // Collect the non-explicit, one-arg constructor ('autocast') types. set autocast_types; for (FunctionDecl::param_const_iterator param = fn_decl->param_begin(); param != fn_decl->param_end(); ++param) { const Type* param_type = GetTypeOf(*param); if (HasImplicitConversionConstructor(param_type)) { const Type* deref_param_type = RemovePointersAndReferencesAsWritten(param_type); autocast_types.insert(deref_param_type); } } // Now look at all the function decls that are visible from the // call-location. We keep only the autocast params that *all* // the function decl authors want the caller to be responsible // for. We do this by elimination: start with all types, and // remove them as we see authors providing the full type. set retval = autocast_types; for (FunctionDecl::redecl_iterator fn_redecl = fn_decl->redecls_begin(); fn_redecl != fn_decl->redecls_end(); ++fn_redecl) { // Ignore function-decls that we can't see from the use-location. if (!preprocessor_info().FileTransitivelyIncludes( GetFileEntry(call_expr), GetFileEntry(*fn_redecl))) { continue; } for (set::iterator it = retval.begin(); it != retval.end(); ) { if (!CodeAuthorWantsJustAForwardDeclare(*it, GetLocation(*fn_redecl))) { // set<> has nice property that erasing doesn't invalidate iterators. retval.erase(it++); } else { ++it; } } } // TODO(csilvers): include template type-args of each entry of retval. return retval; } set GetCallerResponsibleTypesForFnReturn( const FunctionDecl* decl) { set retval; const Type* return_type = RemoveElaboration(decl->getReturnType().getTypePtr()); if (CodeAuthorWantsJustAForwardDeclare(return_type, GetLocation(decl))) { retval.insert(return_type); // TODO(csilvers): include template type-args if appropriate. } return retval; } //------------------------------------------------------------ // Checkers, that tell iwyu_output about uses of symbols. // We let, but don't require, subclasses to override these. // The comment, if not nullptr, is extra text that is included along with // the warning message that iwyu emits. The extra use flags is optional // info that can be assigned to the use (see the UF_* constants) virtual void ReportDeclUse(SourceLocation used_loc, const NamedDecl* used_decl, const char* comment = nullptr, UseFlags extra_use_flags = 0) { const NamedDecl* target_decl = used_decl; // Sometimes a shadow decl comes between us and the 'real' decl. if (const UsingShadowDecl* shadow_decl = DynCastFrom(used_decl)) target_decl = shadow_decl->getTargetDecl(); // Map private decls like __normal_iterator to their public counterpart. target_decl = MapPrivateDeclToPublicDecl(target_decl); if (CanIgnoreDecl(target_decl)) return; const UseFlags use_flags = ComputeUseFlags(current_ast_node()) | extra_use_flags; // Canonicalize the use location and report the use. used_loc = GetCanonicalUseLocation(used_loc, target_decl); const FileEntry* used_in = GetFileEntry(used_loc); preprocessor_info().FileInfoFor(used_in)->ReportFullSymbolUse( used_loc, target_decl, use_flags, comment); // Sometimes using a decl drags in a few other uses as well: // If we're a use that depends on a using declaration, make sure // we #include the file with the using declaration. Need to check // the original reported decl so we don't lose the shadow information. // TODO(csilvers): check that our getQualifier() does not match // the namespace of the decl. If we have 'using std::vector;' + // 'std::vector foo;' we don't actually care about the // using-decl. // TODO(csilvers): maybe just insert our own using declaration // instead? We can call it "Use what you use". :-) // TODO(csilvers): check for using statements and namespace aliases too. if (const UsingDecl* using_decl = GetUsingDeclarationOf(used_decl, GetDeclContext(current_ast_node()))) { preprocessor_info().FileInfoFor(used_in)->ReportUsingDeclUse( used_loc, using_decl, use_flags, "(for using decl)"); } // For typedefs, the user of the type is sometimes the one // responsible for the underlying type. We check if that is the // case here, since we might be using a typedef type from // anywhere. ('autocast' is similar, but is handled in // VisitCastExpr; 'fn-return-type' is also similar and is // handled in HandleFunctionCall.) if (const TypedefDecl* typedef_decl = DynCastFrom(target_decl)) { // One exception: if this TypedefType is being used in another // typedef (that is, 'typedef MyTypedef OtherTypdef'), then the // user -- the other typedef -- is never responsible for the // underlying type. Instead, users of that typedef are. if (!current_ast_node()->template ParentIsA()) { const set& underlying_types = GetCallerResponsibleTypesForTypedef(typedef_decl); if (!underlying_types.empty()) { VERRS(6) << "User, not author, of typedef " << typedef_decl->getQualifiedNameAsString() << " owns the underlying type:\n"; // If any of the used types are themselves typedefs, this will // result in a recursive expansion. Note we are careful to // recurse inside this class, and not go back to subclasses. for (const Type* type : underlying_types) IwyuBaseAstVisitor::ReportTypeUse(used_loc, type); } } } } // The comment, if not nullptr, is extra text that is included along // with the warning message that iwyu emits. virtual void ReportDeclForwardDeclareUse(SourceLocation used_loc, const NamedDecl* used_decl, const char* comment = nullptr) { const NamedDecl* target_decl = used_decl; // Sometimes a shadow decl comes between us and the 'real' decl. if (const UsingShadowDecl* shadow_decl = DynCastFrom(used_decl)) target_decl = shadow_decl->getTargetDecl(); target_decl = MapPrivateDeclToPublicDecl(target_decl); if (CanIgnoreDecl(target_decl)) return; // Canonicalize the use location and report the use. used_loc = GetCanonicalUseLocation(used_loc, target_decl); const FileEntry* used_in = GetFileEntry(used_loc); preprocessor_info().FileInfoFor(used_in)->ReportForwardDeclareUse( used_loc, target_decl, ComputeUseFlags(current_ast_node()), comment); // If we're a use that depends on a using declaration, make sure // we #include the file with the using declaration. if (const UsingDecl* using_decl = GetUsingDeclarationOf(used_decl, GetDeclContext(current_ast_node()))) { preprocessor_info().FileInfoFor(used_in)->ReportUsingDeclUse( used_loc, using_decl, ComputeUseFlags(current_ast_node()), "(for using decl)"); } } void ReportDeclsUse(SourceLocation used_loc, const set& decls) { for (const NamedDecl* decl : decls) ReportDeclUse(used_loc, decl); } // Called when the given type is fully used at used_loc, regardless // of the type being explicitly written in the source code or not. // The comment, if not nullptr, is extra text that is included along // with the warning message that iwyu emits. virtual void ReportTypeUse(SourceLocation used_loc, const Type* type, const char* comment = nullptr) { // TODO(csilvers): figure out if/when calling CanIgnoreType() is correct. if (!type) return; // Map private types like __normal_iterator to their public counterpart. type = MapPrivateTypeToPublicType(type); // For the below, we want to be careful to call *our* // ReportDeclUse(), not any of the ones in subclasses. if (IsPointerOrReferenceAsWritten(type)) { type = RemovePointersAndReferencesAsWritten(type); if (const NamedDecl* decl = TypeToDeclAsWritten(type)) { VERRS(6) << "(For pointer type " << PrintableType(type) << "):\n"; IwyuBaseAstVisitor::ReportDeclForwardDeclareUse(used_loc, decl, comment); } } else { if (const NamedDecl* decl = TypeToDeclAsWritten(type)) { decl = GetDefinitionAsWritten(decl); VERRS(6) << "(For type " << PrintableType(type) << "):\n"; IwyuBaseAstVisitor::ReportDeclUse(used_loc, decl, comment); } } } void ReportTypesUse(SourceLocation used_loc, const set& types) { for (const Type* type : types) ReportTypeUse(used_loc, type); } //------------------------------------------------------------ // Visitors of types derived from clang::Decl. // Friend declarations only need their types forward-declared. bool VisitFriendDecl(clang::FriendDecl* decl) { if (CanIgnoreCurrentASTNode()) return true; current_ast_node()->set_in_forward_declare_context(true); return true; } bool VisitFriendTemplateDecl(clang::FriendTemplateDecl* decl) { if (CanIgnoreCurrentASTNode()) return true; current_ast_node()->set_in_forward_declare_context(true); return true; } // If you say 'typedef Foo Bar', C++ says you just need to // forward-declare Foo. But iwyu would rather you fully define Foo, // so all users of Bar don't have to. We make two exceptions: // 1) The author of the typedef doesn't *want* to provide Foo, and // is happy making all the callers do so. The author indicates // this by explicitly forward-declaring Foo and not #including // foo.h. // 2) The typedef is a member of a templated class, and the // underlying type is a template parameter: // template struct C { typedef T value_type; }; // This is not a re-export because you need the type to // access the typedef (via 'C::value_type'), so // there's no need for the typedef-file to provide the type // too. TODO(csilvers): this is patently wrong; figure out // something better. We need something that doesn't require // the full type info for creating a scoped_ptr. // As an extension of (2), if the typedef is a template type that // contains T as a template parameter, the typedef still re-exports // the template type (it's not (2)), but the template parameter // itself can be forward-declared, just as in (2). That is: // template struct C { typedef pair value_type; }; // iwyu will demand the full type of pair, but not of its template // arguments. This is handled not here, but below, in // VisitSubstTemplateTypeParmType. bool VisitTypedefDecl(clang::TypedefDecl* decl) { if (CanIgnoreCurrentASTNode()) return true; const Type* underlying_type = decl->getUnderlyingType().getTypePtr(); const Type* deref_type = RemovePointersAndReferencesAsWritten(underlying_type); if (CodeAuthorWantsJustAForwardDeclare(deref_type, GetLocation(decl)) || isa(underlying_type)) { current_ast_node()->set_in_forward_declare_context(true); } else { current_ast_node()->set_in_forward_declare_context(false); } return Base::VisitTypedefDecl(decl); } // If we're a declared (not defined) function, all our types -- // return type and argument types -- are forward-declarable. The // one exception required by the language is the throw types, which // we clean up in VisitType(). // There are two more exceptions that iwyu imposes: // (1) iwyu asks the function author to provide the full type // information for the return type. That way the user doesn't // have to. // (2) If any of our function parameters have a type with a // non-explicit, one-arg constructor, or is a const reference to // such a type, mark that type as not forward declarable. The // worry is that people might need the full type for the // implicit conversion (the 'autocast'), for instance, passing // in a char* to Fn(const StringPiece& foo) { ... } // Both of these iwyu requirements can be overridden by the function // author; for details, see CodeAuthorWantsJustAForwardDeclare. bool VisitFunctionDecl(clang::FunctionDecl* decl) { if (CanIgnoreCurrentASTNode()) return true; if (decl->isThisDeclarationADefinition()) { // For free functions, report use of all previously seen decls. if (decl->getKind() == Decl::Function) { FunctionDecl* redecl = decl; while ((redecl = redecl->getPreviousDecl())) ReportDeclUse(CurrentLoc(), redecl); } } else { // Make all our types forward-declarable... current_ast_node()->set_in_forward_declare_context(true); } // (The exceptions below don't apply to friend declarations; we // never need full types for them.) if (IsFriendDecl(decl)) return true; // ...except the return value. const Type* return_type = RemoveElaboration(decl->getReturnType().getTypePtr()); const bool is_responsible_for_return_type = (!CanIgnoreType(return_type) && !IsPointerOrReferenceAsWritten(return_type) && !CodeAuthorWantsJustAForwardDeclare(return_type, GetLocation(decl))); // Don't bother to report here, when the language agrees with us // we need the full type; that will be reported elsewhere, so // reporting here would be double-counting. const bool type_use_reported_in_visit_function_type = (!current_ast_node()->in_forward_declare_context() || !IsClassType(return_type)); if (is_responsible_for_return_type && !type_use_reported_in_visit_function_type) { ReportTypeUse(GetLocation(decl), return_type, "(for fn return type)"); } // ...and non-explicit, one-arg ('autocast') constructor types. for (FunctionDecl::param_iterator param = decl->param_begin(); param != decl->param_end(); ++param) { const Type* param_type = GetTypeOf(*param); if (!HasImplicitConversionConstructor(param_type)) continue; const Type* deref_param_type = RemovePointersAndReferencesAsWritten(param_type); if (CanIgnoreType(param_type) && CanIgnoreType(deref_param_type)) continue; // TODO(csilvers): remove this 'if' check when we've resolved the // clang bug where getTypeSourceInfo() can return nullptr. if ((*param)->getTypeSourceInfo()) { const TypeLoc param_tl = (*param)->getTypeSourceInfo()->getTypeLoc(); // While iwyu requires the full type of autocast parameters, // c++ does not. Function-writers can force iwyu to follow // the language by explicitly forward-declaring the type. // Check for that now, and don't require the full type. if (CodeAuthorWantsJustAForwardDeclare(deref_param_type, GetLocation(¶m_tl))) continue; // This is a 'full type required' check, to 'turn off' fwd decl. // But don't bother to report in situations where we need the // full type for other reasons; that's just double-reporting. if (current_ast_node()->in_forward_declare_context() || IsPointerOrReferenceAsWritten(param_type)) { ReportTypeUse(GetLocation(¶m_tl), deref_param_type, "(for autocast)"); } } else { VERRS(6) << "WARNING: nullptr TypeSourceInfo for " << PrintableDecl(*param) << " (type " << PrintableType(param_type) << ")\n"; } } return true; } // Special handling for C++ methods to detect covariant return types. // These are defined as a derived class overriding a method with a different // return type from the base. bool VisitCXXMethodDecl(CXXMethodDecl* method_decl) { if (CanIgnoreCurrentASTNode()) return true; if (HasCovariantReturnType(method_decl)) { const Type* return_type = RemovePointersAndReferencesAsWritten( method_decl->getReturnType().getTypePtr()); VERRS(3) << "Found covariant return type in " << method_decl->getQualifiedNameAsString() << ", needs complete type of " << PrintableType(return_type) << ".\n"; ReportTypeUse(CurrentLoc(), return_type); } return Base::VisitCXXMethodDecl(method_decl); } //------------------------------------------------------------ // Visitors of types derived from clang::Stmt. // Catch statements always require the full type to be visible, // no matter if we're catching by value, reference or pointer. bool VisitCXXCatchStmt(clang::CXXCatchStmt* stmt) { if (CanIgnoreCurrentASTNode()) return true; if (const Type* caught_type = stmt->getCaughtType().getTypePtrOrNull()) { // Strip off pointers/references to get to the 'base' type. caught_type = RemovePointersAndReferencesAsWritten(caught_type); ReportTypeUse(CurrentLoc(), caught_type); } else { // catch(...): no type to act on here. } return Base::VisitCXXCatchStmt(stmt); } // The type of the for-range-init expression is fully required, because the // compiler generates method calls to it, e.g. 'for (auto t : ts)' translates // roughly into 'for (auto i = std::begin(ts); i != std::end(ts); ++i)'. // Both the iterator type and the begin/end calls depend on the complete type // of ts, so make sure we include it. bool VisitCXXForRangeStmt(clang::CXXForRangeStmt* stmt) { if (CanIgnoreCurrentASTNode()) return true; if (const Type* type = stmt->getRangeInit()->getType().getTypePtrOrNull()) { ReportTypeUse(CurrentLoc(), RemovePointersAndReferencesAsWritten(type)); // TODO: We should probably find a way to require inclusion of any // argument-dependent begin/end declarations. } return Base::VisitCXXForRangeStmt(stmt); } // When casting non-pointers, iwyu will do the right thing // automatically, but sometimes when casting from one pointer to // another, you still need the full type information of both types: // for instance, when static-casting from a sub-class to a // super-class. Testing shows this is true for static, dynamic // casts, and implicit casts, but not for reinterpret casts, const // casts, or C-style casts. (Functional casts like int(3.5) are // treated the same as C-style casts.) clang helpfully provides a // 'cast kind', which we use to determine when full types are // needed. When we notice that the cast is a cast up or down a // class hierarchy, we require full type info for both types even // for C-style casts (though the language doesn't), to give the // compiler a fighting chance of generating correct code. bool VisitCastExpr(clang::CastExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; const Type* from_type = GetTypeOf(expr->getSubExprAsWritten()); const Type* to_type = GetTypeOf(expr); // If this cast requires a user-defined conversion of the from-type, look up // its return type so we can see through up/down-casts via such conversions. const Type* converted_from_type = nullptr; if (const NamedDecl* conv_decl = expr->getConversionFunction()) { converted_from_type = cast(conv_decl)->getReturnType().getTypePtr(); } std::vector required_full_types; // The list of kinds: http://clang.llvm.org/doxygen/namespaceclang.html switch (expr->getCastKind()) { // This cast still isn't handled directly. case clang::CK_Dependent: break; // These casts don't require any iwyu action. case clang::CK_LValueToRValue: case clang::CK_AtomicToNonAtomic: case clang::CK_NonAtomicToAtomic: case clang::CK_ReinterpretMemberPointer: case clang::CK_BuiltinFnToFnPtr: case clang::CK_ZeroToOCLOpaqueType: // OpenCL opaque types are built-in. case clang::CK_IntToOCLSampler: // OpenCL sampler_t is a built-in type. case clang::CK_AddressSpaceConversion: // Address spaces are associated // with pointers, so no need for // the full type. break; // Ignore non-ptr-to-ptr casts. case clang::CK_ArrayToPointerDecay: case clang::CK_BooleanToSignedIntegral: case clang::CK_FixedPointCast: case clang::CK_FixedPointToBoolean: case clang::CK_FloatingCast: case clang::CK_FloatingComplexCast: case clang::CK_FloatingComplexToBoolean: case clang::CK_FloatingComplexToIntegralComplex: case clang::CK_FloatingComplexToReal: case clang::CK_FloatingRealToComplex: case clang::CK_FloatingToBoolean: case clang::CK_FloatingToIntegral: case clang::CK_FunctionToPointerDecay: case clang::CK_IntegralCast: case clang::CK_IntegralComplexCast: case clang::CK_IntegralComplexToBoolean: case clang::CK_IntegralComplexToFloatingComplex: case clang::CK_IntegralComplexToReal: case clang::CK_IntegralRealToComplex: case clang::CK_IntegralToBoolean: case clang::CK_IntegralToFloating: case clang::CK_IntegralToPointer: case clang::CK_MemberPointerToBoolean: case clang::CK_NullToMemberPointer: case clang::CK_NullToPointer: case clang::CK_PointerToBoolean: case clang::CK_PointerToIntegral: case clang::CK_ToUnion: case clang::CK_ToVoid: break; case clang::CK_AnyPointerToBlockPointerCast: case clang::CK_ARCConsumeObject: case clang::CK_ARCExtendBlockObject: case clang::CK_ARCProduceObject: case clang::CK_ARCReclaimReturnedObject: case clang::CK_BlockPointerToObjCPointerCast: case clang::CK_CopyAndAutoreleaseBlockObject: case clang::CK_CPointerToObjCPointerCast: case clang::CK_ObjCObjectLValueCast: case clang::CK_VectorSplat: CHECK_UNREACHABLE_( "TODO(csilvers): for objc and clang lang extensions"); break; // Kinds for reinterpret_cast and const_cast, which need no full types. case clang::CK_BitCast: // used for reinterpret_cast case clang::CK_LValueBitCast: // used for reinterpret_cast case clang::CK_NoOp: // used for const_cast, etc break; // Need the full to-type so we can call its constructor. case clang::CK_ConstructorConversion: // 'Autocast' -- calling a one-arg, non-explicit constructor // -- is a special case when it's done for a function call. // iwyu requires the function-writer to provide the #include // for the casted-to type, just so we don't have to require it // here. *However*, the function-author can override this // iwyu requirement, in which case we're responsible for the // casted-to type. See IwyuBaseASTVisitor::VisitFunctionDecl. if (!current_ast_node()->template HasAncestorOfType() || ContainsKey( GetCallerResponsibleTypesForAutocast(current_ast_node()), RemovePointersAndReferences(to_type))) { required_full_types.push_back(to_type); } break; // Need the full from-type so we can call its 'operator ()'. case clang::CK_UserDefinedConversion: required_full_types.push_back(from_type); break; // Kinds that cast up or down an inheritance hierarchy. case clang::CK_BaseToDerived: case clang::CK_BaseToDerivedMemberPointer: // Just 'to' type is enough: full type for derived gets base type too. required_full_types.push_back(to_type); break; case clang::CK_DerivedToBase: case clang::CK_UncheckedDerivedToBase: case clang::CK_DerivedToBaseMemberPointer: // Just 'from' type is enough: full type for derived gets base type too. required_full_types.push_back(from_type); // If this derived-to-base cast had an associated conversion function, // it's a user-defined conversion operator. The from-type in this cast // is not necessarily related to the base type, but the converted // from-type must be, so make sure we require both. if (converted_from_type) { required_full_types.push_back(converted_from_type); } break; case clang::CK_Dynamic: // Usually dynamic casting is a base-to-derived cast, but it is // possible to dynamic-cast between siblings, in which case we // need both types. required_full_types.push_back(from_type); required_full_types.push_back(to_type); break; } // TODO(csilvers): test if we correctly say we use FooPtr for // typedef Foo* FooPtr; ... static_cast(...) ... for (const Type* type : required_full_types) { const Type* deref_type = RemovePointersAndReferences(type); if (CanIgnoreType(deref_type)) continue; ReportTypeUse(CurrentLoc(), deref_type); } return true; } // Mark that we need the full type info for our base type -- the // thing we're a member of -- and it's not just forward-declarable. // For instance, for code 'Mytype* myvar; myvar->a;', we'll get a // MemberExpr callback whose base has the type of myvar. bool VisitMemberExpr(clang::MemberExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; const Expr* base_expr = expr->getBase()->IgnoreParenImpCasts(); const Type* base_type = GetTypeOf(base_expr); CHECK_(base_type && "Member's base does not have a type?"); const Type* deref_base_type // For myvar->a, base-type will have a * = expr->isArrow() ? RemovePointerFromType(base_type) : base_type; if (CanIgnoreType(base_type) && CanIgnoreType(deref_base_type)) return true; if (const TypedefType* typedef_type = DynCastFrom(deref_base_type)) { deref_base_type = DesugarDependentTypedef(typedef_type); } // Technically, we should say the type is being used at the // location of base_expr. That may be a different file than us in // cases like MACRO.b(). However, while one can imagine // situations where the base-type is the responsibility of the // macro-author ('SOME_GLOBAL_OBJECT.a()'), the more common case // is it's our responsibility ('CHECK_NOTNULL(x).a()'). Until we // can better distinguish whether a macro body is an expression // that's responsible for its type or not, we just assume it is. // TODO(csilvers): fix when we can determine what the macro-text // is responsible for and what we're responsible for. // TODO(csilvers): we should be reporting a fwd-decl use for // GetTypeOf(expr), not on deref_base_type. ReportTypeUse(CurrentLoc(), deref_base_type); return true; } // For a[4], report that we need the full type of *a (to get its // size; otherwise the compiler can't tell the address of a[4]). bool VisitArraySubscriptExpr(clang::ArraySubscriptExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; const Type* element_type = GetTypeOf(expr); if (CanIgnoreType(element_type)) return true; ReportTypeUse(CurrentLoc(), element_type); return true; } // If a binary operator expression results in pointer arithmetic, we need the // full types of all pointers involved. bool VisitBinaryOperator(clang::BinaryOperator* expr) { if (CanIgnoreCurrentASTNode()) return true; // If it's not +, +=, - or -=, this can't be pointer arithmetic clang::BinaryOperator::Opcode op = expr->getOpcode(); if (op != clang::BO_Add && op != clang::BO_Sub && op != clang::BO_AddAssign && op != clang::BO_SubAssign) return true; for (const Stmt* child : expr->children()) { if (const PointerType* pointer_type = dyn_cast(GetTypeOf(cast(child)))) { // It's a pointer-typed expression. Get the pointed-to type (which may // itself be a pointer) and report it. const Type* deref_type = pointer_type->getPointeeType().getTypePtr(); if (!CanIgnoreType(deref_type)) ReportTypeUse(CurrentLoc(), deref_type); } } return true; } // Mark that we need the full type info for the thing we're taking // sizeof of. Sometimes this is double-counting: for // sizeof(some_type), RecursiveASTVisitor will visit some_type and // say it needs the full type information there, and for // sizeof(some_var), we'll report we need full type information when // some_var is defined. But if the arg is a reference, nobody else // will say we need full type info but us. bool VisitUnaryExprOrTypeTraitExpr(clang::UnaryExprOrTypeTraitExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; // Calling sizeof on a reference-to-X is the same as calling it on X. // If sizeof() takes a type, this is easy to check. If sizeof() // takes an expr, it's hard to tell -- GetTypeOf(expr) 'sees through' // references. Luckily, we want to see through references, so we // just use the GetTypeOf(). if (expr->isArgumentType()) { const TypeLoc& arg_tl = expr->getArgumentTypeInfo()->getTypeLoc(); if (const ReferenceType* reftype = DynCastFrom(arg_tl.getTypePtr())) { const Type* dereftype = reftype->getPointeeTypeAsWritten().getTypePtr(); if (!CanIgnoreType(reftype) || !CanIgnoreType(dereftype)) ReportTypeUse(GetLocation(&arg_tl), dereftype); } else { // No need to report on non-ref types, RecursiveASTVisitor will get 'em. } } else { const Expr* arg_expr = expr->getArgumentExpr(); const Type* dereftype = arg_expr->getType().getTypePtr(); if (!CanIgnoreType(dereftype)) // This reports even if the expr ends up not being a reference, but // that's ok (if potentially redundant). ReportTypeUse(GetLocation(arg_expr->IgnoreParenImpCasts()), dereftype); } return true; } // We want to mark use of the base type For 'free function' operator // overloads ('ostream& operator<<(ostream& o, int x)') just like we // do for member functions ('ostream& ostream::operator<<(int x)') // -- for iwyu purposes, 'x << 4' is just semantic sugar around // x.operator<<(4). bool VisitCXXOperatorCallExpr(clang::CXXOperatorCallExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; if (const Expr* owner_expr = GetFirstClassArgument(expr)) { const Type* owner_type = GetTypeOf(owner_expr); // Note we report the type use is the location of owner_expr // (the 'a' in 'a << b' or the 'MACRO' in 'MACRO << b'), rather // than our location (which is the '<<'). That way, we properly // situate the owner when it's a macro. if (!CanIgnoreType(owner_type)) ReportTypeUse(GetLocation(owner_expr), owner_type); } return true; } // We have to check the type being deleted is fully defined (the // language doesn't require it, but bad things happen if it's not: // the destructor isn't run). bool VisitCXXDeleteExpr(clang::CXXDeleteExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; const Expr* delete_arg = expr->getArgument()->IgnoreParenImpCasts(); // We always delete a pointer, so do one dereference to get the // actual type being deleted. const Type* delete_ptr_type = GetTypeOf(delete_arg); const Type* delete_type = RemovePointerFromType(delete_ptr_type); if (CanIgnoreType(delete_ptr_type) && CanIgnoreType(delete_type)) return true; if (delete_type && !IsPointerOrReferenceAsWritten(delete_type)) ReportTypeUse(CurrentLoc(), delete_type); return true; } // Handle the case of passing references to variadic functions // (those with '...'). We need the full type information for the // reference in that case, since compilers seem to just deref the // var before passing it in. Note we subclass all the // function-calling methods rather than HandleFunctionCall, because // a) we need type-specific caller information anyway, and b) // HandleFunctionCall isn't called for calls via function-pointers, // which we want. void ReportIfReferenceVararg(const Expr* const* args, unsigned num_args, const FunctionProtoType* callee_type) { if (callee_type && callee_type->isVariadic()) { const unsigned first_vararg_index = callee_type->getNumParams(); for (unsigned i = first_vararg_index; i < num_args; i++) { // We only care about reporting for references, but it's ok if // we catch a few non-ref types too (it's just redundant). // All expressions that are references will have their // valuekind be an LValue, so we use that as the test. if (args[i]->getValueKind() == clang::VK_LValue) { // The types of expressions 'see through' the reference to // the underlying type, which is exactly what we want here. ReportTypeUse(CurrentLoc(), GetTypeOf(args[i])); } } } } void ReportIfReferenceVararg(const Expr* const* args, unsigned num_args, const FunctionDecl* callee) { if (callee) { const FunctionProtoType* callee_type = DynCastFrom(callee->getType().getTypePtr()); CHECK_(callee_type && "The type of a FunctionDecl must be a FunctionProtoType."); ReportIfReferenceVararg(args, num_args, callee_type); } } // We only need visitors for CallExpr, ConstructExpr, and NewExpr // (which also captures their subclasses). We can ignore DeleteExpr // since destructors never have arguments. NewExpr we treat below, // since it requires other checks as well. bool VisitCallExpr(clang::CallExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; // Nothing to do if the called function is an old K&R-style function. const FunctionType* fn_type = GetCalleeFunctionType(expr); if (const FunctionProtoType* fn_proto = DynCastFrom(fn_type)) ReportIfReferenceVararg(expr->getArgs(), expr->getNumArgs(), fn_proto); return true; } bool VisitCXXConstructExpr(clang::CXXConstructExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; ReportIfReferenceVararg(expr->getArgs(), expr->getNumArgs(), expr->getConstructor()); return true; } // An OverloadExpr is an overloaded function (or method) in an // uninstantiated template, that can't be resolved until the // template is instantiated. The simplest case is something like: // void Foo(int) { ... } // void Foo(float) { ... } // template Fn(T t) { Foo(t); } // But by far the most common case is when the function-to-be-called // is also a templated function: // template Fn1(T t) { ... } // template Fn2(T t) { Fn1(t); } // In either case, we look at all the potential overloads. If they // all exist in the same file -- which is pretty much always the // case, especially with a template calling a template -- we can do // an iwyu warning now, even without knowing the exact overload. // In that case, we store the fact we warned, so we won't warn again // when the template is instantiated. // TODO(csilvers): to be really correct, we should report *every* // overload that callers couldn't match via ADL. bool VisitOverloadExpr(clang::OverloadExpr* expr) { // No CanIgnoreCurrentASTNode() check here! It's later in the function. // Make sure all overloads are in the same file. if (expr->decls_begin() == expr->decls_end()) // not sure this is possible return true; const NamedDecl* first_decl = *expr->decls_begin(); const FileEntry* first_decl_file_entry = GetFileEntry(first_decl); for (OverloadExpr::decls_iterator it = expr->decls_begin(); it != expr->decls_end(); ++it) { if (GetFileEntry(*it) != first_decl_file_entry) return true; } // For now, we're only worried about function calls. // TODO(csilvers): are there other kinds of overloads we need to check? const FunctionDecl* arbitrary_fn_decl = nullptr; for (OverloadExpr::decls_iterator it = expr->decls_begin(); it != expr->decls_end(); ++it) { const NamedDecl* decl = *it; // Sometimes a UsingShadowDecl comes between us and the 'real' decl. if (const UsingShadowDecl* using_shadow_decl = DynCastFrom(decl)) decl = using_shadow_decl->getTargetDecl(); if (const FunctionDecl* fn_decl = DynCastFrom(decl)) { arbitrary_fn_decl = fn_decl; break; } else if (const FunctionTemplateDecl* tpl_decl = DynCastFrom(decl)) { arbitrary_fn_decl = tpl_decl->getTemplatedDecl(); break; } } // If we're an overloaded operator, we can never do the iwyu check // before instantiation-time, because we don't know if we might // end up being the built-in form of the operator. (Even if the // only operator==() we see is in foo.h, we don't need to #include // foo.h if the only call to operator== we see is on two integers.) if (arbitrary_fn_decl && !arbitrary_fn_decl->isOverloadedOperator()) { AddProcessedOverloadLoc(CurrentLoc()); VERRS(7) << "Adding to processed_overload_locs: " << PrintableCurrentLoc() << "\n"; // Because processed_overload_locs might be set in one visitor // but used in another, each with a different definition of // CanIgnoreCurrentASTNode(), we have to be conservative and set // the has-considered flag always. But of course we only // actually report the function use if CanIgnoreCurrentASTNode() // is *currently* false. if (!CanIgnoreCurrentASTNode()) ReportDeclUse(CurrentLoc(), arbitrary_fn_decl); } return true; } // TODO(csilvers): handle some special cases when we're a // CXXDependentScopeMemberExpr (e.g. vector::resize().). If the // base class is a TemplateSpecializationType, get its TemplateDecl // and if all explicit specializations and patterns are defined in // the same file, treat it as an expr with only one decl. May have // trouble with methods defined in a different file than they're // declared. // If getOperatorNew() returns nullptr, it means the operator-new is // overloaded, and technically we can't know which operator-new is // being called until the template is instantiated. But if it looks // like a placement-new, we handle it at template-writing time // anyway. bool VisitCXXNewExpr(clang::CXXNewExpr* expr) { // Like in VisitOverloadExpr(), we update processed_overload_locs // regardless of the value of CanIgnoreCurrentASTNode(). // We say it's placement-new if the (lone) placment-arg is a // pointer. Unfortunately, often clang will just say it's a // dependent type. In that case, we can still say it's a pointer // in the (common) case the placement arg looks like '&something'. // (This is possibly wrong for classes that override operator&, but // those classes deserve what they get.) if (!expr->getOperatorNew() && expr->getNumPlacementArgs() == 1 && (GetTypeOf(expr->getPlacementArg(0))->isPointerType() || GetTypeOf(expr->getPlacementArg(0))->isArrayType() || IsAddressOf(expr->getPlacementArg(0)))) { // Treat this like an OverloadExpr. AddProcessedOverloadLoc(CurrentLoc()); VERRS(7) << "Adding to processed_overload_locs (placement-new): " << PrintableCurrentLoc() << "\n"; if (!CanIgnoreCurrentASTNode()) { // We have to 'make up' a full file path for 'new'. We'll // parse it to '' before using, so any path that does // that, and is clearly a c++ path, is fine; its exact // contents don't matter that much. const FileEntry* use_file = CurrentFileEntry(); preprocessor_info().FileInfoFor(use_file)->ReportFullSymbolUse( CurrentLoc(), "", "operator new"); } } // We also need to do a varargs check, like for other function calls. if (CanIgnoreCurrentASTNode()) return true; // ... only if this NewExpr involves a constructor call. const Expr* initializer = expr->getInitializer(); if (const CXXConstructExpr* cce = DynCastFrom(initializer)) { ReportIfReferenceVararg(cce->getArgs(), cce->getNumArgs(), cce->getConstructor()); } return true; } // When we call (or potentially call) a function, do an IWYU check // via ReportDeclUse() to make sure the definition of the function // is properly #included. bool HandleFunctionCall(FunctionDecl* callee, const Type* parent_type, const clang::Expr* calling_expr) { if (!Base::HandleFunctionCall(callee, parent_type, calling_expr)) return false; if (!callee || CanIgnoreCurrentASTNode() || CanIgnoreDecl(callee)) return true; // We may have already been checked in a previous // VisitOverloadExpr() call. Don't check again in that case. if (IsProcessedOverloadLoc(CurrentLoc())) return true; ReportDeclUse(CurrentLoc(), callee); // Usually the function-author is responsible for providing the // full type information for the return type of the function, but // in cases where it's not, we have to take responsibility. // TODO(csilvers): check the fn argument types as well. const Type* return_type = callee->getReturnType().getTypePtr(); if (ContainsKey(GetCallerResponsibleTypesForFnReturn(callee), return_type)) { ReportTypeUse(CurrentLoc(), return_type); } return true; } //------------------------------------------------------------ // Visitors of types derived from clang::Type. bool VisitType(clang::Type* type) { // In VisitFunctionDecl(), we say all children of function // declarations are forward-declarable. This is true, *except* // for the exception (throw) types. We clean that up here. // TODO(csilvers): figure out how to do these two steps in one place. const FunctionProtoType* fn_type = nullptr; if (!fn_type) { fn_type = current_ast_node()->template GetParentAs(); } if (!fn_type) { if (const FunctionDecl* fn_decl = current_ast_node()->template GetParentAs()) fn_type = dyn_cast(GetTypeOf(fn_decl)); } if (fn_type) { for (FunctionProtoType::exception_iterator it = fn_type->exception_begin(); it != fn_type->exception_end(); ++it) if (it->getTypePtr() == type) { // *we're* an exception decl current_ast_node()->set_in_forward_declare_context(false); break; } } return Base::VisitType(type); } bool VisitTemplateSpecializationType( clang::TemplateSpecializationType* type) { if (CanIgnoreCurrentASTNode() || CanIgnoreType(type)) return true; const NamedDecl* decl = TypeToDeclAsWritten(type); // If we are forward-declarable, so are our template arguments. if (CanForwardDeclareType(current_ast_node())) { ReportDeclForwardDeclareUse(CurrentLoc(), decl); current_ast_node()->set_in_forward_declare_context(true); } else { ReportDeclUse(CurrentLoc(), decl); } return true; } //------------------------------------------------------------ // Visitors defined by BaseAstVisitor. bool VisitNestedNameSpecifier(NestedNameSpecifier* nns) { if (!Base::VisitNestedNameSpecifier(nns)) return false; // If we're in an nns (e.g. the Foo in Foo::bar), we're never // forward-declarable, even if we're part of a pointer type, or in // a template argument, or whatever. ASTNode* ast_node = current_ast_node(); ast_node->set_in_forward_declare_context(false); return true; } // Template arguments are forward-declarable by default. However, // default template template args shouldn't be: we're responsible for // the full type info for default args. So no forward-declaring // MyClass in 'template class T = MyClass> C ...' // We detect because MyClass's parent is TemplateTemplateParmDecl. // TODO(csilvers): And not when they're a type that's in // known_fully_used_tpl_type_args_. See if that solves the problem with // I1_TemplateClass> i1_nested_templateclass(...) void DetermineForwardDeclareStatusForTemplateArg(ASTNode* ast_node) { CHECK_(ast_node->IsA() && "Should only pass in a template arg to DFDSFTA"); if (!IsDefaultTemplateTemplateArg(ast_node)) { ast_node->set_in_forward_declare_context(true); return; } } bool VisitTemplateArgument(const TemplateArgument& arg) { if (!Base::VisitTemplateArgument(arg)) return false; // Template arguments are forward-declarable...usually. DetermineForwardDeclareStatusForTemplateArg(current_ast_node()); return true; } bool VisitTemplateArgumentLoc(const TemplateArgumentLoc& argloc) { if (!Base::VisitTemplateArgumentLoc(argloc)) return false; // Template arguments are forward-declarable...usually. DetermineForwardDeclareStatusForTemplateArg(current_ast_node()); return true; } //------------------------------------------------------------ // Helper routines for visiting and traversing. These helpers // encode the logic of whether a particular type of object // can be forward-declared or not. // TODO(csilvers): get rid of in_forward_declare_context() and make // this the canonical place to figure out if we can forward-declare. bool CanForwardDeclareType(const ASTNode* ast_node) const { CHECK_(ast_node->IsA()); // Cannot forward-declare an enum even if it's in a forward-declare context. // TODO(vsapsai): make enums forward-declarable in C++11. if (ast_node->IsA()) return false; // If we're in a forward-declare context, well then, there you have it. if (ast_node->in_forward_declare_context()) return true; // If we're in a typedef, we don't want to forward-declare even if // we're a pointer. ('typedef Foo* Bar; Bar x; x->a' needs full // type of Foo.) if (ast_node->ParentIsA()) return false; // If we ourselves are a forward-decl -- that is, we're the type // component of a forward-declaration (which would be our parent // AST node) -- then we're forward-declarable by definition. if (const TagDecl* parent = current_ast_node()->template GetParentAs()) { if (IsForwardDecl(parent)) return true; } // Another place we disregard what the language allows: if we're // a dependent type, in theory we can be forward-declared. But // we require the full definition anyway, so all the template // callers don't have to provide it instead. Thus we don't // run the following commented-out code (left here for reference): //if (ast_node->GetAs()->isDependentType()) // return false; // Read past elaborations like 'class' keyword or namespaces. while (ast_node->ParentIsA()) { ast_node = ast_node->parent(); } // Now there are two options: either we have a type or we have a declaration // involving a type. const Type* parent_type = ast_node->GetParentAs(); if (parent_type == nullptr) { // Since it's not a type, it must be a decl. // Our target here is record members, all of which derive from ValueDecl. if (const ValueDecl *decl = ast_node->GetParentAs()) { // We can shortcircuit static data member declarations immediately, // they can always be forward-declared. if (const VarDecl *var_decl = DynCastFrom(decl)) { if (!var_decl->isThisDeclarationADefinition() && var_decl->isStaticDataMember()) { return true; } } parent_type = GetTypeOf(decl); } } // TODO(csilvers): should probably just be IsPointerOrReference return parent_type && IsPointerOrReferenceAsWritten(parent_type); } protected: const IwyuPreprocessorInfo& preprocessor_info() const { return visitor_state_->preprocessor_info; } void AddShadowDeclarations(const UsingDecl* using_decl) { for (const UsingShadowDecl* shadow : using_decl->shadows()) { visitor_state_->using_declarations.insert( make_pair(shadow->getTargetDecl(), shadow->getUsingDecl())); } } private: template friend class IwyuBaseAstVisitor; bool IsProcessedOverloadLoc(SourceLocation loc) const { return ContainsKey(visitor_state_->processed_overload_locs, loc); } void AddProcessedOverloadLoc(SourceLocation loc) { visitor_state_->processed_overload_locs.insert(loc); } const UsingDecl* GetUsingDeclarationOf(const NamedDecl* decl, const DeclContext* use_context) { // First, if we have a UsingShadowDecl, then we don't need to do anything // because we can just directly return the using decl from that. if (const UsingShadowDecl* shadow = DynCastFrom(decl)) return shadow->getUsingDecl(); // But, if we don't have a UsingShadowDecl, then we need to look through // all the using-decls of the given decl. We limit them to ones that are // visible from the decl-context we're currently in (that is, what // namespaces we're in), via the check through 'Encloses'. Of those, we // pick the one that's in the same file as decl, if possible, otherwise we // pick one arbitrarily. const UsingDecl* retval = nullptr; vector using_decls = FindInMultiMap(visitor_state_->using_declarations, decl); for (const UsingDecl* using_decl : using_decls) { if (!using_decl->getDeclContext()->Encloses(use_context)) continue; if (GetFileEntry(decl) == GetFileEntry(using_decl) || // prefer same file retval == nullptr) { // not in same file, but better than nothing retval = using_decl; } } return retval; } // Do not add any variables here! If you do, they will not be shared // between the normal iwyu ast visitor and the // template-instantiation visitor, which is almost always a mistake. // Instead, add them to the VisitorState struct, above. VisitorState* const visitor_state_; }; // ---------------------------------------------------------------------- // --- InstantiatedTemplateVisitor // ---------------------------------------------------------------------- // // This class is used to find all template-specified types used in an // instantiated template class, function, or method -- or rather, all // such types that are used in a way that can't be forward-declared. // That is, for // template int Myfunc() { T* t; U u; Thirdclass z; } // if we saw an instantiation such as myfunc, we would pass // that instantiation to this traversal class, and it would report // that Bar is used in a non-forward-declarable way. (It would not // report Foo, which is used only in a forward-declarable way, and // would not report Thirdclass, which is not a type specified in a // template.) // // This class has two main entry points: one for instantiated // template functions and methods (including static methods, // constructor calls, and operator overloads), and one for // instantiated template classes. // // In each case, it is given the appropriate node from the AST that // captures the instantiation (a TemplateSpecializationType or // CallExpr), and returns a set of Type* nodes of types that are used // in a non-forward-declarable way. Note it's safe to call this even // on non-templatized functions and classes; we'll just always return // the empty set in that case. // // The traversal of the AST is done via RecursiveASTVisitor, which uses // CRTP (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) // TODO(csilvers): move this to its own file? class InstantiatedTemplateVisitor : public IwyuBaseAstVisitor { public: typedef IwyuBaseAstVisitor Base; InstantiatedTemplateVisitor(VisitorState* visitor_state) : Base(visitor_state) { Clear(); } //------------------------------------------------------------ // Public entry points // ScanInstantiatedFunction() looks through the template definition of // the given function as well as the definitions of all functions // called from it (directly or indirectly) and records all template // type arguments fully used by them and all methods used by them. // The "fully used type arguments" are a subset of // tpl_type_args_of_interest, which are the types we care about, and // usually explicitly written at the call site. // // ScanInstantiatedType() is similar, except that it looks through // the definition of a class template instead of a statement. // resugar_map is a map from an unsugared (canonicalized) template // type to the template type as written (or as close as we can find // to it). If a type is not in resugar-map, it might be due to a // recursive template call and encode a template type we don't care // about ourselves. If it's in the resugar_map but with a nullptr // value, it's a default template parameter, that the // template-caller may or may not be responsible for. void ScanInstantiatedFunction( const FunctionDecl* fn_decl, const Type* parent_type, const ASTNode* caller_ast_node, const map& resugar_map) { Clear(); caller_ast_node_ = caller_ast_node; resugar_map_ = resugar_map; // Make sure that the caller didn't already put the decl on the ast-stack. CHECK_(caller_ast_node->GetAs() != fn_decl && "AST node already set"); // caller_ast_node requires a non-const ASTNode, but our node is // const. This cast is safe because we don't do anything with this // node (instead, we immediately push a new node on top of it). set_current_ast_node(const_cast(caller_ast_node)); TraverseExpandedTemplateFunctionHelper(fn_decl, parent_type); } // This isn't a Stmt, but sometimes we need to fully instantiate // a template class to get at a field of it, for instance: // MyClass::size_type s; void ScanInstantiatedType(ASTNode* caller_ast_node, const map& resugar_map) { Clear(); caller_ast_node_ = caller_ast_node; resugar_map_ = resugar_map; // The caller node *is* the current node, unlike ScanInstantiatedFunction // which instead starts in the context of the parent expression and relies // on a TraverseDecl call to push the decl to the top of the AST stack. set_current_ast_node(caller_ast_node); const TemplateSpecializationType* type = caller_ast_node->GetAs(); CHECK_(type != nullptr && "Not a template specialization"); // As in TraverseExpandedTemplateFunctionHelper, we ignore all AST nodes // that will be reported when we traverse the uninstantiated type. if (const NamedDecl* type_decl_as_written = GetDefinitionAsWritten(TypeToDeclAsWritten(type))) { AstFlattenerVisitor nodeset_getter(compiler()); nodes_to_ignore_ = nodeset_getter.GetNodesBelow( const_cast(type_decl_as_written)); } TraverseTemplateSpecializationType( const_cast(type)); } //------------------------------------------------------------ // Implements virtual methods from Base. // When checking a template instantiation, we don't care where the // template definition is, so we never have any reason to ignore a // node. bool CanIgnoreCurrentASTNode() const override { // TODO(csilvers): call CanIgnoreType() if we're a type. return nodes_to_ignore_.Contains(*current_ast_node()); } // For template instantiations, we want to print the symbol even if // it's not from the main compilation unit. bool ShouldPrintSymbolFromCurrentFile() const override { return GlobalFlags().verbose >= 5; } string GetSymbolAnnotation() const override { return " in tpl"; } bool CanIgnoreType(const Type* type) const override { if (!IsTypeInteresting(type) || !IsKnownTemplateParam(type)) return true; // If we're a default template argument, we should ignore the type // if the template author intend-to-provide it, but otherwise we // should not ignore it -- the caller is responsible for the type. // This captures cases like hash_set, where the caller is // responsible for defining hash. // IsProvidedByTemplate handles the case we // have a templated class that #includes "foo.h" and has a // scoped_ptr: we say the templated class provides Foo, even // though it's scoped_ptr.h that's actually trying to call // Foo::Foo and ::~Foo. // TODO(csilvers): this isn't ideal: ideally we'd want // 'TheInstantiatedTemplateForWhichTypeWasADefaultTemplateArgumentIntendsToProvide', // but clang doesn't store that information. return IsDefaultTemplateParameter(type) && IsProvidedByTemplate(type); } bool IsTypeInteresting(const Type* type) const { // We only care about types that would have been dependent in the // uninstantiated template: that is, SubstTemplateTypeParmType types // or types derived from them. We use nodes_to_ignore_ to select down // to those. return !nodes_to_ignore_.Contains(type); } bool IsKnownTemplateParam(const Type* type) const { // Among all subst-type params, we only want those in the resugar-map. If // we're not in the resugar-map at all, we're not a type corresponding to // the template being instantiated, so we can be ignored. type = RemoveSubstTemplateTypeParm(type); return ContainsKey(resugar_map_, type); } // We ignore function calls in nodes_to_ignore_, which were already // handled by the template-as-written, and function names that we // are not responsible for because the template code is (for // instance, we're not responsible for a vector's call to // allocator::allocator(), because provides it for us). bool CanIgnoreDecl(const Decl* decl) const override { return nodes_to_ignore_.Contains(decl); } // We always attribute type uses to the template instantiator. For // decls, we do unless it looks like the template "intends to // provide" the decl, by #including the file that defines the decl // (if templates call other templates, we have to find the right // template). void ReportDeclUse(SourceLocation used_loc, const NamedDecl* decl, const char* comment = nullptr, UseFlags extra_use_flags = 0) override { const SourceLocation actual_used_loc = GetLocOfTemplateThatProvides(decl); if (actual_used_loc.isValid()) { // If a template is responsible for this decl, then we don't add // it to the cache; the cache is only for decls that the // original caller is responsible for. Base::ReportDeclUse(actual_used_loc, decl, comment, extra_use_flags); } else { // Let all the currently active types and decls know about this // report, so they can update their cache entries. for (CacheStoringScope* storer : cache_storers_) storer->NoteReportedDecl(decl); Base::ReportDeclUse(caller_loc(), decl, comment, extra_use_flags); } } void ReportTypeUse(SourceLocation used_loc, const Type* type, const char* comment = nullptr) override { // clang desugars template types, so Foo() gets turned // into Foo(). Try to convert back. type = ResugarType(type); for (CacheStoringScope* storer : cache_storers_) storer->NoteReportedType(type); Base::ReportTypeUse(caller_loc(), type, comment); } //------------------------------------------------------------ // Overridden traverse-style methods from Base. // The 'convenience' HandleFunctionCall is perfect for us! bool HandleFunctionCall(FunctionDecl* callee, const Type* parent_type, const clang::Expr* calling_expr) { if (const Type* resugared_type = ResugarType(parent_type)) parent_type = resugared_type; if (!Base::HandleFunctionCall(callee, parent_type, calling_expr)) return false; if (!callee || CanIgnoreCurrentASTNode() || CanIgnoreDecl(callee)) return true; return TraverseExpandedTemplateFunctionHelper(callee, parent_type); } bool TraverseUnaryExprOrTypeTraitExpr(clang::UnaryExprOrTypeTraitExpr* expr) { if (!Base::TraverseUnaryExprOrTypeTraitExpr(expr)) return false; if (CanIgnoreCurrentASTNode()) return true; const Type* arg_type = expr->getTypeOfArgument().getTypePtr(); // Calling sizeof on a reference-to-X is the same as calling it on X. if (const ReferenceType* reftype = DynCastFrom(arg_type)) { arg_type = reftype->getPointeeTypeAsWritten().getTypePtr(); } if (const TemplateSpecializationType* type = DynCastFrom(arg_type)) { // Even though sizeof(MyClass) only requires knowing how much // storage MyClass takes, the language seems to require that // MyClass be fully instantiated, even typedefs. (Try // compiling 'template struct C { typedef typename T::a t; }; // class S; int main() { return sizeof(C); }'.) return TraverseDataAndTypeMembersOfClassHelper(type); } return true; } bool TraverseTemplateSpecializationTypeHelper( const clang::TemplateSpecializationType* type) { if (CanIgnoreCurrentASTNode()) return true; // Skip the template traversal if this occurrence of the template name is // just a class qualifier for an out of line method, as opposed to an object // instantiation, where the templated code would need to be inspected. // // Class::method() { // |-Type---^ // |-NNS------^ // |-CXXMethodDecl--^ ASTNode* ast_node = current_ast_node(); if (const auto* nns = ast_node->GetParentAs()) { if (nns->getAsType() == type) { if (const auto* method = ast_node->GetAncestorAs(2)) { CHECK_(nns == method->getQualifier()); return true; } } } if (CanForwardDeclareType(ast_node)) ast_node->set_in_forward_declare_context(true); return TraverseDataAndTypeMembersOfClassHelper(type); } bool TraverseTemplateSpecializationType( clang::TemplateSpecializationType* type) { if (!Base::TraverseTemplateSpecializationType(type)) return false; return TraverseTemplateSpecializationTypeHelper(type); } bool TraverseTemplateSpecializationTypeLoc( clang::TemplateSpecializationTypeLoc typeloc) { if (!Base::TraverseTemplateSpecializationTypeLoc(typeloc)) return false; return TraverseTemplateSpecializationTypeHelper(typeloc.getTypePtr()); } bool TraverseSubstTemplateTypeParmTypeHelper( const clang::SubstTemplateTypeParmType* type) { if (CanIgnoreCurrentASTNode() || CanIgnoreType(type)) return true; const Type* actual_type = ResugarType(type); CHECK_(actual_type && "If !CanIgnoreType(), we should be resugar-able"); return TraverseType(QualType(actual_type, 0)); } // When we see a template argument used inside an instantiated // template, we want to explore the type recursively. For instance // if we see Inner>(), we want to recurse onto Foo. bool TraverseSubstTemplateTypeParmType( clang::SubstTemplateTypeParmType* type) { if (!Base::TraverseSubstTemplateTypeParmType(type)) return false; return TraverseSubstTemplateTypeParmTypeHelper(type); } bool TraverseSubstTemplateTypeParmTypeLoc( clang::SubstTemplateTypeParmTypeLoc typeloc) { if (!Base::TraverseSubstTemplateTypeParmTypeLoc(typeloc)) return false; return TraverseSubstTemplateTypeParmTypeHelper(typeloc.getTypePtr()); } // These do the actual work of finding the types to return. Our // task is made easier since (at least in theory), every time we // instantiate a template type, the instantiation has type // SubstTemplateTypeParmTypeLoc in the AST tree. bool VisitSubstTemplateTypeParmType(clang::SubstTemplateTypeParmType* type) { if (CanIgnoreCurrentASTNode() || CanIgnoreType(type)) return true; // Figure out how this type was actually written. clang always // canonicalizes SubstTemplateTypeParmType, losing typedef info, etc. const Type* actual_type = ResugarType(type); CHECK_(actual_type && "If !CanIgnoreType(), we should be resugar-able"); // TODO(csilvers): whenever we report a type use here, we want to // do an iwyu check on this type (to see if sub-types are used). // If we're a nested-name-specifier class (the Foo in Foo::bar), // we need our full type info no matter what the context (even if // we're a pointer, or a template arg, or whatever). // TODO(csilvers): consider encoding this logic via // in_forward_declare_context. I think this will require changing // in_forward_declare_context to yes/no/maybe. if (current_ast_node()->ParentIsA()) { ReportTypeUse(CurrentLoc(), actual_type); return Base::VisitSubstTemplateTypeParmType(type); } // If we're inside a typedef, we don't need our full type info -- // in this case we follow what the C++ language allows and let // the underlying type of a typedef be forward-declared. This has // the effect that code like: // class MyClass; // template struct Foo { typedef T value_type; ... } // Foo f; // does not make us require the full type of MyClass. The idea // is that using Foo::value_type already requires the // type for MyClass, so it doesn't make sense for the typedef // to require it as well. TODO(csilvers): this doesn't really // make any sense. Who figures out we need the full type if // you do 'Foo::value_type m;'? for (const ASTNode* ast_node = current_ast_node(); ast_node != caller_ast_node_; ast_node = ast_node->parent()) { if (ast_node->IsA()) return Base::VisitSubstTemplateTypeParmType(type); } // sizeof(a reference type) is the same as sizeof(underlying type). // We have to handle that specially here, or else we'll say the // reference is forward-declarable, below. if (current_ast_node()->ParentIsA() && isa(actual_type)) { const ReferenceType* actual_reftype = cast(actual_type); ReportTypeUse(CurrentLoc(), actual_reftype->getPointeeTypeAsWritten().getTypePtr()); return Base::VisitSubstTemplateTypeParmType(type); } // If we're used in a forward-declare context (MyFunc() { T* t; }), // or are ourselves a pointer type (MyFunc()), // we don't need to do anything: we're fine being forward-declared. if (current_ast_node()->in_forward_declare_context()) return Base::VisitSubstTemplateTypeParmType(type); if (current_ast_node()->ParentIsA() || current_ast_node()->ParentIsA() || IsPointerOrReferenceAsWritten(actual_type)) return Base::VisitSubstTemplateTypeParmType(type); // We attribute all uses in an instantiated template to the // template's caller. ReportTypeUse(caller_loc(), actual_type); // Also report all previous explicit instantiations (declarations and // definitions) as uses of the caller's location. ReportExplicitInstantiations(actual_type); return Base::VisitSubstTemplateTypeParmType(type); } bool VisitTemplateSpecializationType(TemplateSpecializationType* type) { if (CanIgnoreCurrentASTNode()) return true; CHECK_(current_ast_node()->GetAs() == type) << "The current node must be equal to the template spec. type"; // Report previous explicit instantiations here, only if the type is needed // fully. if (!CanForwardDeclareType(current_ast_node())) ReportExplicitInstantiations(type); return Base::VisitTemplateSpecializationType(type); } void ReportExplicitInstantiations(const Type* type) { const auto* decl = dyn_cast_or_null( TypeToDeclAsWritten(type)); if (decl == nullptr) return; // Go through all previous redecls and filter out those that are not // explicit template instantiations or already provided by the template. for (const NamedDecl* redecl : decl->redecls()) { if (!IsExplicitInstantiation(redecl) || !GlobalSourceManager()->isBeforeInTranslationUnit( redecl->getLocation(), caller_loc()) || IsProvidedByTemplate(decl)) continue; // Report the specific decl that points to the explicit instantiation Base::ReportDeclUse(caller_loc(), redecl, "(for explicit instantiation)", UF_ExplicitInstantiation); } } // If constructing an object, check the type we're constructing. // Normally we'd see that type later, when traversing the return // type of the constructor-decl, but if we wait for that, we'll lose // any SubstTemplateTypeParmType's we have (we lose all // SubstTemplateTypeParmType's going from Expr to Decl). // TODO(csilvers): This should maybe move to HandleFunctionCall. bool VisitCXXConstructExpr(clang::CXXConstructExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; const Type* class_type = GetTypeOf(expr); if (CanIgnoreType(class_type)) return true; // If the ctor type is a SubstTemplateTypeParmType, get the type-as-written. const Type* actual_type = ResugarType(class_type); CHECK_(actual_type && "If !CanIgnoreType(), we should be resugar-able"); ReportTypeUse(caller_loc(), actual_type); return Base::VisitCXXConstructExpr(expr); } private: // Clears the state of the visitor. void Clear() { caller_ast_node_ = nullptr; resugar_map_.clear(); traversed_decls_.clear(); nodes_to_ignore_.clear(); cache_storers_.clear(); } // If we see the instantiated template using a type or decl (such as // std::allocator), we want to know if the author of the template is // providing the type or decl, so the code using the instantiated // template doesn't have to. For instance: // vector*/> v; // in foo.cc // Does provide the definition of allocator? If not, // foo.cc will have to #include . // We say the template-as-written does provide the decl if it, or // any other header seen since we started instantiating the // template, sees it. The latter requirement is to deal with a // situation like this: we have a templated class that #includes // "foo.h" and has a scoped_ptr; we say the templated class // provides Foo, even though it's scoped_ptr.h that's actually // trying to call Foo::Foo and Foo::~Foo. SourceLocation GetLocOfTemplateThatProvides(const NamedDecl* decl) const { if (!decl) return SourceLocation(); // an invalid source-loc for (const ASTNode* ast_node = current_ast_node(); ast_node != caller_ast_node_; ast_node = ast_node->parent()) { if (preprocessor_info().PublicHeaderIntendsToProvide( GetFileEntry(ast_node->GetLocation()), GetFileEntry(decl->getLocation()))) return ast_node->GetLocation(); } return SourceLocation(); // an invalid source-loc } bool IsProvidedByTemplate(const NamedDecl* decl) const { return GetLocOfTemplateThatProvides(decl).isValid(); } bool IsProvidedByTemplate(const Type* type) const { type = RemoveSubstTemplateTypeParm(type); type = RemovePointersAndReferences(type); // get down to the decl if (const NamedDecl* decl = TypeToDeclAsWritten(type)) { decl = GetDefinitionAsWritten(decl); return GetLocOfTemplateThatProvides(decl).isValid(); } return true; // we always provide non-decl types like int, etc. } // For a SubstTemplateTypeParmType, says whether it corresponds to a // default template parameter (one not explicitly specified when the // class was instantiated) or not. We store this in resugar_map by // having the value be nullptr. bool IsDefaultTemplateParameter(const Type* type) const { type = RemoveSubstTemplateTypeParm(type); return ContainsKeyValue(resugar_map_, type, static_cast(nullptr)); } // clang desugars template types, so Foo() gets turned // into Foo(). We can 'resugar' using resugar_map_. // If we're not in the resugar-map, then we weren't canonicalized, // so we can just use the input type unchanged. const Type* ResugarType(const Type* type) const { type = RemoveSubstTemplateTypeParm(type); // If we're the resugar-map but with a value of nullptr, it means // we're a default template arg, which means we don't have anything // to resugar to. So just return the input type. if (ContainsKeyValue(resugar_map_, type, static_cast(nullptr))) return type; return GetOrDefault(resugar_map_, type, type); } bool TraverseExpandedTemplateFunctionHelper(const FunctionDecl* fn_decl, const Type* parent_type) { if (!fn_decl || ContainsKey(traversed_decls_, fn_decl)) return true; // avoid recursion and repetition traversed_decls_.insert(fn_decl); // If we have cached the reporting done for this decl before, // report again (but with the new caller_loc this time). // Otherwise, for all reporting done in the rest of this scope, // store in the cache for this function. if (ReplayUsesFromCache(*FunctionCallsFullUseCache(), fn_decl, caller_loc())) return true; // Make sure all the types we report in the recursive TraverseDecl // calls, below, end up in the cache for fn_decl. CacheStoringScope css(&cache_storers_, FunctionCallsFullUseCache(), fn_decl, resugar_map_); // We want to ignore all nodes that are the same in this // instantiated function as they are in the uninstantiated version // of the function. The latter will be reported when we traverse // the uninstantiated function, so we don't need to re-traverse // them here. AstFlattenerVisitor nodeset_getter(compiler()); // This gets to the decl for the (uninstantiated) template-as-written: const FunctionDecl* decl_as_written = fn_decl->getTemplateInstantiationPattern(); if (!decl_as_written) { if (fn_decl->isImplicit()) { // TIP not set up for implicit methods // TODO(csilvers): handle implicit template methods } else { // not a templated decl decl_as_written = fn_decl; } } if (decl_as_written) { FunctionDecl* const daw = const_cast(decl_as_written); nodes_to_ignore_.AddAll(nodeset_getter.GetNodesBelow(daw)); } // We need to iterate over the function. We do so even if it's // an implicit function. if (fn_decl->isImplicit()) { if (!TraverseImplicitDeclHelper(const_cast(fn_decl))) return false; } else { if (!TraverseDecl(const_cast(fn_decl))) return false; } // If we're a constructor, we also need to construct the entire class, // even typedefs that aren't used at construct time. Try compiling // template struct C { typedef typename T::a t; }; // class S; int main() { C c; } if (isa(fn_decl)) { CHECK_(parent_type && "How can a constructor have no parent?"); parent_type = RemoveElaboration(parent_type); if (!TraverseDataAndTypeMembersOfClassHelper( dyn_cast(parent_type))) return false; } return true; } // Does the actual recursing over data members and type members of // the instantiated class. Unlike // TraverseClassTemplateSpecializationDecl() in the base class, it // does *not* traverse the methods. bool TraverseDataAndTypeMembersOfClassHelper( const TemplateSpecializationType* type) { if (!type) return true; // No point in doing traversal if we're forward-declared if (current_ast_node()->in_forward_declare_context()) return true; while (type->isTypeAlias()) { type = DynCastFrom(type->getAliasedType().getTypePtr()); if (!type) return true; } // If we're a dependent type, we only try to be analyzed if we're // in the precomputed list -- in general, the only thing clang // tells us about dependent types is their name (which is all we // need for the precomputed list!). This means iwyu will properly // analyze the use of SomeClass in code like 'map', // but not in 'MyMap', since we have precomputed // information about the STL map<>, but not the user type MyMap. // TODO(csilvers): do better here. if (type->isDependentType()) { // TODO(csilvers): This is currently always a noop; need to fix // GetTplTypeResugarMapForClassNoComponentTypes to do something // useful for dependent types. ReplayClassMemberUsesFromPrecomputedList(type); // best-effort return true; } const NamedDecl* named_decl = TypeToDeclAsWritten(type); const ClassTemplateSpecializationDecl* class_decl = DynCastFrom(named_decl); // Bail out if we are not a proper class if (class_decl == nullptr) { // If the template specialization decl is not sugar for a class, we // expect it to be another kind of template decl, like a built-in. CHECK_(llvm::isa(named_decl)) << "TemplateSpecializationType has no decl of type TemplateDecl?"; return true; } if (ContainsKey(traversed_decls_, class_decl)) return true; // avoid recursion & repetition traversed_decls_.insert(class_decl); // If we have cached the reporting done for this decl before, // report again (but with the new caller_loc this time). // Otherwise, for all reporting done in the rest of this scope, // store in the cache for this function. if (ReplayUsesFromCache(*ClassMembersFullUseCache(), class_decl, caller_loc())) return true; if (ReplayClassMemberUsesFromPrecomputedList(type)) return true; // Make sure all the types we report in the recursive TraverseDecl // calls, below, end up in the cache for class_decl. CacheStoringScope css(&cache_storers_, ClassMembersFullUseCache(), class_decl, resugar_map_); for (DeclContext::decl_iterator it = class_decl->decls_begin(); it != class_decl->decls_end(); ++it) { if (isa(*it) || isa(*it)) continue; if (!TraverseDecl(*it)) return false; } // Most methods on template classes are instantiated when they're // called, and we don't need to deal with them here. But virtual // methods are instantiated when the class's key method is // instantiated, and since template classes rarely have a key // method, it means they're instantiated whenever the class is // instantiated. So we need to instantiate virtual methods here. for (DeclContext::decl_iterator it = class_decl->decls_begin(); it != class_decl->decls_end(); ++it) { if (const CXXMethodDecl* method_decl = DynCastFrom(*it)) { if (method_decl->isVirtual()) { if (!TraverseExpandedTemplateFunctionHelper(method_decl, type)) return false; } } } return true; } //------------------------------------------------------------ // Cache methods. Caches hold the list of full uses found when we // last instantiated a given decl, saving a lot of tree-walking if // we have to do it again. // Returns true if we replayed uses, false if key isn't in the cache. bool ReplayUsesFromCache(const FullUseCache& cache, const NamedDecl* key, SourceLocation use_loc) { if (!cache.Contains(key, resugar_map_)) return false; VERRS(6) << "(Replaying full-use information from the cache for " << key->getQualifiedNameAsString() << ")\n"; ReportTypesUse(use_loc, cache.GetFullUseTypes(key, resugar_map_)); ReportDeclsUse(use_loc, cache.GetFullUseDecls(key, resugar_map_)); return true; } // We precompute (hard-code) results of calling // TraverseDataAndTypeMembersOfClassHelper for some types (mostly // STL types). This way we don't even need to traverse them once. // Returns true iff we did appropriate reporting for this type. bool ReplayClassMemberUsesFromPrecomputedList( const TemplateSpecializationType* tpl_type) { if (current_ast_node() && current_ast_node()->in_forward_declare_context()) return true; // never depend on any types if a fwd-decl const NamedDecl* tpl_decl = TypeToDeclAsWritten(tpl_type); // This says how the template-args are used by this hard-coded type // (a set<>, or map<>, or ...), to avoid having to recurse into them. const map& resugar_map_for_precomputed_type = FullUseCache::GetPrecomputedResugarMap(tpl_type); // But we need to reconcile that with the types-of-interest, as // stored in resugar_map_. To do this, we take only those entries // from resugar_map_for_precomputed_type that are also present in // resugar_map_. We consider type components, so if // resugar_map_for_precomputed_type has less_than or hash, // we'll add those in even if resugar_map_ only includes 'Foo'. map resugar_map; for (const auto& item : resugar_map_for_precomputed_type) { // TODO(csilvers): for default template args, item.first is sometimes // a RecordType even when it's a template specialization. Figure out // how to get the proper type components in that situation. const set type_components = GetComponentsOfType(item.first); if (ContainsAnyKey(resugar_map_, type_components)) { resugar_map.insert(item); } } if (resugar_map.empty()) return false; VERRS(6) << "(Using pre-computed list of full-use information for " << tpl_decl->getQualifiedNameAsString() << ")\n"; // For entries with a non-nullptr value, we report the value, which // is the unsugared type, as being fully used. Entries with a // nullptr value are default template args, and we only report them // if the template class doesn't intend-to-provide them. for (const auto& item : resugar_map) { const Type* resugared_type = nullptr; if (item.second) { resugared_type = item.second; } else { const NamedDecl* resugared_decl = TypeToDeclAsWritten(item.first); if (!preprocessor_info().PublicHeaderIntendsToProvide( GetFileEntry(tpl_decl), GetFileEntry(resugared_decl))) resugared_type = item.first; } if (resugared_type && !resugared_type->isPointerType()) { ReportTypeUse(caller_loc(), resugared_type); // For a templated type, check the template args as well. if (const TemplateSpecializationType* spec_type = DynCastFrom(resugared_type)) { TraverseDataAndTypeMembersOfClassHelper(spec_type); } } } return true; } //------------------------------------------------------------ // Member accessors. SourceLocation caller_loc() const { return caller_ast_node_->GetLocation(); } //------------------------------------------------------------ // Member variables. // The AST-chain when this template was instantiated. const ASTNode* caller_ast_node_; // resugar_map is a map from an unsugared (canonicalized) template // type to the template type as written (or as close as we can find // to it). If a type is not in resugar-map, it might be due to a // recursive template call and encode a template type we don't care // about ourselves. If it's in the resugar_map but with a nullptr // value, it's a default template parameter, that the // template-caller may or may not be responsible for. map resugar_map_; // Used to avoid recursion in the *Helper() methods. set traversed_decls_; AstFlattenerVisitor::NodeSet nodes_to_ignore_; // The current set of nodes we're updating cache entries for. set cache_storers_; }; // class InstantiatedTemplateVisitor // ---------------------------------------------------------------------- // --- IwyuAstConsumer // ---------------------------------------------------------------------- // // This class listens to Clang's events as the AST is generated. // // The traversal of the AST is done via RecursiveASTVisitor, which uses // CRTP (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) class IwyuAstConsumer : public ASTConsumer, public IwyuBaseAstVisitor { public: typedef IwyuBaseAstVisitor Base; IwyuAstConsumer(VisitorState* visitor_state) : Base(visitor_state), instantiated_template_visitor_(visitor_state) {} //------------------------------------------------------------ // Implements pure virtual methods from Base. // Returns true if we are not interested in symbols used in used_in // for whatever reason. For instance, we can ignore nodes that are // neither in the file we're compiling nor in its associated .h file. bool CanIgnoreCurrentASTNode() const override { // If we're outside of foo.{h,cc} and the set of check_also files, // just ignore. if (CanIgnoreLocation(current_ast_node()->GetLocation())) return true; // If we're a field of a typedef type, ignore us: our rule is that // the author of the typedef is responsible for everything // involving the typedef. if (IsMemberOfATypedef(current_ast_node())) return true; // TODO(csilvers): if we're a type, call CanIgnoreType(). return false; } // We print symbols from files in the main compilation unit (foo.cc, // foo.h, foo-inl.h) if the debug level is 5 or 6, for non-system // files if the debug level is 7, and all files if the debug level // is 8 or more. bool ShouldPrintSymbolFromCurrentFile() const override { return ShouldPrintSymbolFromFile(CurrentFileEntry()); } string GetSymbolAnnotation() const override { return ""; } // We are interested in all types for iwyu checking. bool CanIgnoreType(const Type* type) const override { return type == nullptr; } bool CanIgnoreDecl(const Decl* decl) const override { return decl == nullptr; } //------------------------------------------------------------ // Parser event handlers. Clang will call them to notify this // ASTConsumer as it parses the source code. See class ASTConsumer in // clang/AST/ASTConsumer.h // for all the handlers we can override. // Called once at the beginning of the compilation. void Initialize(ASTContext& context) override {} // NOLINT // Called once at the end of the compilation. void HandleTranslationUnit(ASTContext& context) override { // NOLINT // TODO(csilvers): automatically detect preprocessing is done, somehow. const_cast(&preprocessor_info())-> HandlePreprocessingDone(); // We run a separate pass to force parsing of late-parsed function // templates. ParseFunctionTemplates(context.getTranslationUnitDecl()); TraverseDecl(context.getTranslationUnitDecl()); // Check if any unrecoverable errors have occurred. // There is no point in continuing when the AST is in a bad state. // // EXIT_INVALIDARGS is not a great choice for the return status // because a compile error will not have a strong connection to the // command line arguments, but there are only 2 error codes and // this is the least bad choice. // TODO : Readdress when error codes are reworked. if (compiler()->getDiagnostics().hasUnrecoverableErrorOccurred()) exit(EXIT_INVALIDARGS); const set* const files_to_report_iwyu_violations_for = preprocessor_info().files_to_report_iwyu_violations_for(); // Some analysis, such as UsingDecl resolution, is deferred until the // entire AST is visited because it's only at that point that we know if // the symbol was actually used or not. // We perform that analysis here before CalculateAndReportIwyuViolations. for (const FileEntry* file : *files_to_report_iwyu_violations_for) { CHECK_(preprocessor_info().FileInfoFor(file)); preprocessor_info().FileInfoFor(file)->ResolvePendingAnalysis(); } // We have to calculate the .h files before the .cc file, since // the .cc file inherits #includes from the .h files, and we // need to figure out what those #includes are going to be. size_t num_edits = 0; const FileEntry* const main_file = preprocessor_info().main_file(); for (const FileEntry* file : *files_to_report_iwyu_violations_for) { if (file == main_file) continue; CHECK_(preprocessor_info().FileInfoFor(file)); num_edits += preprocessor_info().FileInfoFor(file) ->CalculateAndReportIwyuViolations(); } CHECK_(preprocessor_info().FileInfoFor(main_file)); num_edits += preprocessor_info().FileInfoFor(main_file) ->CalculateAndReportIwyuViolations(); // We need to force the compile to fail so we can re-run. exit(EXIT_SUCCESS_OFFSET + num_edits); } void ParseFunctionTemplates(TranslationUnitDecl* decl) { set late_parsed_decls = GetLateParsedFunctionDecls(decl); clang::Sema& sema = compiler()->getSema(); // If we have any late-parsed functions, make sure the // -fdelayed-template-parsing flag is on. Otherwise we don't know where // they came from. CHECK_((compiler()->getLangOpts().DelayedTemplateParsing || late_parsed_decls.empty()) && "Should not have late-parsed decls without " "-fdelayed-template-parsing."); for (const FunctionDecl* fd : late_parsed_decls) { CHECK_(fd->isLateTemplateParsed()); if (CanIgnoreLocation(GetLocation(fd))) continue; // Force parsing and AST building of the yet-uninstantiated function // template body. clang::LateParsedTemplate* lpt = sema.LateParsedTemplateMap[fd].get(); sema.LateTemplateParser(sema.OpaqueParser, *lpt); } } //------------------------------------------------------------ // AST visitors. We start by adding a visitor callback for // most of the subclasses of Decl/Stmt/Type listed in: // clang/AST/DeclNodes.def // clang/AST/StmtNodes.td // clang/AST/TypeNodes.def // We exclude only: // 1) abstract declarations and types with no logic (e.g. NamedDecl) // 2) ObjC declarations, statements, and types (e.g. ObjcIvarDecl) // RecursiveASTVisitor defines specialized visitors for each specific // math operation (MulAssign, OffsetOf, etc). We don't override // those callbacks, but use their default behavior, which is to call // back to VisitUnaryOperator, VisitBinaryOperator, etc. // // Over time, as we understand when a callback is called and // which can be ignored by iwyu, we will pare down the list. // Each of these returns a bool: false if we want to abort the // traversal (we never do). For Visit*(), we can abort early if // we're not in the main compilation-unit, since we only ever give // iwyu warnings on symbols in those files. // --- Visitors of types derived from clang::Decl. bool VisitNamespaceAliasDecl(clang::NamespaceAliasDecl* decl) { if (CanIgnoreCurrentASTNode()) return true; ReportDeclUse(CurrentLoc(), decl->getNamespace()); return Base::VisitNamespaceAliasDecl(decl); } bool VisitUsingDecl(clang::UsingDecl* decl) { // If somebody in a different file tries to use one of these decls // with the shortened name, then they had better #include us in // order to get our using declaration. We store the necessary // information here. Note: we have to store this even if this is // an ast node we would otherwise ignore, since other AST nodes // (which we might not ignore) can depend on it. AddShadowDeclarations(decl); // The shadow decls hold the declarations for the var/fn/etc we're // using. (There may be more than one if, say, we're using an // overloaded function.) We don't want to add all of them at once // though, because that will drag in every overload even if we're // only using one. Instead, we keep track of the using decl and // mark it as touched when something actually uses it. preprocessor_info().FileInfoFor(CurrentFileEntry())->AddUsingDecl(decl); if (CanIgnoreCurrentASTNode()) return true; return Base::VisitUsingDecl(decl); } bool VisitTagDecl(clang::TagDecl* decl) { if (CanIgnoreCurrentASTNode()) return true; if (IsForwardDecl(decl)) { // If we're a templated class, make sure we add the whole template. const NamedDecl* decl_to_fwd_declare = decl; if (const CXXRecordDecl* cxx_decl = DynCastFrom(decl)) if (cxx_decl->getDescribedClassTemplate()) decl_to_fwd_declare = cxx_decl->getDescribedClassTemplate(); // We've found a forward-declaration. We'll report we've found // it, but we also want to report if we know already that we // should keep this forward-declaration around (and not consider // it for deletion if it's never used). There are a few // situations we can do this, described below. bool definitely_keep_fwd_decl = false; // (1) If the forward-decl has a linkage spec ('extern "C"') // then it can't be removed, since that information probably // isn't encoded anywhere else. // (Surprisingly classes can have linkage specs! -- they are // applied to all static methods of the class. See // http://msdn.microsoft.com/en-us/library/ms882260.aspx.) if (current_ast_node()->ParentIsA()) { definitely_keep_fwd_decl = true; // (2) GCC-style __attributes__ work the same way: we can't assume // that attributes are consistent between declarations, so we can't // remove a decl with attributes unless they're inherited, i.e. propagated // from another redeclaration as opposed to explicitly written. } else if (decl->hasAttrs()) { for (const Attr* attr : decl->getAttrs()) { if (!attr->isInherited()) { definitely_keep_fwd_decl = true; break; } } // (3) If we're a nested class ("class A { class SubA; };"), // then we can't necessary be removed either, since we're part // of the public API of the enclosing class -- it's illegal to // have a nested class and not at least declare it in the // enclosing class. If the nested class is actually defined in // the enclosing class, then we're fine; if not, we need to keep // the first forward-declaration. } else if (IsNestedClassAsWritten(current_ast_node())) { if (!decl->getDefinition() || decl->getDefinition()->isOutOfLine()) { // TODO(kimgr): Member class redeclarations are illegal, per C++ // standard DR85, so this check for first redecl can be removed. // Nested classes should always be definitely kept. More details here: // http://comments.gmane.org/gmane.comp.compilers.clang.scm/74782 // GCC and MSVC both still allow redeclarations of nested classes, // though, so it seems hygienic to remove all but one. if (const NamedDecl* first_decl = GetFirstRedecl(decl)) { // Check if we're the decl with the smallest line number. if (decl == first_decl) definitely_keep_fwd_decl = true; } } } else { SourceLocation decl_end_location = decl->getSourceRange().getEnd(); if (LineHasText(decl_end_location, "// IWYU pragma: keep") || LineHasText(decl_end_location, "/* IWYU pragma: keep")) { definitely_keep_fwd_decl = true; } } preprocessor_info().FileInfoFor(CurrentFileEntry())->AddForwardDeclare( decl_to_fwd_declare, definitely_keep_fwd_decl); } return Base::VisitTagDecl(decl); } // If you specialize a template, you need a declaration of the // template you're specializing. That is, for code like this: // template struct Foo; // template<> struct Foo { ... }; // we don't want iwyu to recommend removing the 'forward declare' of Foo. // // Additionally, this type of decl is also used to represent explicit template // instantiations, in which case we want the full type, not only a forward // declaration. bool VisitClassTemplateSpecializationDecl( clang::ClassTemplateSpecializationDecl* decl) { if (CanIgnoreCurrentASTNode()) return true; ClassTemplateDecl* specialized_decl = decl->getSpecializedTemplate(); if (IsExplicitInstantiation(decl)) ReportDeclUse(CurrentLoc(), specialized_decl); else ReportDeclForwardDeclareUse(CurrentLoc(), specialized_decl); return Base::VisitClassTemplateSpecializationDecl(decl); } // Track use of namespace in using directive decl // a.h: // namespace a { ... }; // // b.cpp: // include "a.h" // using namespace a; // ... bool VisitUsingDirectiveDecl(clang::UsingDirectiveDecl *decl) { if (CanIgnoreCurrentASTNode()) return true; ReportDeclUse(CurrentLoc(), decl->getNominatedNamespaceAsWritten()); return Base::VisitUsingDirectiveDecl(decl); } // If you say 'typedef Foo Bar', then clients can use Bar however // they want without having to worry about #including anything // except you. That puts you on the hook for all the #includes that // Bar might need, for *anything* one might want to do to a Bar. // TODO(csilvers): we can probably relax this rule in .cc files. // TODO(csilvers): this should really move into IwyuBaseASTVisitor // (that way we'll correctly identify need for hash<> in hash_set). // This is a Traverse*() because Visit*() can't call HandleFunctionCall(). bool TraverseTypedefDecl(clang::TypedefDecl* decl) { // Before we go up the tree, make sure the parents know we don't // forward-declare the underlying type of a typedef decl. current_ast_node()->set_in_forward_declare_context(false); if (!Base::TraverseTypedefDecl(decl)) return false; if (CanIgnoreCurrentASTNode()) return true; const Type* underlying_type = decl->getUnderlyingType().getTypePtr(); const Decl* underlying_decl = TypeToDeclAsWritten(underlying_type); // We simulate a user calling all the methods in a class. if (const CXXRecordDecl* record_decl = DynCastFrom(underlying_decl)) { for (DeclContext::decl_iterator it = record_decl->decls_begin(); it != record_decl->decls_end(); ++it) { FunctionDecl* fn_decl = nullptr; if (CXXMethodDecl* method_decl = DynCastFrom(*it)) { fn_decl = method_decl; } else if (FunctionTemplateDecl* tpl_decl = DynCastFrom(*it)) { fn_decl = tpl_decl->getTemplatedDecl(); // templated method decl } else { continue; // not a method or static method } if (!this->getDerived().HandleFunctionCall( fn_decl, underlying_type, static_cast(nullptr))) return false; } } // We don't have to simulate a user instantiating the type, because // RecursiveASTVisitor.h will recurse on the typedef'ed type for us. return true; } // --- Visitors of types derived from clang::Stmt. // Called whenever a variable, function, enum, etc is used. bool VisitDeclRefExpr(clang::DeclRefExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; // Special case for UsingShadowDecl to track UsingDecls correctly. The // actual decl will be reported by obtaining it from the UsingShadowDecl // once we've tracked the UsingDecl use. if (const UsingShadowDecl* found_decl = DynCastFrom(expr->getFoundDecl())) { ReportDeclUse(CurrentLoc(), found_decl); } else { ReportDeclUse(CurrentLoc(), expr->getDecl()); } return Base::VisitDeclRefExpr(expr); } // This Expr is for sizeof(), alignof() and similar. The compiler // fully instantiates a template class before taking the size of it. // So so do we. bool VisitUnaryExprOrTypeTraitExpr(clang::UnaryExprOrTypeTraitExpr* expr) { if (CanIgnoreCurrentASTNode()) return true; const Type* arg_type = RemoveElaboration(expr->getTypeOfArgument().getTypePtr()); // Calling sizeof on a reference-to-X is the same as calling it on X. if (const ReferenceType* reftype = DynCastFrom(arg_type)) { arg_type = reftype->getPointeeTypeAsWritten().getTypePtr(); } if (const TemplateSpecializationType* arg_tmpl = DynCastFrom(arg_type)) { // Special case: We are instantiating the type in the context of an // expression. Need to push the type to the AST stack explicitly. ASTNode node(arg_tmpl, *GlobalSourceManager()); node.SetParent(current_ast_node()); instantiated_template_visitor_.ScanInstantiatedType( &node, GetTplTypeResugarMapForClass(arg_type)); } return Base::VisitUnaryExprOrTypeTraitExpr(expr); } // --- Visitors of types derived from clang::Type. bool VisitTypedefType(clang::TypedefType* type) { if (CanIgnoreCurrentASTNode()) return true; // TypedefType::getDecl() returns the place where the typedef is defined. if (CanForwardDeclareType(current_ast_node())) { ReportDeclForwardDeclareUse(CurrentLoc(), type->getDecl()); } else { ReportDeclUse(CurrentLoc(), type->getDecl()); } return Base::VisitTypedefType(type); } // This is a superclass of RecordType and CXXRecordType. bool VisitTagType(clang::TagType* type) { if (CanIgnoreCurrentASTNode()) return true; // If we're forward-declarable, then no complicated checking is // needed: just forward-declare. if (CanForwardDeclareType(current_ast_node())) { current_ast_node()->set_in_forward_declare_context(true); if (compiler()->getLangOpts().CPlusPlus) { // In C++, if we're already elaborated ('class Foo x') but not // a qualified name ('class ns::Foo x', 'class Class::Nested x') there's // no need even to forward-declare. // Note that enums are never forward-declarable, so elaborated enums are // already short-circuited in CanForwardDeclareType. const ASTNode* parent = current_ast_node()->parent(); if (!IsElaborationNode(parent) || IsQualifiedNameNode(parent)) ReportDeclForwardDeclareUse(CurrentLoc(), type->getDecl()); } else { // In C, all struct references are elaborated, so we really never need // to forward-declare. But there's one case where an elaborated struct // decl in a parameter list causes Clang to warn about constrained // visibility, so we recommend forward declaration to avoid the warning. // E.g. // void init(struct mystruct* s); // warning: declaration of 'struct mystruct' will not be visible // outside of this function [-Wvisibility] if (current_ast_node()->HasAncestorOfType()) ReportDeclForwardDeclareUse(CurrentLoc(), type->getDecl()); } return Base::VisitTagType(type); } // OK, seems to be a use that requires the full type. ReportDeclUse(CurrentLoc(), type->getDecl()); return Base::VisitTagType(type); } // Like for CXXConstructExpr, etc., we sometimes need to instantiate // a class when looking at TemplateSpecializationType -- for instance, // when we need to access a class typedef: MyClass::value_type. bool VisitTemplateSpecializationType( clang::TemplateSpecializationType* type) { if (CanIgnoreCurrentASTNode()) return true; // If we're not in a forward-declare context, use of a template // specialization requires having the full type information. if (!CanForwardDeclareType(current_ast_node())) { const map resugar_map = GetTplTypeResugarMapForClass(type); instantiated_template_visitor_.ScanInstantiatedType(current_ast_node(), resugar_map); } return Base::VisitTemplateSpecializationType(type); } // --- Visitors defined by BaseASTVisitor (not RecursiveASTVisitor). bool VisitTemplateName(TemplateName template_name) { if (CanIgnoreCurrentASTNode()) return true; if (!Base::VisitTemplateName(template_name)) return false; // The only time we can see a TemplateName not in the // context of a TemplateSpecializationType is when it's // the default argument of a template template arg: // template class A = TplNameWithoutTST> class Foo ... // So that's the only case we need to handle here. // TODO(csilvers): check if this is really forward-declarable or // not. You *could* do something like: 'template class A = Foo> class C { A* x; };' and never // dereference x, but that's pretty unlikely. So for now, we just // assume these default template template args always need full // type info. if (IsDefaultTemplateTemplateArg(current_ast_node())) { current_ast_node()->set_in_forward_declare_context(false); ReportDeclUse(CurrentLoc(), template_name.getAsTemplateDecl()); } return true; } // For expressions that require us to instantiate a template // (CallExpr of a template function, or CXXConstructExpr of a // template class, etc), we need to instantiate the template and // check IWYU status of the template parameters *in the template // code* (so for 'MyFunc() { T t; ... }', the contents of // MyFunc add an iwyu requirement on MyClass). bool HandleFunctionCall(FunctionDecl* callee, const Type* parent_type, const clang::Expr* calling_expr) { if (!Base::HandleFunctionCall(callee, parent_type, calling_expr)) return false; if (!callee || CanIgnoreCurrentASTNode() || CanIgnoreDecl(callee)) return true; if (!IsTemplatizedFunctionDecl(callee) && !IsTemplatizedType(parent_type)) return true; map resugar_map = GetTplTypeResugarMapForFunction(callee, calling_expr); if (parent_type) { // means we're a method of a class InsertAllInto(GetTplTypeResugarMapForClass(parent_type), &resugar_map); } instantiated_template_visitor_.ScanInstantiatedFunction( callee, parent_type, current_ast_node(), resugar_map); return true; } private: // Class we call to handle instantiated template functions and classes. InstantiatedTemplateVisitor instantiated_template_visitor_; }; // class IwyuAstConsumer // We use an ASTFrontendAction to hook up IWYU with Clang. class IwyuAction : public ASTFrontendAction { protected: std::unique_ptr CreateASTConsumer( CompilerInstance& compiler, // NOLINT llvm::StringRef /* dummy */) override { // Do this first thing after getting our hands on a CompilerInstance. InitGlobals(&compiler.getSourceManager(), &compiler.getPreprocessor().getHeaderSearchInfo()); auto* const preprocessor_consumer = new IwyuPreprocessorInfo(); compiler.getPreprocessor().addPPCallbacks( std::unique_ptr(preprocessor_consumer)); compiler.getPreprocessor().addCommentHandler(preprocessor_consumer); auto* const visitor_state = new VisitorState(&compiler, *preprocessor_consumer); return std::unique_ptr(new IwyuAstConsumer(visitor_state)); } }; } // namespace include_what_you_use #include "iwyu_driver.h" #include "clang/Frontend/FrontendAction.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/TargetSelect.h" using include_what_you_use::OptionsParser; using include_what_you_use::IwyuAction; using include_what_you_use::CreateCompilerInstance; int main(int argc, char **argv) { // Must initialize X86 target to be able to parse Microsoft inline // assembly. We do this unconditionally, because it allows an IWYU // built for non-X86 targets to parse MS inline asm without choking. LLVMInitializeX86TargetInfo(); LLVMInitializeX86TargetMC(); LLVMInitializeX86AsmParser(); // The command line should look like // path/to/iwyu -Xiwyu --verbose=4 [-Xiwyu --other_iwyu_flag]... CLANG_FLAGS... foo.cc OptionsParser options_parser(argc, argv); std::unique_ptr compiler(CreateCompilerInstance( options_parser.clang_argc(), options_parser.clang_argv())); if (compiler) { // Create and execute the frontend to generate an LLVM bitcode module. std::unique_ptr action(new IwyuAction); compiler->ExecuteAction(*action); } llvm::llvm_shutdown(); // We always return a failure exit code, to indicate we didn't // successfully compile (produce a .o for) the source files we were // given. return 1; } include-what-you-use-clang_8.0/iwyu.gcc.imp000066400000000000000000000002441345265751700207730ustar00rootroot00000000000000# Default include mappings for IWYU with GCC [ { ref: gcc.libc.imp }, { ref: gcc.symbols.imp }, { ref: gcc.stl.headers.imp }, { ref: stl.c.headers.imp }, ] include-what-you-use-clang_8.0/iwyu_ast_util.cc000066400000000000000000001503761345265751700217600ustar00rootroot00000000000000//===--- iwyu_ast_util.cc - clang-AST utilities for include-what-you-use --===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // Utilities that make it easier to work with Clang's AST. #include "iwyu_ast_util.h" #include // for set #include // for string, operator+, etc #include // for pair #include "iwyu_globals.h" #include "iwyu_location_util.h" #include "iwyu_path_util.h" #include "iwyu_stl_util.h" #include "iwyu_string_util.h" #include "iwyu_verrs.h" #include "port.h" // for CHECK_ #include "llvm/ADT/ArrayRef.h" #include "llvm/Support/Casting.h" #include "llvm/Support/raw_ostream.h" #include "clang/AST/ASTContext.h" #include "clang/AST/CanonicalType.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/Stmt.h" #include "clang/AST/TemplateBase.h" #include "clang/AST/TemplateName.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" namespace clang { class FileEntry; } // namespace clang using clang::BlockPointerType; using clang::CXXConstructExpr; using clang::CXXConstructorDecl; using clang::CXXDeleteExpr; using clang::CXXDependentScopeMemberExpr; using clang::CXXDestructorDecl; using clang::CXXMethodDecl; using clang::CXXNewExpr; using clang::CXXRecordDecl; using clang::CallExpr; using clang::CastExpr; using clang::ClassTemplateDecl; using clang::ClassTemplatePartialSpecializationDecl; using clang::ClassTemplateSpecializationDecl; using clang::Decl; using clang::DeclContext; using clang::DeclRefExpr; using clang::DeclaratorDecl; using clang::DependentNameType; using clang::DependentScopeDeclRefExpr; using clang::DependentTemplateName; using clang::DependentTemplateSpecializationType; using clang::ElaboratedType; using clang::EnumDecl; using clang::ExplicitCastExpr; using clang::Expr; using clang::ExprWithCleanups; using clang::FileEntry; using clang::FullSourceLoc; using clang::FunctionDecl; using clang::FunctionType; using clang::ImplicitCastExpr; using clang::InjectedClassNameType; using clang::LValueReferenceType; using clang::MemberExpr; using clang::MemberPointerType; using clang::NamedDecl; using clang::NestedNameSpecifier; using clang::ObjCObjectType; using clang::OverloadExpr; using clang::PointerType; using clang::QualType; using clang::QualifiedTemplateName; using clang::RecordDecl; using clang::RecordType; using clang::RecursiveASTVisitor; using clang::SourceLocation; using clang::SourceRange; using clang::Stmt; using clang::SubstTemplateTypeParmType; using clang::TagDecl; using clang::TagType; using clang::TemplateArgument; using clang::TemplateArgumentList; using clang::TemplateArgumentListInfo; using clang::TemplateArgumentLoc; using clang::TemplateDecl; using clang::TemplateName; using clang::TemplateParameterList; using clang::TemplateSpecializationKind; using clang::TemplateSpecializationType; using clang::TranslationUnitDecl; using clang::Type; using clang::TypeDecl; using clang::TypeLoc; using clang::TypedefNameDecl; using clang::TypedefType; using clang::UnaryOperator; using clang::UsingDirectiveDecl; using clang::ValueDecl; using clang::VarDecl; using llvm::ArrayRef; using llvm::PointerUnion; using llvm::cast; using llvm::dyn_cast; using llvm::errs; using llvm::isa; using llvm::raw_string_ostream; namespace include_what_you_use { namespace { void DumpASTNode(llvm::raw_ostream& ostream, const ASTNode* node) { if (const Decl *decl = node->GetAs()) { ostream << "[" << decl->getDeclKindName() << "Decl] " << PrintableDecl(decl); } else if (const Stmt *stmt = node->GetAs()) { ostream << "[" << stmt->getStmtClassName() << "] " << PrintableStmt(stmt); } else if (const Type *type = node->GetAs()) { // +typeloc ostream << "[" << type->getTypeClassName() << (node->IsA() ? "TypeLoc" : "Type") << "] " << PrintableType(type); } else if (const NestedNameSpecifier *nns = node->GetAs()) { ostream << "[NestedNameSpecifier] " << PrintableNestedNameSpecifier(nns); } else if (const TemplateName *tpl_name = node->GetAs()) { ostream << "[TemplateName] " << PrintableTemplateName(*tpl_name); } else if (const TemplateArgumentLoc *tpl_argloc = node->GetAs()) { ostream << "[TemplateArgumentLoc] " << PrintableTemplateArgumentLoc(*tpl_argloc); } else if (const TemplateArgument *tpl_arg = node->GetAs()) { ostream << "[TemplateArgument] " << PrintableTemplateArgument(*tpl_arg); } else { CHECK_UNREACHABLE_("Unknown kind for ASTNode"); } } TemplateSpecializationKind GetTemplateSpecializationKind(const Decl* decl) { if (const auto* record = dyn_cast(decl)) { return record->getTemplateSpecializationKind(); } return clang::TSK_Undeclared; } } // anonymous namespace //------------------------------------------------------------ // ASTNode and associated utilities. SourceLocation ASTNode::GetLocation() const { SourceLocation retval; if (FillLocationIfKnown(&retval)) return retval; // OK, let's ask a parent node. for (const ASTNode* node = parent_; node != nullptr; node = node->parent_) { if (node->FillLocationIfKnown(&retval)) break; } // If the parent node shows the spelling and instantiation // locations are in a different file, then we're uncertain of our // own location. Return an invalid location. if (retval.isValid()) { FullSourceLoc full_loc(retval, source_manager_); const FileEntry* spelling_file = source_manager_.getFileEntryForID( source_manager_.getFileID(full_loc.getSpellingLoc())); const FileEntry* instantiation_file = source_manager_.getFileEntryForID( source_manager_.getFileID(full_loc.getExpansionLoc())); if (spelling_file != instantiation_file) return SourceLocation(); } return retval; } bool ASTNode::FillLocationIfKnown(SourceLocation* loc) const { using include_what_you_use::GetLocation; switch (kind_) { case kDeclKind: *loc = GetLocation(as_decl_); // in iwyu_location_util.h return true; case kStmtKind: *loc = GetLocation(as_stmt_); return true; case kTypelocKind: *loc = GetLocation(as_typeloc_); return true; case kNNSLocKind: *loc = GetLocation(as_nnsloc_); return true; case kTemplateArgumentLocKind: *loc = GetLocation(as_template_argloc_); return true; case kTypeKind: case kNNSKind: case kTemplateNameKind: case kTemplateArgumentKind: return false; } CHECK_UNREACHABLE_("Unexpected kind of ASTNode"); } // --- Utilities for ASTNode. bool IsElaborationNode(const ASTNode* ast_node) { if (ast_node == nullptr) return false; const ElaboratedType* elaborated_type = ast_node->GetAs(); return elaborated_type && elaborated_type->getKeyword() != clang::ETK_None; } bool IsQualifiedNameNode(const ASTNode* ast_node) { if (ast_node == nullptr) return false; const ElaboratedType* elaborated_type = ast_node->GetAs(); if (elaborated_type == nullptr) return false; return elaborated_type->getQualifier() != nullptr; } bool IsNodeInsideCXXMethodBody(const ASTNode* ast_node) { // If we're a destructor, we're definitely part of a method body; // destructors don't have any other parts to them. This case is // triggered when we see implicit destruction of member vars. if (ast_node && ast_node->IsA()) return true; for (; ast_node != nullptr; ast_node = ast_node->parent()) { // If we're a constructor, check if we're part of the // initializers, which also count as 'the body' of the method. if (const CXXConstructorDecl* ctor = ast_node->GetParentAs()) { for (CXXConstructorDecl::init_const_iterator it = ctor->init_begin(); it != ctor->init_end(); ++it) { if (ast_node->ContentIs((*it)->getInit())) return true; } // Now fall through to see if we're the body of the constructor. } if (const CXXMethodDecl* method_decl = ast_node->GetParentAs()) { if (ast_node->ContentIs(method_decl->getBody())) { return true; } } } return false; } UseFlags ComputeUseFlags(const ASTNode* ast_node) { UseFlags flags = UF_None; if (IsNodeInsideCXXMethodBody(ast_node)) flags |= UF_InCxxMethodBody; // Definitions of free functions are a little special, because they themselves // count as uses of all prior declarations (ideally we should probably just // require one but it's hard so say which, so we pick all previously seen). // Later IWYU analysis phases do some canonicalization that isn't // necessary/valid for this case, so mark it up for later. if (const auto* fd = ast_node->GetAs()) { if (fd->getKind() == Decl::Function && fd->isThisDeclarationADefinition()) flags |= UF_FunctionDfn; } return flags; } bool IsNestedClassAsWritten(const ASTNode* ast_node) { return (ast_node->IsA() && (ast_node->ParentIsA() || // For templated nested-classes, a ClassTemplateDecl is interposed. (ast_node->ParentIsA() && ast_node->AncestorIsA(2)))); } bool IsDefaultTemplateTemplateArg(const ASTNode* ast_node) { // Is ast_node the 'D' in the following: // template