summaryrefslogtreecommitdiffstats
path: root/vendor/mdbook/tests
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /vendor/mdbook/tests
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/mdbook/tests')
-rw-r--r--vendor/mdbook/tests/alternative_backends.rs164
-rw-r--r--vendor/mdbook/tests/build_process.rs78
-rw-r--r--vendor/mdbook/tests/cli/build.rs28
-rw-r--r--vendor/mdbook/tests/cli/cmd.rs7
-rw-r--r--vendor/mdbook/tests/cli/mod.rs3
-rw-r--r--vendor/mdbook/tests/cli/test.rs34
-rw-r--r--vendor/mdbook/tests/cli_tests.rs2
-rw-r--r--vendor/mdbook/tests/custom_preprocessors.rs56
-rw-r--r--vendor/mdbook/tests/dummy_book/index_html_test/SUMMARY.md11
-rw-r--r--vendor/mdbook/tests/dummy_book/index_html_test/chapter_1.md1
-rw-r--r--vendor/mdbook/tests/dummy_book/mod.rs145
-rw-r--r--vendor/mdbook/tests/dummy_book/src/README.md5
-rw-r--r--vendor/mdbook/tests/dummy_book/src/SUMMARY.md22
-rw-r--r--vendor/mdbook/tests/dummy_book/src/conclusion.md20
-rw-r--r--vendor/mdbook/tests/dummy_book/src/example.rs6
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/duplicate-headers.md9
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/includes.md3
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/index.md5
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/markdown.md29
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/nested-test-with-anchors.rs11
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/nested-test.rs1
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/nested.md31
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/no-headers.md5
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/partially-included-test-with-anchors.rs11
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/partially-included-test.rs7
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/recursive.md2
-rw-r--r--vendor/mdbook/tests/dummy_book/src/first/unicode.md21
-rw-r--r--vendor/mdbook/tests/dummy_book/src/intro.md3
-rw-r--r--vendor/mdbook/tests/dummy_book/src/second.md5
-rw-r--r--vendor/mdbook/tests/dummy_book/src/second/nested.md16
-rw-r--r--vendor/mdbook/tests/dummy_book/src2/README.md1
-rw-r--r--vendor/mdbook/tests/dummy_book/src2/SUMMARY.md7
-rw-r--r--vendor/mdbook/tests/dummy_book/src2/first/README.md1
-rw-r--r--vendor/mdbook/tests/dummy_book/src2/second/README.md1
-rw-r--r--vendor/mdbook/tests/dummy_book/src2/second/index.md1
-rw-r--r--vendor/mdbook/tests/dummy_book/summary-formatting/SUMMARY.md6
-rw-r--r--vendor/mdbook/tests/init.rs144
-rw-r--r--vendor/mdbook/tests/parse_existing_summary_files.rs43
-rw-r--r--vendor/mdbook/tests/rendered_output.rs844
-rw-r--r--vendor/mdbook/tests/searchindex_fixture.json6991
-rw-r--r--vendor/mdbook/tests/summary_md_files/example_book.md20
-rw-r--r--vendor/mdbook/tests/summary_md_files/rust_by_example.md191
-rw-r--r--vendor/mdbook/tests/summary_md_files/rust_ffi_guide.md19
-rw-r--r--vendor/mdbook/tests/summary_md_files/the_book-2nd_edition.md130
-rw-r--r--vendor/mdbook/tests/testing.rs26
45 files changed, 9166 insertions, 0 deletions
diff --git a/vendor/mdbook/tests/alternative_backends.rs b/vendor/mdbook/tests/alternative_backends.rs
new file mode 100644
index 000000000..cc7bfc7d9
--- /dev/null
+++ b/vendor/mdbook/tests/alternative_backends.rs
@@ -0,0 +1,164 @@
+//! Integration tests to make sure alternative backends work.
+
+use mdbook::config::Config;
+use mdbook::MDBook;
+use std::fs;
+use std::path::Path;
+use tempfile::{Builder as TempFileBuilder, TempDir};
+
+#[test]
+fn passing_alternate_backend() {
+ let (md, _temp) = dummy_book_with_backend("passing", success_cmd(), false);
+
+ md.build().unwrap();
+}
+
+#[test]
+fn failing_alternate_backend() {
+ let (md, _temp) = dummy_book_with_backend("failing", fail_cmd(), false);
+
+ md.build().unwrap_err();
+}
+
+#[test]
+fn missing_backends_are_fatal() {
+ let (md, _temp) = dummy_book_with_backend("missing", "trduyvbhijnorgevfuhn", false);
+ assert!(md.build().is_err());
+}
+
+#[test]
+fn missing_optional_backends_are_not_fatal() {
+ let (md, _temp) = dummy_book_with_backend("missing", "trduyvbhijnorgevfuhn", true);
+ assert!(md.build().is_ok());
+}
+
+#[test]
+fn alternate_backend_with_arguments() {
+ let (md, _temp) = dummy_book_with_backend("arguments", "echo Hello World!", false);
+
+ md.build().unwrap();
+}
+
+/// Get a command which will pipe `stdin` to the provided file.
+#[cfg(not(windows))]
+fn tee_command<P: AsRef<Path>>(out_file: P) -> String {
+ let out_file = out_file.as_ref();
+
+ if cfg!(windows) {
+ format!("cmd.exe /c \"type > {}\"", out_file.display())
+ } else {
+ format!("tee {}", out_file.display())
+ }
+}
+
+#[test]
+#[cfg(not(windows))]
+fn backends_receive_render_context_via_stdin() {
+ use mdbook::renderer::RenderContext;
+ use std::fs::File;
+
+ let temp = TempFileBuilder::new().prefix("output").tempdir().unwrap();
+ let out_file = temp.path().join("out.txt");
+ let cmd = tee_command(&out_file);
+
+ let (md, _temp) = dummy_book_with_backend("cat-to-file", &cmd, false);
+
+ assert!(!out_file.exists());
+ md.build().unwrap();
+ assert!(out_file.exists());
+
+ let got = RenderContext::from_json(File::open(&out_file).unwrap());
+ assert!(got.is_ok());
+}
+
+#[test]
+fn relative_command_path() {
+ // Checks behavior of relative paths for the `command` setting.
+ let temp = TempFileBuilder::new().prefix("mdbook").tempdir().unwrap();
+ let renderers = temp.path().join("renderers");
+ fs::create_dir(&renderers).unwrap();
+ rust_exe(
+ &renderers,
+ "myrenderer",
+ r#"fn main() {
+ std::fs::write("output", "test").unwrap();
+ }"#,
+ );
+ let do_test = |cmd_path| {
+ let mut config = Config::default();
+ config
+ .set("output.html", toml::value::Table::new())
+ .unwrap();
+ config.set("output.myrenderer.command", cmd_path).unwrap();
+ let md = MDBook::init(&temp.path())
+ .with_config(config)
+ .build()
+ .unwrap();
+ let output = temp.path().join("book/myrenderer/output");
+ assert!(!output.exists());
+ md.build().unwrap();
+ assert!(output.exists());
+ fs::remove_file(output).unwrap();
+ };
+ // Legacy paths work, relative to the output directory.
+ if cfg!(windows) {
+ do_test("../../renderers/myrenderer.exe");
+ } else {
+ do_test("../../renderers/myrenderer");
+ }
+ // Modern path, relative to the book directory.
+ do_test("renderers/myrenderer");
+}
+
+fn dummy_book_with_backend(
+ name: &str,
+ command: &str,
+ backend_is_optional: bool,
+) -> (MDBook, TempDir) {
+ let temp = TempFileBuilder::new().prefix("mdbook").tempdir().unwrap();
+
+ let mut config = Config::default();
+ config
+ .set(format!("output.{}.command", name), command)
+ .unwrap();
+
+ if backend_is_optional {
+ config
+ .set(format!("output.{}.optional", name), true)
+ .unwrap();
+ }
+
+ let md = MDBook::init(temp.path())
+ .with_config(config)
+ .build()
+ .unwrap();
+
+ (md, temp)
+}
+
+fn fail_cmd() -> &'static str {
+ if cfg!(windows) {
+ r#"cmd.exe /c "exit 1""#
+ } else {
+ "false"
+ }
+}
+
+fn success_cmd() -> &'static str {
+ if cfg!(windows) {
+ r#"cmd.exe /c "exit 0""#
+ } else {
+ "true"
+ }
+}
+
+fn rust_exe(temp: &Path, name: &str, src: &str) {
+ let rs = temp.join(name).with_extension("rs");
+ fs::write(&rs, src).unwrap();
+ let status = std::process::Command::new("rustc")
+ .arg(rs)
+ .current_dir(temp)
+ .status()
+ .expect("rustc should run");
+ assert!(status.success());
+}
diff --git a/vendor/mdbook/tests/build_process.rs b/vendor/mdbook/tests/build_process.rs
new file mode 100644
index 000000000..10d0b4a9a
--- /dev/null
+++ b/vendor/mdbook/tests/build_process.rs
@@ -0,0 +1,78 @@
+mod dummy_book;
+
+use crate::dummy_book::DummyBook;
+use mdbook::book::Book;
+use mdbook::config::Config;
+use mdbook::errors::*;
+use mdbook::preprocess::{Preprocessor, PreprocessorContext};
+use mdbook::renderer::{RenderContext, Renderer};
+use mdbook::MDBook;
+use std::sync::{Arc, Mutex};
+
+struct Spy(Arc<Mutex<Inner>>);
+
+#[derive(Debug, Default)]
+struct Inner {
+ run_count: usize,
+ rendered_with: Vec<String>,
+}
+
+impl Preprocessor for Spy {
+ fn name(&self) -> &str {
+ "dummy"
+ }
+
+ fn run(&self, ctx: &PreprocessorContext, book: Book) -> Result<Book> {
+ let mut inner = self.0.lock().unwrap();
+ inner.run_count += 1;
+ inner.rendered_with.push(ctx.renderer.clone());
+ Ok(book)
+ }
+}
+
+impl Renderer for Spy {
+ fn name(&self) -> &str {
+ "dummy"
+ }
+
+ fn render(&self, _ctx: &RenderContext) -> Result<()> {
+ let mut inner = self.0.lock().unwrap();
+ inner.run_count += 1;
+ Ok(())
+ }
+}
+
+#[test]
+fn mdbook_runs_preprocessors() {
+ let spy: Arc<Mutex<Inner>> = Default::default();
+
+ let temp = DummyBook::new().build().unwrap();
+ let cfg = Config::default();
+
+ let mut book = MDBook::load_with_config(temp.path(), cfg).unwrap();
+ book.with_preprocessor(Spy(Arc::clone(&spy)));
+ book.build().unwrap();
+
+ let inner = spy.lock().unwrap();
+ assert_eq!(inner.run_count, 1);
+ assert_eq!(inner.rendered_with.len(), 1);
+ assert_eq!(
+ "html", inner.rendered_with[0],
+ "We should have been run with the default HTML renderer"
+ );
+}
+
+#[test]
+fn mdbook_runs_renderers() {
+ let spy: Arc<Mutex<Inner>> = Default::default();
+
+ let temp = DummyBook::new().build().unwrap();
+ let cfg = Config::default();
+
+ let mut book = MDBook::load_with_config(temp.path(), cfg).unwrap();
+ book.with_renderer(Spy(Arc::clone(&spy)));
+ book.build().unwrap();
+
+ let inner = spy.lock().unwrap();
+ assert_eq!(inner.run_count, 1);
+}
diff --git a/vendor/mdbook/tests/cli/build.rs b/vendor/mdbook/tests/cli/build.rs
new file mode 100644
index 000000000..0daba9d72
--- /dev/null
+++ b/vendor/mdbook/tests/cli/build.rs
@@ -0,0 +1,28 @@
+use crate::cli::cmd::mdbook_cmd;
+use crate::dummy_book::DummyBook;
+
+#[test]
+fn mdbook_cli_dummy_book_generates_index_html() {
+ let temp = DummyBook::new().build().unwrap();
+
+ // doesn't exist before
+ assert!(!temp.path().join("book").exists());
+
+ let mut cmd = mdbook_cmd();
+ cmd.arg("build").current_dir(temp.path());
+ cmd.assert()
+ .success()
+ .stderr(
+ predicates::str::is_match(r##"Stack depth exceeded in first[\\/]recursive.md."##)
+ .unwrap(),
+ )
+ .stderr(predicates::str::contains(
+ r##"[INFO] (mdbook::book): Running the html backend"##,
+ ));
+
+ // exists afterward
+ assert!(temp.path().join("book").exists());
+
+ let index_file = temp.path().join("book/index.html");
+ assert!(index_file.exists());
+}
diff --git a/vendor/mdbook/tests/cli/cmd.rs b/vendor/mdbook/tests/cli/cmd.rs
new file mode 100644
index 000000000..a612f3ad2
--- /dev/null
+++ b/vendor/mdbook/tests/cli/cmd.rs
@@ -0,0 +1,7 @@
+use assert_cmd::Command;
+
+pub(crate) fn mdbook_cmd() -> Command {
+ let mut cmd = Command::cargo_bin("mdbook").unwrap();
+ cmd.env_remove("RUST_LOG");
+ cmd
+}
diff --git a/vendor/mdbook/tests/cli/mod.rs b/vendor/mdbook/tests/cli/mod.rs
new file mode 100644
index 000000000..989f443f0
--- /dev/null
+++ b/vendor/mdbook/tests/cli/mod.rs
@@ -0,0 +1,3 @@
+mod build;
+mod cmd;
+mod test;
diff --git a/vendor/mdbook/tests/cli/test.rs b/vendor/mdbook/tests/cli/test.rs
new file mode 100644
index 000000000..bc525d9a9
--- /dev/null
+++ b/vendor/mdbook/tests/cli/test.rs
@@ -0,0 +1,34 @@
+use crate::cli::cmd::mdbook_cmd;
+use crate::dummy_book::DummyBook;
+
+use predicates::boolean::PredicateBooleanExt;
+
+#[test]
+fn mdbook_cli_can_correctly_test_a_passing_book() {
+ let temp = DummyBook::new().with_passing_test(true).build().unwrap();
+
+ let mut cmd = mdbook_cmd();
+ cmd.arg("test").current_dir(temp.path());
+ cmd.assert().success()
+ .stderr(predicates::str::is_match(r##"Testing file: "([^"]+)[\\/]README.md""##).unwrap())
+ .stderr(predicates::str::is_match(r##"Testing file: "([^"]+)[\\/]intro.md""##).unwrap())
+ .stderr(predicates::str::is_match(r##"Testing file: "([^"]+)[\\/]first[\\/]index.md""##).unwrap())
+ .stderr(predicates::str::is_match(r##"Testing file: "([^"]+)[\\/]first[\\/]nested.md""##).unwrap())
+ .stderr(predicates::str::is_match(r##"rustdoc returned an error:\n\n"##).unwrap().not())
+ .stderr(predicates::str::is_match(r##"Nested_Chapter::Rustdoc_include_works_with_anchors_too \(line \d+\) ... FAILED"##).unwrap().not());
+}
+
+#[test]
+fn mdbook_cli_detects_book_with_failing_tests() {
+ let temp = DummyBook::new().with_passing_test(false).build().unwrap();
+
+ let mut cmd = mdbook_cmd();
+ cmd.arg("test").current_dir(temp.path());
+ cmd.assert().failure()
+ .stderr(predicates::str::is_match(r##"Testing file: "([^"]+)[\\/]README.md""##).unwrap())
+ .stderr(predicates::str::is_match(r##"Testing file: "([^"]+)[\\/]intro.md""##).unwrap())
+ .stderr(predicates::str::is_match(r##"Testing file: "([^"]+)[\\/]first[\\/]index.md""##).unwrap())
+ .stderr(predicates::str::is_match(r##"Testing file: "([^"]+)[\\/]first[\\/]nested.md""##).unwrap())
+ .stderr(predicates::str::is_match(r##"rustdoc returned an error:\n\n"##).unwrap())
+ .stderr(predicates::str::is_match(r##"Nested_Chapter::Rustdoc_include_works_with_anchors_too \(line \d+\) ... FAILED"##).unwrap());
+}
diff --git a/vendor/mdbook/tests/cli_tests.rs b/vendor/mdbook/tests/cli_tests.rs
new file mode 100644
index 000000000..0b005d019
--- /dev/null
+++ b/vendor/mdbook/tests/cli_tests.rs
@@ -0,0 +1,2 @@
+mod cli;
+mod dummy_book;
diff --git a/vendor/mdbook/tests/custom_preprocessors.rs b/vendor/mdbook/tests/custom_preprocessors.rs
new file mode 100644
index 000000000..8237602de
--- /dev/null
+++ b/vendor/mdbook/tests/custom_preprocessors.rs
@@ -0,0 +1,56 @@
+mod dummy_book;
+
+use crate::dummy_book::DummyBook;
+use mdbook::preprocess::{CmdPreprocessor, Preprocessor};
+use mdbook::MDBook;
+
+fn example() -> CmdPreprocessor {
+ CmdPreprocessor::new(
+ "nop-preprocessor".to_string(),
+ "cargo run --example nop-preprocessor --".to_string(),
+ )
+}
+
+#[test]
+fn example_supports_whatever() {
+ let cmd = example();
+
+ let got = cmd.supports_renderer("whatever");
+
+ assert_eq!(got, true);
+}
+
+#[test]
+fn example_doesnt_support_not_supported() {
+ let cmd = example();
+
+ let got = cmd.supports_renderer("not-supported");
+
+ assert_eq!(got, false);
+}
+
+#[test]
+fn ask_the_preprocessor_to_blow_up() {
+ let dummy_book = DummyBook::new();
+ let temp = dummy_book.build().unwrap();
+ let mut md = MDBook::load(temp.path()).unwrap();
+ md.with_preprocessor(example());
+
+ md.config
+ .set("preprocessor.nop-preprocessor.blow-up", true)
+ .unwrap();
+
+ let got = md.build();
+
+ assert!(got.is_err());
+}
+
+#[test]
+fn process_the_dummy_book() {
+ let dummy_book = DummyBook::new();
+ let temp = dummy_book.build().unwrap();
+ let mut md = MDBook::load(temp.path()).unwrap();
+ md.with_preprocessor(example());
+
+ md.build().unwrap();
+}
diff --git a/vendor/mdbook/tests/dummy_book/index_html_test/SUMMARY.md b/vendor/mdbook/tests/dummy_book/index_html_test/SUMMARY.md
new file mode 100644
index 000000000..37bf68cde
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/index_html_test/SUMMARY.md
@@ -0,0 +1,11 @@
+# Summary
+
+---
+
+- [None of these should be treated as the "index chapter"]()
+
+# Part 1
+
+- [Not this either]()
+- [Chapter 1](./chapter_1.md)
+- [And not this]()
diff --git a/vendor/mdbook/tests/dummy_book/index_html_test/chapter_1.md b/vendor/mdbook/tests/dummy_book/index_html_test/chapter_1.md
new file mode 100644
index 000000000..b743fda35
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/index_html_test/chapter_1.md
@@ -0,0 +1 @@
+# Chapter 1
diff --git a/vendor/mdbook/tests/dummy_book/mod.rs b/vendor/mdbook/tests/dummy_book/mod.rs
new file mode 100644
index 000000000..d9d9a068d
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/mod.rs
@@ -0,0 +1,145 @@
+//! This will create an entire book in a temporary directory using some
+//! dummy contents from the `tests/dummy-book/` directory.
+
+// Not all features are used in all test crates, so...
+#![allow(dead_code, unused_variables, unused_imports, unused_extern_crates)]
+
+use anyhow::Context;
+use mdbook::errors::*;
+use mdbook::MDBook;
+use std::fs::{self, File};
+use std::io::{Read, Write};
+use std::path::Path;
+use tempfile::{Builder as TempFileBuilder, TempDir};
+use walkdir::WalkDir;
+
+/// Create a dummy book in a temporary directory, using the contents of
+/// `SUMMARY_MD` as a guide.
+///
+/// The "Nested Chapter" file contains a code block with a single
+/// `assert!($TEST_STATUS)`. If you want to check MDBook's testing
+/// functionality, `$TEST_STATUS` can be substitute for either `true` or
+/// `false`. This is done using the `passing_test` parameter.
+#[derive(Clone, Debug, PartialEq)]
+pub struct DummyBook {
+ passing_test: bool,
+}
+
+impl DummyBook {
+ /// Create a new `DummyBook` with all the defaults.
+ pub fn new() -> DummyBook {
+ DummyBook { passing_test: true }
+ }
+
+ /// Whether the doc-test included in the "Nested Chapter" should pass or
+ /// fail (it passes by default).
+ pub fn with_passing_test(&mut self, test_passes: bool) -> &mut DummyBook {
+ self.passing_test = test_passes;
+ self
+ }
+
+ /// Write a book to a temporary directory using the provided settings.
+ pub fn build(&self) -> Result<TempDir> {
+ let temp = TempFileBuilder::new()
+ .prefix("dummy_book-")
+ .tempdir()
+ .with_context(|| "Unable to create temp directory")?;
+
+ let dummy_book_root = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/dummy_book");
+ recursive_copy(&dummy_book_root, temp.path()).with_context(|| {
+ "Couldn't copy files into a \
+ temporary directory"
+ })?;
+
+ let sub_pattern = if self.passing_test { "true" } else { "false" };
+ let files_containing_tests = [
+ "src/first/nested.md",
+ "src/first/nested-test.rs",
+ "src/first/nested-test-with-anchors.rs",
+ "src/first/partially-included-test.rs",
+ "src/first/partially-included-test-with-anchors.rs",
+ ];
+ for file in &files_containing_tests {
+ let path_containing_tests = temp.path().join(file);
+ replace_pattern_in_file(&path_containing_tests, "$TEST_STATUS", sub_pattern)?;
+ }
+
+ Ok(temp)
+ }
+}
+
+fn replace_pattern_in_file(filename: &Path, from: &str, to: &str) -> Result<()> {
+ let contents = fs::read_to_string(filename)?;
+ File::create(filename)?.write_all(contents.replace(from, to).as_bytes())?;
+
+ Ok(())
+}
+
+/// Read the contents of the provided file into memory and then iterate through
+/// the list of strings asserting that the file contains all of them.
+pub fn assert_contains_strings<P: AsRef<Path>>(filename: P, strings: &[&str]) {
+ let filename = filename.as_ref();
+ let content = fs::read_to_string(filename).expect("Couldn't read the file's contents");
+
+ for s in strings {
+ assert!(
+ content.contains(s),
+ "Searching for {:?} in {}\n\n{}",
+ s,
+ filename.display(),
+ content
+ );
+ }
+}
+
+pub fn assert_doesnt_contain_strings<P: AsRef<Path>>(filename: P, strings: &[&str]) {
+ let filename = filename.as_ref();
+ let content = fs::read_to_string(filename).expect("Couldn't read the file's contents");
+
+ for s in strings {
+ assert!(
+ !content.contains(s),
+ "Found {:?} in {}\n\n{}",
+ s,
+ filename.display(),
+ content
+ );
+ }
+}
+
+/// Recursively copy an entire directory tree to somewhere else (a la `cp -r`).
+fn recursive_copy<A: AsRef<Path>, B: AsRef<Path>>(from: A, to: B) -> Result<()> {
+ let from = from.as_ref();
+ let to = to.as_ref();
+
+ for entry in WalkDir::new(&from) {
+ let entry = entry.with_context(|| "Unable to inspect directory entry")?;
+
+ let original_location = entry.path();
+ let relative = original_location
+ .strip_prefix(&from)
+ .expect("`original_location` is inside the `from` directory");
+ let new_location = to.join(relative);
+
+ if original_location.is_file() {
+ if let Some(parent) = new_location.parent() {
+ fs::create_dir_all(parent).with_context(|| "Couldn't create directory")?;
+ }
+
+ fs::copy(&original_location, &new_location)
+ .with_context(|| "Unable to copy file contents")?;
+ }
+ }
+
+ Ok(())
+}
+
+pub fn new_copy_of_example_book() -> Result<TempDir> {
+ let temp = TempFileBuilder::new().prefix("guide").tempdir()?;
+
+ let guide = Path::new(env!("CARGO_MANIFEST_DIR")).join("guide");
+
+ recursive_copy(guide, temp.path())?;
+
+ Ok(temp)
+}
diff --git a/vendor/mdbook/tests/dummy_book/src/README.md b/vendor/mdbook/tests/dummy_book/src/README.md
new file mode 100644
index 000000000..7d946e35d
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/README.md
@@ -0,0 +1,5 @@
+# Dummy Book
+
+This file is just here to cause the index preprocessor to run.
+
+Does a pretty good job, too. \ No newline at end of file
diff --git a/vendor/mdbook/tests/dummy_book/src/SUMMARY.md b/vendor/mdbook/tests/dummy_book/src/SUMMARY.md
new file mode 100644
index 000000000..49b64a545
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/SUMMARY.md
@@ -0,0 +1,22 @@
+# Summary
+
+[Dummy Book](README.md)
+
+---
+
+[Introduction](intro.md)
+
+- [First Chapter](first/index.md)
+ - [Nested Chapter](first/nested.md)
+ - [Includes](first/includes.md)
+ - [Recursive](first/recursive.md)
+ - [Markdown](first/markdown.md)
+ - [Unicode](first/unicode.md)
+ - [No Headers](first/no-headers.md)
+ - [Duplicate Headers](first/duplicate-headers.md)
+- [Second Chapter](second.md)
+ - [Nested Chapter](second/nested.md)
+
+---
+
+[Conclusion](conclusion.md)
diff --git a/vendor/mdbook/tests/dummy_book/src/conclusion.md b/vendor/mdbook/tests/dummy_book/src/conclusion.md
new file mode 100644
index 000000000..ba121c1fd
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/conclusion.md
@@ -0,0 +1,20 @@
+# Conclusion
+
+<p>
+<!--secret secret-->
+I put &lt;HTML&gt; in here!<br/>
+</p>
+<script type="text/javascript" >
+// I probably shouldn't do this
+if (3 < 5 > 10)
+{
+ alert("The sky is falling!");
+}
+</script >
+<style >
+/*
+css looks, like this {
+ foo: < 3 <bar >
+}
+*/
+</style>
diff --git a/vendor/mdbook/tests/dummy_book/src/example.rs b/vendor/mdbook/tests/dummy_book/src/example.rs
new file mode 100644
index 000000000..6b49705c1
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/example.rs
@@ -0,0 +1,6 @@
+fn main() {
+ println!("Hello World!");
+#
+# // You can even hide lines! :D
+# println!("I am hidden! Expand the code snippet to see me");
+}
diff --git a/vendor/mdbook/tests/dummy_book/src/first/duplicate-headers.md b/vendor/mdbook/tests/dummy_book/src/first/duplicate-headers.md
new file mode 100644
index 000000000..83522b440
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/duplicate-headers.md
@@ -0,0 +1,9 @@
+# Duplicate headers
+
+This page validates behaviour of duplicate headers.
+
+# Header Text
+
+# Header Text
+
+# header-text
diff --git a/vendor/mdbook/tests/dummy_book/src/first/includes.md b/vendor/mdbook/tests/dummy_book/src/first/includes.md
new file mode 100644
index 000000000..a5a2fef1f
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/includes.md
@@ -0,0 +1,3 @@
+# Includes
+
+{{#include ../SUMMARY.md::}} \ No newline at end of file
diff --git a/vendor/mdbook/tests/dummy_book/src/first/index.md b/vendor/mdbook/tests/dummy_book/src/first/index.md
new file mode 100644
index 000000000..200672b9c
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/index.md
@@ -0,0 +1,5 @@
+# First Chapter
+
+more text.
+
+## Some Section
diff --git a/vendor/mdbook/tests/dummy_book/src/first/markdown.md b/vendor/mdbook/tests/dummy_book/src/first/markdown.md
new file mode 100644
index 000000000..d65d3d389
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/markdown.md
@@ -0,0 +1,29 @@
+# Markdown tests
+
+Tests for some markdown output.
+
+## Tables
+
+| foo | bar |
+| --- | --- |
+| baz | bim |
+
+## Footnotes
+
+Footnote example[^1], or with a word[^word].
+
+[^1]: This is a footnote.
+
+[^word]: A longer footnote.
+ With multiple lines.
+ Third line.
+
+## Strikethrough
+
+~~strikethrough example~~
+
+## Tasklisks
+
+- [X] Apples
+- [X] Broccoli
+- [ ] Carrots
diff --git a/vendor/mdbook/tests/dummy_book/src/first/nested-test-with-anchors.rs b/vendor/mdbook/tests/dummy_book/src/first/nested-test-with-anchors.rs
new file mode 100644
index 000000000..783ab14de
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/nested-test-with-anchors.rs
@@ -0,0 +1,11 @@
+// The next line will cause a `testing` test to fail if the anchor feature is broken in such a way
+// that the whole file gets mistakenly included.
+assert!(!$TEST_STATUS);
+
+// ANCHOR: myanchor
+// ANCHOR: unendinganchor
+// The next line will cause a `rendered_output` test to fail if the anchor feature is broken in
+// such a way that the content between anchors isn't included.
+// unique-string-for-anchor-test
+assert!($TEST_STATUS);
+// ANCHOR_END: myanchor
diff --git a/vendor/mdbook/tests/dummy_book/src/first/nested-test.rs b/vendor/mdbook/tests/dummy_book/src/first/nested-test.rs
new file mode 100644
index 000000000..2bc46e01a
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/nested-test.rs
@@ -0,0 +1 @@
+assert!($TEST_STATUS);
diff --git a/vendor/mdbook/tests/dummy_book/src/first/nested.md b/vendor/mdbook/tests/dummy_book/src/first/nested.md
new file mode 100644
index 000000000..ae90763a0
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/nested.md
@@ -0,0 +1,31 @@
+# Nested Chapter
+
+This file has some testable code.
+
+```rust
+assert!($TEST_STATUS);
+```
+
+## Some Section
+
+```rust
+{{#include nested-test.rs}}
+```
+
+## Anchors include the part of a file between special comments
+
+```rust
+{{#include nested-test-with-anchors.rs:myanchor}}
+```
+
+## Rustdoc include adds the rest of the file as hidden
+
+```rust
+{{#rustdoc_include partially-included-test.rs:5:7}}
+```
+
+## Rustdoc include works with anchors too
+
+```rust
+{{#rustdoc_include partially-included-test-with-anchors.rs:rustdoc-include-anchor}}
+```
diff --git a/vendor/mdbook/tests/dummy_book/src/first/no-headers.md b/vendor/mdbook/tests/dummy_book/src/first/no-headers.md
new file mode 100644
index 000000000..5d799aa68
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/no-headers.md
@@ -0,0 +1,5 @@
+Capybara capybara capybara.
+
+Capybara capybara capybara.
+
+ThisLongWordIsIncludedSoWeCanCheckThatSufficientlyLongWordsAreOmittedFromTheSearchIndex.
diff --git a/vendor/mdbook/tests/dummy_book/src/first/partially-included-test-with-anchors.rs b/vendor/mdbook/tests/dummy_book/src/first/partially-included-test-with-anchors.rs
new file mode 100644
index 000000000..17b6afeff
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/partially-included-test-with-anchors.rs
@@ -0,0 +1,11 @@
+fn some_other_function() {
+ // ANCHOR: unused-anchor-that-should-be-stripped
+ assert!($TEST_STATUS);
+ // ANCHOR_END: unused-anchor-that-should-be-stripped
+}
+
+// ANCHOR: rustdoc-include-anchor
+fn main() {
+ some_other_function();
+}
+// ANCHOR_END: rustdoc-include-anchor
diff --git a/vendor/mdbook/tests/dummy_book/src/first/partially-included-test.rs b/vendor/mdbook/tests/dummy_book/src/first/partially-included-test.rs
new file mode 100644
index 000000000..1f8421b54
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/partially-included-test.rs
@@ -0,0 +1,7 @@
+fn some_function() {
+ assert!($TEST_STATUS);
+}
+
+fn main() {
+ some_function();
+}
diff --git a/vendor/mdbook/tests/dummy_book/src/first/recursive.md b/vendor/mdbook/tests/dummy_book/src/first/recursive.md
new file mode 100644
index 000000000..cb82a52f1
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/recursive.md
@@ -0,0 +1,2 @@
+Around the world, around the world
+{{#include recursive.md}}
diff --git a/vendor/mdbook/tests/dummy_book/src/first/unicode.md b/vendor/mdbook/tests/dummy_book/src/first/unicode.md
new file mode 100644
index 000000000..160cc367d
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/first/unicode.md
@@ -0,0 +1,21 @@
+# Unicode stress tests
+
+Please be careful editing, this contains carefully crafted characters.
+
+Two byte character: spatiëring
+
+Combining character: spatiëring
+
+Three byte character: 书こんにちは
+
+Four byte character: 𐌀‮𐌁‮𐌂‮𐌃‮𐌄‮𐌅‮𐌆‮𐌇‮𐌈‬
+
+Right-to-left: مرحبا
+
+Emoticons: 🔊 😍 💜 1️⃣
+
+right-to-left mark: hello באמת!‏
+
+
+Zalgo: ǫ̛̖̱̗̝͈̋͒͋̏ͥͫ̒̆ͩ̏͌̾͊͐ͪ̾̚
+
diff --git a/vendor/mdbook/tests/dummy_book/src/intro.md b/vendor/mdbook/tests/dummy_book/src/intro.md
new file mode 100644
index 000000000..1990ef58c
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/intro.md
@@ -0,0 +1,3 @@
+# Introduction
+
+Here's some interesting text... \ No newline at end of file
diff --git a/vendor/mdbook/tests/dummy_book/src/second.md b/vendor/mdbook/tests/dummy_book/src/second.md
new file mode 100644
index 000000000..adf4fca62
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/second.md
@@ -0,0 +1,5 @@
+# Second Chapter
+
+This makes sure you can insert runnable Rust files.
+
+{{#playground example.rs}}
diff --git a/vendor/mdbook/tests/dummy_book/src/second/nested.md b/vendor/mdbook/tests/dummy_book/src/second/nested.md
new file mode 100644
index 000000000..faf1187ff
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src/second/nested.md
@@ -0,0 +1,16 @@
+# Testing relative links for the print page
+
+When we link to [the first section](../first/nested.md), it should work on
+both the print page and the non-print page.
+
+A [fragment link](#some-section) should work.
+
+Link [outside](../../std/foo/bar.html).
+
+![Some image](../images/picture.png)
+
+<a href="../first/markdown.md">HTML Link</a>
+
+<img src="../images/picture.png" alt="raw html">
+
+## Some section
diff --git a/vendor/mdbook/tests/dummy_book/src2/README.md b/vendor/mdbook/tests/dummy_book/src2/README.md
new file mode 100644
index 000000000..ba23d94ef
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src2/README.md
@@ -0,0 +1 @@
+# Root README
diff --git a/vendor/mdbook/tests/dummy_book/src2/SUMMARY.md b/vendor/mdbook/tests/dummy_book/src2/SUMMARY.md
new file mode 100644
index 000000000..6b279fc48
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src2/SUMMARY.md
@@ -0,0 +1,7 @@
+# This dummy book is for testing the conversion of README.md to index.html by IndexPreprocessor
+
+[Root README](README.md)
+
+- [1st README](first/README.md)
+- [2nd README](second/README.md)
+ - [2nd index](second/index.md)
diff --git a/vendor/mdbook/tests/dummy_book/src2/first/README.md b/vendor/mdbook/tests/dummy_book/src2/first/README.md
new file mode 100644
index 000000000..d062d2ccd
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src2/first/README.md
@@ -0,0 +1 @@
+# First README
diff --git a/vendor/mdbook/tests/dummy_book/src2/second/README.md b/vendor/mdbook/tests/dummy_book/src2/second/README.md
new file mode 100644
index 000000000..be81f856f
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src2/second/README.md
@@ -0,0 +1 @@
+# Second README
diff --git a/vendor/mdbook/tests/dummy_book/src2/second/index.md b/vendor/mdbook/tests/dummy_book/src2/second/index.md
new file mode 100644
index 000000000..f23274504
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/src2/second/index.md
@@ -0,0 +1 @@
+# Second index
diff --git a/vendor/mdbook/tests/dummy_book/summary-formatting/SUMMARY.md b/vendor/mdbook/tests/dummy_book/summary-formatting/SUMMARY.md
new file mode 100644
index 000000000..336218d82
--- /dev/null
+++ b/vendor/mdbook/tests/dummy_book/summary-formatting/SUMMARY.md
@@ -0,0 +1,6 @@
+# Summary formatting tests
+
+- [*Italic* `code` \*escape\* \`escape2\`](formatted-summary.md)
+- [Soft
+line break](soft.md)
+- [\<escaped tag\>](escaped-tag.md)
diff --git a/vendor/mdbook/tests/init.rs b/vendor/mdbook/tests/init.rs
new file mode 100644
index 000000000..4deb84019
--- /dev/null
+++ b/vendor/mdbook/tests/init.rs
@@ -0,0 +1,144 @@
+use mdbook::config::Config;
+use mdbook::MDBook;
+use std::fs;
+use std::fs::File;
+use std::io::prelude::*;
+use std::path::PathBuf;
+use tempfile::Builder as TempFileBuilder;
+
+/// Run `mdbook init` in an empty directory and make sure the default files
+/// are created.
+#[test]
+fn base_mdbook_init_should_create_default_content() {
+ let created_files = vec!["book", "src", "src/SUMMARY.md", "src/chapter_1.md"];
+
+ let temp = TempFileBuilder::new().prefix("mdbook").tempdir().unwrap();
+ for file in &created_files {
+ assert!(!temp.path().join(file).exists());
+ }
+
+ MDBook::init(temp.path()).build().unwrap();
+
+ for file in &created_files {
+ let target = temp.path().join(file);
+ println!("{}", target.display());
+ assert!(target.exists(), "{} doesn't exist", file);
+ }
+
+ let contents = fs::read_to_string(temp.path().join("book.toml")).unwrap();
+ assert_eq!(
+ contents,
+ "[book]\nauthors = []\nlanguage = \"en\"\nmultilingual = false\nsrc = \"src\"\n"
+ );
+}
+
+/// Run `mdbook init` in a directory containing a SUMMARY.md should create the
+/// files listed in the summary.
+#[test]
+fn run_mdbook_init_should_create_content_from_summary() {
+ let created_files = vec!["intro.md", "first.md", "outro.md"];
+
+ let temp = TempFileBuilder::new().prefix("mdbook").tempdir().unwrap();
+ let src_dir = temp.path().join("src");
+ fs::create_dir_all(src_dir.clone()).unwrap();
+ static SUMMARY: &str = r#"# Summary
+
+[intro](intro.md)
+
+- [First chapter](first.md)
+
+[outro](outro.md)
+
+"#;
+
+ let mut summary = File::create(src_dir.join("SUMMARY.md")).unwrap();
+ summary.write_all(SUMMARY.as_bytes()).unwrap();
+ MDBook::init(temp.path()).build().unwrap();
+
+ for file in &created_files {
+ let target = src_dir.join(file);
+ println!("{}", target.display());
+ assert!(target.exists(), "{} doesn't exist", file);
+ }
+}
+
+/// Set some custom arguments for where to place the source and destination
+/// files, then call `mdbook init`.
+#[test]
+fn run_mdbook_init_with_custom_book_and_src_locations() {
+ let created_files = vec!["out", "in", "in/SUMMARY.md", "in/chapter_1.md"];
+
+ let temp = TempFileBuilder::new().prefix("mdbook").tempdir().unwrap();
+ for file in &created_files {
+ assert!(
+ !temp.path().join(file).exists(),
+ "{} shouldn't exist yet!",
+ file
+ );
+ }
+
+ let mut cfg = Config::default();
+ cfg.book.src = PathBuf::from("in");
+ cfg.build.build_dir = PathBuf::from("out");
+
+ MDBook::init(temp.path()).with_config(cfg).build().unwrap();
+
+ for file in &created_files {
+ let target = temp.path().join(file);
+ assert!(
+ target.exists(),
+ "{} should have been created by `mdbook init`",
+ file
+ );
+ }
+
+ let contents = fs::read_to_string(temp.path().join("book.toml")).unwrap();
+ assert_eq!(
+ contents,
+ "[book]\nauthors = []\nlanguage = \"en\"\nmultilingual = false\nsrc = \"in\"\n\n[build]\nbuild-dir = \"out\"\ncreate-missing = true\nuse-default-preprocessors = true\n"
+ );
+}
+
+#[test]
+fn book_toml_isnt_required() {
+ let temp = TempFileBuilder::new().prefix("mdbook").tempdir().unwrap();
+ let md = MDBook::init(temp.path()).build().unwrap();
+
+ let _ = fs::remove_file(temp.path().join("book.toml"));
+
+ md.build().unwrap();
+}
+
+#[test]
+fn copy_theme() {
+ let temp = TempFileBuilder::new().prefix("mdbook").tempdir().unwrap();
+ MDBook::init(temp.path()).copy_theme(true).build().unwrap();
+ let expected = vec![
+ "book.js",
+ "css/chrome.css",
+ "css/general.css",
+ "css/print.css",
+ "css/variables.css",
+ "favicon.png",
+ "favicon.svg",
+ "highlight.css",
+ "highlight.js",
+ "index.hbs",
+ ];
+ let theme_dir = temp.path().join("theme");
+ let mut actual: Vec<_> = walkdir::WalkDir::new(&theme_dir)
+ .into_iter()
+ .filter_map(|e| e.ok())
+ .filter(|e| !e.file_type().is_dir())
+ .map(|e| {
+ e.path()
+ .strip_prefix(&theme_dir)
+ .unwrap()
+ .to_str()
+ .unwrap()
+ .replace('\\', "/")
+ })
+ .collect();
+ actual.sort();
+ assert_eq!(actual, expected);
+}
diff --git a/vendor/mdbook/tests/parse_existing_summary_files.rs b/vendor/mdbook/tests/parse_existing_summary_files.rs
new file mode 100644
index 000000000..418ec31fe
--- /dev/null
+++ b/vendor/mdbook/tests/parse_existing_summary_files.rs
@@ -0,0 +1,43 @@
+//! Some integration tests to make sure the `SUMMARY.md` parser can deal with
+//! some real-life examples.
+
+use mdbook::book;
+use std::fs::File;
+use std::io::Read;
+use std::path::Path;
+
+macro_rules! summary_md_test {
+ ($name:ident, $filename:expr) => {
+ #[test]
+ fn $name() {
+ env_logger::try_init().ok();
+
+ let filename = Path::new(env!("CARGO_MANIFEST_DIR"))
+ .join("tests")
+ .join("summary_md_files")
+ .join($filename);
+
+ if !filename.exists() {
+ panic!("{} Doesn't exist", filename.display());
+ }
+
+ let mut content = String::new();
+ File::open(&filename)
+ .unwrap()
+ .read_to_string(&mut content)
+ .unwrap();
+
+ if let Err(e) = book::parse_summary(&content) {
+ eprintln!("Error parsing {}", filename.display());
+ eprintln!();
+ eprintln!("{:?}", e);
+ panic!();
+ }
+ }
+ };
+}
+
+summary_md_test!(rust_by_example, "rust_by_example.md");
+summary_md_test!(rust_ffi_guide, "rust_ffi_guide.md");
+summary_md_test!(example_book, "example_book.md");
+summary_md_test!(the_book_2nd_edition, "the_book-2nd_edition.md");
diff --git a/vendor/mdbook/tests/rendered_output.rs b/vendor/mdbook/tests/rendered_output.rs
new file mode 100644
index 000000000..9750a35e2
--- /dev/null
+++ b/vendor/mdbook/tests/rendered_output.rs
@@ -0,0 +1,844 @@
+#[macro_use]
+extern crate pretty_assertions;
+
+mod dummy_book;
+
+use crate::dummy_book::{assert_contains_strings, assert_doesnt_contain_strings, DummyBook};
+
+use anyhow::Context;
+use mdbook::config::Config;
+use mdbook::errors::*;
+use mdbook::utils::fs::write_file;
+use mdbook::MDBook;
+use select::document::Document;
+use select::predicate::{Class, Name, Predicate};
+use std::collections::HashMap;
+use std::ffi::OsStr;
+use std::fs;
+use std::io::Write;
+use std::path::{Component, Path, PathBuf};
+use std::str::FromStr;
+use tempfile::Builder as TempFileBuilder;
+use walkdir::{DirEntry, WalkDir};
+
+const BOOK_ROOT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/dummy_book");
+const TOC_TOP_LEVEL: &[&str] = &[
+ "1. First Chapter",
+ "2. Second Chapter",
+ "Conclusion",
+ "Dummy Book",
+ "Introduction",
+];
+const TOC_SECOND_LEVEL: &[&str] = &[
+ "1.1. Nested Chapter",
+ "1.2. Includes",
+ "1.3. Recursive",
+ "1.4. Markdown",
+ "1.5. Unicode",
+ "1.6. No Headers",
+ "1.7. Duplicate Headers",
+ "2.1. Nested Chapter",
+];
+
+/// Make sure you can load the dummy book and build it without panicking.
+#[test]
+fn build_the_dummy_book() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+
+ md.build().unwrap();
+}
+
+#[test]
+fn by_default_mdbook_generates_rendered_content_in_the_book_directory() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+
+ assert!(!temp.path().join("book").exists());
+ md.build().unwrap();
+
+ assert!(temp.path().join("book").exists());
+ let index_file = md.build_dir_for("html").join("index.html");
+ assert!(index_file.exists());
+}
+
+#[test]
+fn make_sure_bottom_level_files_contain_links_to_chapters() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let dest = temp.path().join("book");
+ let links = vec![
+ r#"href="intro.html""#,
+ r#"href="first/index.html""#,
+ r#"href="first/nested.html""#,
+ r#"href="second.html""#,
+ r#"href="conclusion.html""#,
+ ];
+
+ let files_in_bottom_dir = vec!["index.html", "intro.html", "second.html", "conclusion.html"];
+
+ for filename in files_in_bottom_dir {
+ assert_contains_strings(dest.join(filename), &links);
+ }
+}
+
+#[test]
+fn check_correct_cross_links_in_nested_dir() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let first = temp.path().join("book").join("first");
+ let links = vec![
+ r#"href="../intro.html""#,
+ r#"href="../first/index.html""#,
+ r#"href="../first/nested.html""#,
+ r#"href="../second.html""#,
+ r#"href="../conclusion.html""#,
+ ];
+
+ let files_in_nested_dir = vec!["index.html", "nested.html"];
+
+ for filename in files_in_nested_dir {
+ assert_contains_strings(first.join(filename), &links);
+ }
+
+ assert_contains_strings(
+ first.join("index.html"),
+ &[r##"<h2 id="some-section"><a class="header" href="#some-section">"##],
+ );
+
+ assert_contains_strings(
+ first.join("nested.html"),
+ &[r##"<h2 id="some-section"><a class="header" href="#some-section">"##],
+ );
+}
+
+#[test]
+fn check_correct_relative_links_in_print_page() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let first = temp.path().join("book");
+
+ assert_contains_strings(
+ first.join("print.html"),
+ &[
+ r##"<a href="second/../first/nested.html">the first section</a>,"##,
+ r##"<a href="second/../../std/foo/bar.html">outside</a>"##,
+ r##"<img src="second/../images/picture.png" alt="Some image" />"##,
+ r##"<a href="second/nested.html#some-section">fragment link</a>"##,
+ r##"<a href="second/../first/markdown.html">HTML Link</a>"##,
+ r##"<img src="second/../images/picture.png" alt="raw html">"##,
+ ],
+ );
+}
+
+#[test]
+fn rendered_code_has_playground_stuff() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let nested = temp.path().join("book/first/nested.html");
+ let playground_class = vec![r#"class="playground""#];
+
+ assert_contains_strings(nested, &playground_class);
+
+ let book_js = temp.path().join("book/book.js");
+ assert_contains_strings(book_js, &[".playground"]);
+}
+
+#[test]
+fn rendered_code_does_not_have_playground_stuff_in_html_when_disabled_in_config() {
+ let temp = DummyBook::new().build().unwrap();
+ let config = Config::from_str(
+ "
+ [output.html.playground]
+ runnable = false
+ ",
+ )
+ .unwrap();
+ let md = MDBook::load_with_config(temp.path(), config).unwrap();
+ md.build().unwrap();
+
+ let nested = temp.path().join("book/first/nested.html");
+ let playground_class = vec![r#"class="playground""#];
+
+ assert_doesnt_contain_strings(nested, &playground_class);
+}
+
+#[test]
+fn anchors_include_text_between_but_not_anchor_comments() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let nested = temp.path().join("book/first/nested.html");
+ let text_between_anchors = vec!["unique-string-for-anchor-test"];
+ let anchor_text = vec!["ANCHOR"];
+
+ assert_contains_strings(nested.clone(), &text_between_anchors);
+ assert_doesnt_contain_strings(nested, &anchor_text);
+}
+
+#[test]
+fn rustdoc_include_hides_the_unspecified_part_of_the_file() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let nested = temp.path().join("book/first/nested.html");
+ let text = vec![
+ "<span class=\"boring\">fn some_function() {",
+ "<span class=\"boring\">fn some_other_function() {",
+ ];
+
+ assert_contains_strings(nested, &text);
+}
+
+#[test]
+fn chapter_content_appears_in_rendered_document() {
+ let content = vec![
+ ("index.html", "This file is just here to cause the"),
+ ("intro.html", "Here's some interesting text"),
+ ("second.html", "Second Chapter"),
+ ("first/nested.html", "testable code"),
+ ("first/index.html", "more text"),
+ ("conclusion.html", "Conclusion"),
+ ];
+
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let destination = temp.path().join("book");
+
+ for (filename, text) in content {
+ let path = destination.join(filename);
+ assert_contains_strings(path, &[text]);
+ }
+}
+
+/// Apply a series of predicates to some root predicate, where each
+/// successive predicate is the descendant of the last one. Similar to how you
+/// might do `ul.foo li a` in CSS to access all anchor tags in the `foo` list.
+macro_rules! descendants {
+ ($root:expr, $($child:expr),*) => {
+ $root
+ $(
+ .descendant($child)
+ )*
+ };
+}
+
+/// Make sure that all `*.md` files (excluding `SUMMARY.md`) were rendered
+/// and placed in the `book` directory with their extensions set to `*.html`.
+#[test]
+fn chapter_files_were_rendered_to_html() {
+ let temp = DummyBook::new().build().unwrap();
+ let src = Path::new(BOOK_ROOT).join("src");
+
+ let chapter_files = WalkDir::new(&src)
+ .into_iter()
+ .filter_entry(|entry| entry_ends_with(entry, ".md"))
+ .filter_map(std::result::Result::ok)
+ .map(|entry| entry.path().to_path_buf())
+ .filter(|path| path.file_name().and_then(OsStr::to_str) != Some("SUMMARY.md"));
+
+ for chapter in chapter_files {
+ let rendered_location = temp
+ .path()
+ .join(chapter.strip_prefix(&src).unwrap())
+ .with_extension("html");
+ assert!(
+ rendered_location.exists(),
+ "{} doesn't exits",
+ rendered_location.display()
+ );
+ }
+}
+
+fn entry_ends_with(entry: &DirEntry, ending: &str) -> bool {
+ entry.file_name().to_string_lossy().ends_with(ending)
+}
+
+/// Read the main page (`book/index.html`) and expose it as a DOM which we
+/// can search with the `select` crate
+fn root_index_html() -> Result<Document> {
+ let temp = DummyBook::new()
+ .build()
+ .with_context(|| "Couldn't create the dummy book")?;
+ MDBook::load(temp.path())?
+ .build()
+ .with_context(|| "Book building failed")?;
+
+ let index_page = temp.path().join("book").join("index.html");
+ let html = fs::read_to_string(&index_page).with_context(|| "Unable to read index.html")?;
+
+ Ok(Document::from(html.as_str()))
+}
+
+#[test]
+fn check_second_toc_level() {
+ let doc = root_index_html().unwrap();
+ let mut should_be = Vec::from(TOC_SECOND_LEVEL);
+ should_be.sort_unstable();
+
+ let pred = descendants!(
+ Class("chapter"),
+ Name("li"),
+ Name("li"),
+ Name("a").and(Class("toggle").not())
+ );
+
+ let mut children_of_children: Vec<_> = doc
+ .find(pred)
+ .map(|elem| elem.text().trim().to_string())
+ .collect();
+ children_of_children.sort();
+
+ assert_eq!(children_of_children, should_be);
+}
+
+#[test]
+fn check_first_toc_level() {
+ let doc = root_index_html().unwrap();
+ let mut should_be = Vec::from(TOC_TOP_LEVEL);
+
+ should_be.extend(TOC_SECOND_LEVEL);
+ should_be.sort_unstable();
+
+ let pred = descendants!(
+ Class("chapter"),
+ Name("li"),
+ Name("a").and(Class("toggle").not())
+ );
+
+ let mut children: Vec<_> = doc
+ .find(pred)
+ .map(|elem| elem.text().trim().to_string())
+ .collect();
+ children.sort();
+
+ assert_eq!(children, should_be);
+}
+
+#[test]
+fn check_spacers() {
+ let doc = root_index_html().unwrap();
+ let should_be = 2;
+
+ let num_spacers = doc
+ .find(Class("chapter").descendant(Name("li").and(Class("spacer"))))
+ .count();
+ assert_eq!(num_spacers, should_be);
+}
+
+/// Ensure building fails if `create-missing` is false and one of the files does
+/// not exist.
+#[test]
+fn failure_on_missing_file() {
+ let temp = DummyBook::new().build().unwrap();
+ fs::remove_file(temp.path().join("src").join("intro.md")).unwrap();
+
+ let mut cfg = Config::default();
+ cfg.build.create_missing = false;
+
+ let got = MDBook::load_with_config(temp.path(), cfg);
+ assert!(got.is_err());
+}
+
+/// Ensure a missing file is created if `create-missing` is true.
+#[test]
+fn create_missing_file_with_config() {
+ let temp = DummyBook::new().build().unwrap();
+ fs::remove_file(temp.path().join("src").join("intro.md")).unwrap();
+
+ let mut cfg = Config::default();
+ cfg.build.create_missing = true;
+
+ assert!(!temp.path().join("src").join("intro.md").exists());
+ let _md = MDBook::load_with_config(temp.path(), cfg).unwrap();
+ assert!(temp.path().join("src").join("intro.md").exists());
+}
+
+/// This makes sure you can include a Rust file with `{{#playground example.rs}}`.
+/// Specification is in `guide/src/format/rust.md`
+#[test]
+fn able_to_include_playground_files_in_chapters() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let second = temp.path().join("book/second.html");
+
+ let playground_strings = &[
+ r#"class="playground""#,
+ r#"println!(&quot;Hello World!&quot;);"#,
+ ];
+
+ assert_contains_strings(&second, playground_strings);
+ assert_doesnt_contain_strings(&second, &["{{#playground example.rs}}"]);
+}
+
+/// This makes sure you can include a Rust file with `{{#include ../SUMMARY.md}}`.
+#[test]
+fn able_to_include_files_in_chapters() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let includes = temp.path().join("book/first/includes.html");
+
+ let summary_strings = &[
+ r##"<h1 id="summary"><a class="header" href="#summary">Summary</a></h1>"##,
+ ">First Chapter</a>",
+ ];
+ assert_contains_strings(&includes, summary_strings);
+
+ assert_doesnt_contain_strings(&includes, &["{{#include ../SUMMARY.md::}}"]);
+}
+
+/// Ensure cyclic includes are capped so that no exceptions occur
+#[test]
+fn recursive_includes_are_capped() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let recursive = temp.path().join("book/first/recursive.html");
+ let content = &["Around the world, around the world
+Around the world, around the world
+Around the world, around the world"];
+ assert_contains_strings(&recursive, content);
+}
+
+#[test]
+fn example_book_can_build() {
+ let example_book_dir = dummy_book::new_copy_of_example_book().unwrap();
+
+ let md = MDBook::load(example_book_dir.path()).unwrap();
+
+ md.build().unwrap();
+}
+
+#[test]
+fn book_with_a_reserved_filename_does_not_build() {
+ let tmp_dir = TempFileBuilder::new().prefix("mdBook").tempdir().unwrap();
+ let src_path = tmp_dir.path().join("src");
+ fs::create_dir(&src_path).unwrap();
+
+ let summary_path = src_path.join("SUMMARY.md");
+ let print_path = src_path.join("print.md");
+
+ fs::File::create(print_path).unwrap();
+ let mut summary_file = fs::File::create(summary_path).unwrap();
+ writeln!(summary_file, "[print](print.md)").unwrap();
+
+ let md = MDBook::load(tmp_dir.path()).unwrap();
+ let got = md.build();
+ assert!(got.is_err());
+}
+
+#[test]
+fn by_default_mdbook_use_index_preprocessor_to_convert_readme_to_index() {
+ let temp = DummyBook::new().build().unwrap();
+ let mut cfg = Config::default();
+ cfg.set("book.src", "src2")
+ .expect("Couldn't set config.book.src to \"src2\".");
+ let md = MDBook::load_with_config(temp.path(), cfg).unwrap();
+ md.build().unwrap();
+
+ let first_index = temp.path().join("book").join("first").join("index.html");
+ let expected_strings = vec![
+ r#"href="../first/index.html""#,
+ r#"href="../second/index.html""#,
+ "First README",
+ ];
+ assert_contains_strings(&first_index, &expected_strings);
+ assert_doesnt_contain_strings(&first_index, &["README.html"]);
+
+ let second_index = temp.path().join("book").join("second").join("index.html");
+ let unexpected_strings = vec!["Second README"];
+ assert_doesnt_contain_strings(&second_index, &unexpected_strings);
+}
+
+#[test]
+fn first_chapter_is_copied_as_index_even_if_not_first_elem() {
+ let temp = DummyBook::new().build().unwrap();
+ let mut cfg = Config::default();
+ cfg.set("book.src", "index_html_test")
+ .expect("Couldn't set config.book.src to \"index_html_test\"");
+ let md = MDBook::load_with_config(temp.path(), cfg).unwrap();
+ md.build().unwrap();
+
+ let root = temp.path().join("book");
+ let chapter = fs::read_to_string(root.join("chapter_1.html")).expect("read chapter 1");
+ let index = fs::read_to_string(root.join("index.html")).expect("read index");
+ pretty_assertions::assert_eq!(chapter, index);
+}
+
+#[test]
+fn theme_dir_overrides_work_correctly() {
+ let book_dir = dummy_book::new_copy_of_example_book().unwrap();
+ let book_dir = book_dir.path();
+ let theme_dir = book_dir.join("theme");
+
+ let mut index = mdbook::theme::INDEX.to_vec();
+ index.extend_from_slice(b"\n<!-- This is a modified index.hbs! -->");
+
+ write_file(&theme_dir, "index.hbs", &index).unwrap();
+
+ let md = MDBook::load(book_dir).unwrap();
+ md.build().unwrap();
+
+ let built_index = book_dir.join("book").join("index.html");
+ dummy_book::assert_contains_strings(built_index, &["This is a modified index.hbs!"]);
+}
+
+#[test]
+fn no_index_for_print_html() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let print_html = temp.path().join("book/print.html");
+ assert_contains_strings(print_html, &[r##"noindex"##]);
+
+ let index_html = temp.path().join("book/index.html");
+ assert_doesnt_contain_strings(index_html, &[r##"noindex"##]);
+}
+
+#[test]
+fn markdown_options() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let path = temp.path().join("book/first/markdown.html");
+ assert_contains_strings(
+ &path,
+ &[
+ "<th>foo</th>",
+ "<th>bar</th>",
+ "<td>baz</td>",
+ "<td>bim</td>",
+ ],
+ );
+ assert_contains_strings(
+ &path,
+ &[
+ r##"<sup class="footnote-reference"><a href="#1">1</a></sup>"##,
+ r##"<sup class="footnote-reference"><a href="#word">2</a></sup>"##,
+ r##"<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup>"##,
+ r##"<div class="footnote-definition" id="word"><sup class="footnote-definition-label">2</sup>"##,
+ ],
+ );
+ assert_contains_strings(&path, &["<del>strikethrough example</del>"]);
+ assert_contains_strings(
+ &path,
+ &[
+ "<li><input disabled=\"\" type=\"checkbox\" checked=\"\"/>\nApples",
+ "<li><input disabled=\"\" type=\"checkbox\" checked=\"\"/>\nBroccoli",
+ "<li><input disabled=\"\" type=\"checkbox\"/>\nCarrots",
+ ],
+ );
+}
+
+#[test]
+fn redirects_are_emitted_correctly() {
+ let temp = DummyBook::new().build().unwrap();
+ let mut md = MDBook::load(temp.path()).unwrap();
+
+ // override the "outputs.html.redirect" table
+ let redirects: HashMap<PathBuf, String> = vec![
+ (PathBuf::from("/overview.html"), String::from("index.html")),
+ (
+ PathBuf::from("/nexted/page.md"),
+ String::from("https://rust-lang.org/"),
+ ),
+ ]
+ .into_iter()
+ .collect();
+ md.config.set("output.html.redirect", &redirects).unwrap();
+
+ md.build().unwrap();
+
+ for (original, redirect) in &redirects {
+ let mut redirect_file = md.build_dir_for("html");
+ // append everything except the bits that make it absolute
+ // (e.g. "/" or "C:\")
+ redirect_file.extend(remove_absolute_components(original));
+ let contents = fs::read_to_string(&redirect_file).unwrap();
+ assert!(contents.contains(redirect));
+ }
+}
+
+#[test]
+fn edit_url_has_default_src_dir_edit_url() {
+ let temp = DummyBook::new().build().unwrap();
+ let book_toml = r#"
+ [book]
+ title = "implicit"
+
+ [output.html]
+ edit-url-template = "https://github.com/rust-lang/mdBook/edit/master/guide/{path}"
+ "#;
+
+ write_file(temp.path(), "book.toml", book_toml.as_bytes()).unwrap();
+
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let index_html = temp.path().join("book").join("index.html");
+ assert_contains_strings(
+ index_html,
+ &[
+ r#"href="https://github.com/rust-lang/mdBook/edit/master/guide/src/README.md" title="Suggest an edit""#,
+ ],
+ );
+}
+
+#[test]
+fn edit_url_has_configured_src_dir_edit_url() {
+ let temp = DummyBook::new().build().unwrap();
+ let book_toml = r#"
+ [book]
+ title = "implicit"
+ src = "src2"
+
+ [output.html]
+ edit-url-template = "https://github.com/rust-lang/mdBook/edit/master/guide/{path}"
+ "#;
+
+ write_file(temp.path(), "book.toml", book_toml.as_bytes()).unwrap();
+
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let index_html = temp.path().join("book").join("index.html");
+ assert_contains_strings(
+ index_html,
+ &[
+ r#"href="https://github.com/rust-lang/mdBook/edit/master/guide/src2/README.md" title="Suggest an edit""#,
+ ],
+ );
+}
+
+fn remove_absolute_components(path: &Path) -> impl Iterator<Item = Component> + '_ {
+ path.components().skip_while(|c| match c {
+ Component::Prefix(_) | Component::RootDir => true,
+ _ => false,
+ })
+}
+
+/// Checks formatting of summary names with inline elements.
+#[test]
+fn summary_with_markdown_formatting() {
+ let temp = DummyBook::new().build().unwrap();
+ let mut cfg = Config::default();
+ cfg.set("book.src", "summary-formatting").unwrap();
+ let md = MDBook::load_with_config(temp.path(), cfg).unwrap();
+ md.build().unwrap();
+
+ let rendered_path = temp.path().join("book/formatted-summary.html");
+ assert_contains_strings(
+ rendered_path,
+ &[
+ r#"<a href="formatted-summary.html" class="active"><strong aria-hidden="true">1.</strong> Italic code *escape* `escape2`</a>"#,
+ r#"<a href="soft.html"><strong aria-hidden="true">2.</strong> Soft line break</a>"#,
+ r#"<a href="escaped-tag.html"><strong aria-hidden="true">3.</strong> &lt;escaped tag&gt;</a>"#,
+ ],
+ );
+
+ let generated_md = temp.path().join("summary-formatting/formatted-summary.md");
+ assert_eq!(
+ fs::read_to_string(generated_md).unwrap(),
+ "# Italic code *escape* `escape2`\n"
+ );
+ let generated_md = temp.path().join("summary-formatting/soft.md");
+ assert_eq!(
+ fs::read_to_string(generated_md).unwrap(),
+ "# Soft line break\n"
+ );
+ let generated_md = temp.path().join("summary-formatting/escaped-tag.md");
+ assert_eq!(
+ fs::read_to_string(generated_md).unwrap(),
+ "# &lt;escaped tag&gt;\n"
+ );
+}
+
+/// Ensure building fails if `[output.html].theme` points to a non-existent directory
+#[test]
+fn failure_on_missing_theme_directory() {
+ // 1. Using default theme should work
+ let temp = DummyBook::new().build().unwrap();
+ let book_toml = r#"
+ [book]
+ title = "implicit"
+ src = "src"
+ "#;
+
+ write_file(temp.path(), "book.toml", book_toml.as_bytes()).unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ let got = md.build();
+ assert!(got.is_ok());
+
+ // 2. Pointing to a normal directory should work
+ let temp = DummyBook::new().build().unwrap();
+ let created = fs::create_dir(temp.path().join("theme-directory"));
+ assert!(created.is_ok());
+ let book_toml = r#"
+ [book]
+ title = "implicit"
+ src = "src"
+
+ [output.html]
+ theme = "./theme-directory"
+ "#;
+
+ write_file(temp.path(), "book.toml", book_toml.as_bytes()).unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ let got = md.build();
+ assert!(got.is_ok());
+
+ // 3. Pointing to a non-existent directory should fail
+ let temp = DummyBook::new().build().unwrap();
+ let book_toml = r#"
+ [book]
+ title = "implicit"
+ src = "src"
+
+ [output.html]
+ theme = "./non-existent-directory"
+ "#;
+
+ write_file(temp.path(), "book.toml", book_toml.as_bytes()).unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ let got = md.build();
+ assert!(got.is_err());
+}
+
+#[cfg(feature = "search")]
+mod search {
+ use crate::dummy_book::DummyBook;
+ use mdbook::MDBook;
+ use std::fs::{self, File};
+ use std::path::Path;
+
+ fn read_book_index(root: &Path) -> serde_json::Value {
+ let index = root.join("book/searchindex.js");
+ let index = fs::read_to_string(index).unwrap();
+ let index = index.trim_start_matches("Object.assign(window.search, ");
+ let index = index.trim_end_matches(");");
+ serde_json::from_str(index).unwrap()
+ }
+
+ #[test]
+ #[allow(clippy::float_cmp)]
+ fn book_creates_reasonable_search_index() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let index = read_book_index(temp.path());
+
+ let doc_urls = index["doc_urls"].as_array().unwrap();
+ let get_doc_ref =
+ |url: &str| -> String { doc_urls.iter().position(|s| s == url).unwrap().to_string() };
+
+ let first_chapter = get_doc_ref("first/index.html#first-chapter");
+ let introduction = get_doc_ref("intro.html#introduction");
+ let some_section = get_doc_ref("first/index.html#some-section");
+ let summary = get_doc_ref("first/includes.html#summary");
+ let no_headers = get_doc_ref("first/no-headers.html");
+ let duplicate_headers_1 = get_doc_ref("first/duplicate-headers.html#header-text-1");
+ let conclusion = get_doc_ref("conclusion.html#conclusion");
+
+ let bodyidx = &index["index"]["index"]["body"]["root"];
+ let textidx = &bodyidx["t"]["e"]["x"]["t"];
+ assert_eq!(textidx["df"], 5);
+ assert_eq!(textidx["docs"][&first_chapter]["tf"], 1.0);
+ assert_eq!(textidx["docs"][&introduction]["tf"], 1.0);
+
+ let docs = &index["index"]["documentStore"]["docs"];
+ assert_eq!(docs[&first_chapter]["body"], "more text.");
+ assert_eq!(docs[&some_section]["body"], "");
+ assert_eq!(
+ docs[&summary]["body"],
+ "Dummy Book Introduction First Chapter Nested Chapter Includes Recursive Markdown Unicode No Headers Duplicate Headers Second Chapter Nested Chapter Conclusion"
+ );
+ assert_eq!(
+ docs[&summary]["breadcrumbs"],
+ "First Chapter » Includes » Summary"
+ );
+ assert_eq!(docs[&conclusion]["body"], "I put &lt;HTML&gt; in here!");
+ assert_eq!(
+ docs[&no_headers]["breadcrumbs"],
+ "First Chapter » No Headers"
+ );
+ assert_eq!(
+ docs[&duplicate_headers_1]["breadcrumbs"],
+ "First Chapter » Duplicate Headers » Header Text"
+ );
+ assert_eq!(
+ docs[&no_headers]["body"],
+ "Capybara capybara capybara. Capybara capybara capybara. ThisLongWordIsIncludedSoWeCanCheckThatSufficientlyLongWordsAreOmittedFromTheSearchIndex."
+ );
+ }
+
+ // Setting this to `true` may cause issues with `cargo watch`,
+ // since it may not finish writing the fixture before the tests
+ // are run again.
+ const GENERATE_FIXTURE: bool = false;
+
+ fn get_fixture() -> serde_json::Value {
+ if GENERATE_FIXTURE {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let src = read_book_index(temp.path());
+
+ let dest = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/searchindex_fixture.json");
+ let dest = File::create(&dest).unwrap();
+ serde_json::to_writer_pretty(dest, &src).unwrap();
+
+ src
+ } else {
+ let json = include_str!("searchindex_fixture.json");
+ serde_json::from_str(json).expect("Unable to deserialize the fixture")
+ }
+ }
+
+ // So you've broken the test. If you changed dummy_book, it's probably
+ // safe to regenerate the fixture. If you haven't then make sure that the
+ // search index still works. Run `cargo run -- serve tests/dummy_book`
+ // and try some searches. Are you getting results? Do the teasers look OK?
+ // Are there new errors in the JS console?
+ //
+ // If you're pretty sure you haven't broken anything, change `GENERATE_FIXTURE`
+ // above to `true`, and run `cargo test` to generate a new fixture. Then
+ // **change it back to `false`**. Include the changed `searchindex_fixture.json` in your commit.
+ #[test]
+ fn search_index_hasnt_changed_accidentally() {
+ let temp = DummyBook::new().build().unwrap();
+ let md = MDBook::load(temp.path()).unwrap();
+ md.build().unwrap();
+
+ let book_index = read_book_index(temp.path());
+
+ let fixture_index = get_fixture();
+
+ // Uncomment this if you're okay with pretty-printing 32KB of JSON
+ //assert_eq!(fixture_index, book_index);
+
+ if book_index != fixture_index {
+ panic!("The search index has changed from the fixture");
+ }
+ }
+}
diff --git a/vendor/mdbook/tests/searchindex_fixture.json b/vendor/mdbook/tests/searchindex_fixture.json
new file mode 100644
index 000000000..3d7062d23
--- /dev/null
+++ b/vendor/mdbook/tests/searchindex_fixture.json
@@ -0,0 +1,6991 @@
+{
+ "doc_urls": [
+ "index.html#dummy-book",
+ "intro.html#introduction",
+ "first/index.html#first-chapter",
+ "first/index.html#some-section",
+ "first/nested.html#nested-chapter",
+ "first/nested.html#some-section",
+ "first/nested.html#anchors-include-the-part-of-a-file-between-special-comments",
+ "first/nested.html#rustdoc-include-adds-the-rest-of-the-file-as-hidden",
+ "first/nested.html#rustdoc-include-works-with-anchors-too",
+ "first/includes.html#includes",
+ "first/includes.html#summary",
+ "first/recursive.html",
+ "first/markdown.html#markdown-tests",
+ "first/markdown.html#tables",
+ "first/markdown.html#footnotes",
+ "first/markdown.html#strikethrough",
+ "first/markdown.html#tasklisks",
+ "first/unicode.html#unicode-stress-tests",
+ "first/no-headers.html",
+ "first/duplicate-headers.html#duplicate-headers",
+ "first/duplicate-headers.html#header-text",
+ "first/duplicate-headers.html#header-text-1",
+ "first/duplicate-headers.html#header-text-2",
+ "second.html#second-chapter",
+ "second/nested.html#testing-relative-links-for-the-print-page",
+ "second/nested.html#some-section",
+ "conclusion.html#conclusion"
+ ],
+ "index": {
+ "documentStore": {
+ "docInfo": {
+ "0": {
+ "body": 9,
+ "breadcrumbs": 4,
+ "title": 2
+ },
+ "1": {
+ "body": 3,
+ "breadcrumbs": 2,
+ "title": 1
+ },
+ "10": {
+ "body": 19,
+ "breadcrumbs": 4,
+ "title": 1
+ },
+ "11": {
+ "body": 44,
+ "breadcrumbs": 3,
+ "title": 2
+ },
+ "12": {
+ "body": 3,
+ "breadcrumbs": 5,
+ "title": 2
+ },
+ "13": {
+ "body": 4,
+ "breadcrumbs": 4,
+ "title": 1
+ },
+ "14": {
+ "body": 12,
+ "breadcrumbs": 4,
+ "title": 1
+ },
+ "15": {
+ "body": 2,
+ "breadcrumbs": 4,
+ "title": 1
+ },
+ "16": {
+ "body": 3,
+ "breadcrumbs": 4,
+ "title": 1
+ },
+ "17": {
+ "body": 29,
+ "breadcrumbs": 6,
+ "title": 3
+ },
+ "18": {
+ "body": 6,
+ "breadcrumbs": 3,
+ "title": 2
+ },
+ "19": {
+ "body": 5,
+ "breadcrumbs": 6,
+ "title": 2
+ },
+ "2": {
+ "body": 2,
+ "breadcrumbs": 4,
+ "title": 2
+ },
+ "20": {
+ "body": 0,
+ "breadcrumbs": 6,
+ "title": 2
+ },
+ "21": {
+ "body": 0,
+ "breadcrumbs": 6,
+ "title": 2
+ },
+ "22": {
+ "body": 0,
+ "breadcrumbs": 6,
+ "title": 2
+ },
+ "23": {
+ "body": 20,
+ "breadcrumbs": 4,
+ "title": 2
+ },
+ "24": {
+ "body": 18,
+ "breadcrumbs": 9,
+ "title": 5
+ },
+ "25": {
+ "body": 0,
+ "breadcrumbs": 5,
+ "title": 1
+ },
+ "26": {
+ "body": 3,
+ "breadcrumbs": 2,
+ "title": 1
+ },
+ "3": {
+ "body": 0,
+ "breadcrumbs": 3,
+ "title": 1
+ },
+ "4": {
+ "body": 4,
+ "breadcrumbs": 6,
+ "title": 2
+ },
+ "5": {
+ "body": 1,
+ "breadcrumbs": 5,
+ "title": 1
+ },
+ "6": {
+ "body": 21,
+ "breadcrumbs": 11,
+ "title": 7
+ },
+ "7": {
+ "body": 6,
+ "breadcrumbs": 10,
+ "title": 6
+ },
+ "8": {
+ "body": 6,
+ "breadcrumbs": 8,
+ "title": 4
+ },
+ "9": {
+ "body": 0,
+ "breadcrumbs": 4,
+ "title": 1
+ }
+ },
+ "docs": {
+ "0": {
+ "body": "This file is just here to cause the index preprocessor to run. Does a pretty good job, too.",
+ "breadcrumbs": "Dummy Book » Dummy Book",
+ "id": "0",
+ "title": "Dummy Book"
+ },
+ "1": {
+ "body": "Here's some interesting text...",
+ "breadcrumbs": "Introduction » Introduction",
+ "id": "1",
+ "title": "Introduction"
+ },
+ "10": {
+ "body": "Dummy Book Introduction First Chapter Nested Chapter Includes Recursive Markdown Unicode No Headers Duplicate Headers Second Chapter Nested Chapter Conclusion",
+ "breadcrumbs": "First Chapter » Includes » Summary",
+ "id": "10",
+ "title": "Summary"
+ },
+ "11": {
+ "body": "Around the world, around the world Around the world, around the world Around the world, around the world Around the world, around the world Around the world, around the world Around the world, around the world Around the world, around the world Around the world, around the world Around the world, around the world Around the world, around the world Around the world, around the world",
+ "breadcrumbs": "First Chapter » Recursive",
+ "id": "11",
+ "title": "First Chapter"
+ },
+ "12": {
+ "body": "Tests for some markdown output.",
+ "breadcrumbs": "First Chapter » Markdown » Markdown tests",
+ "id": "12",
+ "title": "Markdown tests"
+ },
+ "13": {
+ "body": "foo bar baz bim",
+ "breadcrumbs": "First Chapter » Markdown » Tables",
+ "id": "13",
+ "title": "Tables"
+ },
+ "14": {
+ "body": "Footnote example [1] , or with a word [2] . This is a footnote. A longer footnote. With multiple lines. Third line.",
+ "breadcrumbs": "First Chapter » Markdown » Footnotes",
+ "id": "14",
+ "title": "Footnotes"
+ },
+ "15": {
+ "body": "strikethrough example",
+ "breadcrumbs": "First Chapter » Markdown » Strikethrough",
+ "id": "15",
+ "title": "Strikethrough"
+ },
+ "16": {
+ "body": "Apples Broccoli Carrots",
+ "breadcrumbs": "First Chapter » Markdown » Tasklisks",
+ "id": "16",
+ "title": "Tasklisks"
+ },
+ "17": {
+ "body": "Please be careful editing, this contains carefully crafted characters. Two byte character: spatiëring Combining character: spatiëring Three byte character: 书こんにちは Four byte character: 𐌀‮𐌁‮𐌂‮𐌃‮𐌄‮𐌅‮𐌆‮𐌇‮𐌈‬ Right-to-left: مرحبا Emoticons: 🔊 😍 💜 1️⃣ right-to-left mark: hello באמת!‏ Zalgo: ǫ̛̖̱̗̝͈̋͒͋̏ͥͫ̒̆ͩ̏͌̾͊͐ͪ̾̚",
+ "breadcrumbs": "First Chapter » Unicode » Unicode stress tests",
+ "id": "17",
+ "title": "Unicode stress tests"
+ },
+ "18": {
+ "body": "Capybara capybara capybara. Capybara capybara capybara. ThisLongWordIsIncludedSoWeCanCheckThatSufficientlyLongWordsAreOmittedFromTheSearchIndex.",
+ "breadcrumbs": "First Chapter » No Headers",
+ "id": "18",
+ "title": "First Chapter"
+ },
+ "19": {
+ "body": "This page validates behaviour of duplicate headers.",
+ "breadcrumbs": "First Chapter » Duplicate Headers » Duplicate headers",
+ "id": "19",
+ "title": "Duplicate headers"
+ },
+ "2": {
+ "body": "more text.",
+ "breadcrumbs": "First Chapter » First Chapter",
+ "id": "2",
+ "title": "First Chapter"
+ },
+ "20": {
+ "body": "",
+ "breadcrumbs": "First Chapter » Duplicate Headers » Header Text",
+ "id": "20",
+ "title": "Header Text"
+ },
+ "21": {
+ "body": "",
+ "breadcrumbs": "First Chapter » Duplicate Headers » Header Text",
+ "id": "21",
+ "title": "Header Text"
+ },
+ "22": {
+ "body": "",
+ "breadcrumbs": "First Chapter » Duplicate Headers » header-text",
+ "id": "22",
+ "title": "header-text"
+ },
+ "23": {
+ "body": "This makes sure you can insert runnable Rust files. fn main() { println!(\"Hello World!\");\n#\n# // You can even hide lines! :D\n# println!(\"I am hidden! Expand the code snippet to see me\");\n}",
+ "breadcrumbs": "Second Chapter » Second Chapter",
+ "id": "23",
+ "title": "Second Chapter"
+ },
+ "24": {
+ "body": "When we link to the first section , it should work on both the print page and the non-print page. A fragment link should work. Link outside . Some image HTML Link",
+ "breadcrumbs": "Second Chapter » Nested Chapter » Testing relative links for the print page",
+ "id": "24",
+ "title": "Testing relative links for the print page"
+ },
+ "25": {
+ "body": "",
+ "breadcrumbs": "Second Chapter » Nested Chapter » Some section",
+ "id": "25",
+ "title": "Some section"
+ },
+ "26": {
+ "body": "I put &lt;HTML&gt; in here!",
+ "breadcrumbs": "Conclusion » Conclusion",
+ "id": "26",
+ "title": "Conclusion"
+ },
+ "3": {
+ "body": "",
+ "breadcrumbs": "First Chapter » Some Section",
+ "id": "3",
+ "title": "Some Section"
+ },
+ "4": {
+ "body": "This file has some testable code. assert!(true);",
+ "breadcrumbs": "First Chapter » Nested Chapter » Nested Chapter",
+ "id": "4",
+ "title": "Nested Chapter"
+ },
+ "5": {
+ "body": "assert!(true);",
+ "breadcrumbs": "First Chapter » Nested Chapter » Some Section",
+ "id": "5",
+ "title": "Some Section"
+ },
+ "6": {
+ "body": "// The next line will cause a `rendered_output` test to fail if the anchor feature is broken in\n// such a way that the content between anchors isn't included.\n// unique-string-for-anchor-test\nassert!(true);",
+ "breadcrumbs": "First Chapter » Nested Chapter » Anchors include the part of a file between special comments",
+ "id": "6",
+ "title": "Anchors include the part of a file between special comments"
+ },
+ "7": {
+ "body": "# fn some_function() {\n# assert!(true);\n# }\n# fn main() { some_function();\n}",
+ "breadcrumbs": "First Chapter » Nested Chapter » Rustdoc include adds the rest of the file as hidden",
+ "id": "7",
+ "title": "Rustdoc include adds the rest of the file as hidden"
+ },
+ "8": {
+ "body": "# fn some_other_function() {\n# assert!(true);\n# }\n# fn main() { some_other_function();\n}",
+ "breadcrumbs": "First Chapter » Nested Chapter » Rustdoc include works with anchors too",
+ "id": "8",
+ "title": "Rustdoc include works with anchors too"
+ },
+ "9": {
+ "body": "",
+ "breadcrumbs": "First Chapter » Includes » Includes",
+ "id": "9",
+ "title": "Includes"
+ }
+ },
+ "length": 27,
+ "save": true
+ },
+ "fields": [
+ "title",
+ "body",
+ "breadcrumbs"
+ ],
+ "index": {
+ "body": {
+ "root": {
+ "1": {
+ "df": 2,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ },
+ "17": {
+ "tf": 1.0
+ }
+ }
+ },
+ "2": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ },
+ "a": {
+ "d": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {},
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 2,
+ "docs": {
+ "6": {
+ "tf": 2.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "p": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "11": {
+ "tf": 4.69041575982343
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "!": {
+ "(": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 5,
+ "docs": {
+ "4": {
+ "tf": 1.0
+ },
+ "5": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "b": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ }
+ },
+ "z": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "v": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "19": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "w": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 2,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ },
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "c": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "y": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.7320508075688772
+ }
+ }
+ }
+ }
+ }
+ },
+ "c": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "y": {
+ "b": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "a": {
+ "df": 1,
+ "docs": {
+ "18": {
+ "tf": 2.449489742783178
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ },
+ "f": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 2,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "h": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 6,
+ "docs": {
+ "10": {
+ "tf": 2.0
+ },
+ "11": {
+ "tf": 1.0
+ },
+ "18": {
+ "tf": 1.0
+ },
+ "2": {
+ "tf": 1.0
+ },
+ "23": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "a": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 2.23606797749979
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "o": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 2,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "m": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "26": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "t": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "d": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 2,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ },
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "c": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "19": {
+ "tf": 1.4142135623730951
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "v": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "x": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 2,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ },
+ "15": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "p": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "f": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 5,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ },
+ "23": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 5,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "11": {
+ "tf": 1.0
+ },
+ "18": {
+ "tf": 1.0
+ },
+ "2": {
+ "tf": 1.0
+ },
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "df": 3,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.4142135623730951
+ },
+ "8": {
+ "tf": 1.4142135623730951
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 2.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "g": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "h": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "a": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 5,
+ "docs": {
+ "10": {
+ "tf": 1.4142135623730951
+ },
+ "19": {
+ "tf": 1.4142135623730951
+ },
+ "20": {
+ "tf": 1.0
+ },
+ "21": {
+ "tf": 1.0
+ },
+ "22": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "'": {
+ "df": 1,
+ "docs": {
+ "1": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 2,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ },
+ "26": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "d": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 2,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "d": {
+ "df": 5,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.4142135623730951
+ },
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ },
+ "9": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "x": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "1": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 2,
+ "docs": {
+ "1": {
+ "tf": 1.0
+ },
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "'": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "j": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "b": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "l": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 3,
+ "docs": {
+ "14": {
+ "tf": 1.4142135623730951
+ },
+ "23": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ }
+ }
+ },
+ "k": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 2.23606797749979
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "t": {
+ ";": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "&": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "26": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 3,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "k": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "w": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "12": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "2": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.4142135623730951
+ },
+ "4": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "x": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "12": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
+ "p": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 2,
+ "docs": {
+ "19": {
+ "tf": 1.0
+ },
+ "24": {
+ "tf": 1.7320508075688772
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.7320508075688772
+ }
+ },
+ "l": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "!": {
+ "(": {
+ "\"": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "26": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 1,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ },
+ "n": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "d": {
+ "_": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ },
+ "n": {
+ "a": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "c": {
+ "df": 2,
+ "docs": {
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "d": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "23": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 4,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ },
+ "25": {
+ "tf": 1.0
+ },
+ "3": {
+ "tf": 1.0
+ },
+ "5": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "n": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "_": {
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "_": {
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "8": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "p": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "̈": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "ë": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 1,
+ "docs": {
+ "15": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "t": {
+ "a": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "a": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "4": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 4,
+ "docs": {
+ "12": {
+ "tf": 1.4142135623730951
+ },
+ "17": {
+ "tf": 1.0
+ },
+ "24": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "x": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 5,
+ "docs": {
+ "1": {
+ "tf": 1.0
+ },
+ "2": {
+ "tf": 1.0
+ },
+ "20": {
+ "tf": 1.0
+ },
+ "21": {
+ "tf": 1.0
+ },
+ "22": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "h": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "w": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "d": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "17": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "q": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "v": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "19": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "w": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "y": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 2,
+ "docs": {
+ "24": {
+ "tf": 1.4142135623730951
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ },
+ "l": {
+ "d": {
+ "df": 2,
+ "docs": {
+ "11": {
+ "tf": 4.69041575982343
+ },
+ "23": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "z": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "breadcrumbs": {
+ "root": {
+ "1": {
+ "df": 2,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ },
+ "17": {
+ "tf": 1.0
+ }
+ }
+ },
+ "2": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ },
+ "a": {
+ "d": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.4142135623730951
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {},
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 2,
+ "docs": {
+ "6": {
+ "tf": 2.23606797749979
+ },
+ "8": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "p": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "11": {
+ "tf": 4.69041575982343
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "!": {
+ "(": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 5,
+ "docs": {
+ "4": {
+ "tf": 1.0
+ },
+ "5": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "b": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ }
+ },
+ "z": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "v": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "19": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "w": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.7320508075688772
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 2,
+ "docs": {
+ "0": {
+ "tf": 1.7320508075688772
+ },
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "c": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "y": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.7320508075688772
+ }
+ }
+ }
+ }
+ }
+ },
+ "c": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "y": {
+ "b": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "a": {
+ "df": 1,
+ "docs": {
+ "18": {
+ "tf": 2.449489742783178
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ },
+ "f": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 2,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "h": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 24,
+ "docs": {
+ "10": {
+ "tf": 2.23606797749979
+ },
+ "11": {
+ "tf": 1.4142135623730951
+ },
+ "12": {
+ "tf": 1.0
+ },
+ "13": {
+ "tf": 1.0
+ },
+ "14": {
+ "tf": 1.0
+ },
+ "15": {
+ "tf": 1.0
+ },
+ "16": {
+ "tf": 1.0
+ },
+ "17": {
+ "tf": 1.0
+ },
+ "18": {
+ "tf": 1.4142135623730951
+ },
+ "19": {
+ "tf": 1.0
+ },
+ "2": {
+ "tf": 1.7320508075688772
+ },
+ "20": {
+ "tf": 1.0
+ },
+ "21": {
+ "tf": 1.0
+ },
+ "22": {
+ "tf": 1.0
+ },
+ "23": {
+ "tf": 1.7320508075688772
+ },
+ "24": {
+ "tf": 1.4142135623730951
+ },
+ "25": {
+ "tf": 1.4142135623730951
+ },
+ "3": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 2.0
+ },
+ "5": {
+ "tf": 1.4142135623730951
+ },
+ "6": {
+ "tf": 1.4142135623730951
+ },
+ "7": {
+ "tf": 1.4142135623730951
+ },
+ "8": {
+ "tf": 1.4142135623730951
+ },
+ "9": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "a": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 2.23606797749979
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "o": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 2,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "m": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "26": {
+ "tf": 1.7320508075688772
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "t": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "d": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 2,
+ "docs": {
+ "0": {
+ "tf": 1.7320508075688772
+ },
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "c": {
+ "df": 5,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "19": {
+ "tf": 2.0
+ },
+ "20": {
+ "tf": 1.0
+ },
+ "21": {
+ "tf": 1.0
+ },
+ "22": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "v": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "x": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 2,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ },
+ "15": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "p": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "f": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 5,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ },
+ "23": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.4142135623730951
+ },
+ "7": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 22,
+ "docs": {
+ "10": {
+ "tf": 1.4142135623730951
+ },
+ "11": {
+ "tf": 1.4142135623730951
+ },
+ "12": {
+ "tf": 1.0
+ },
+ "13": {
+ "tf": 1.0
+ },
+ "14": {
+ "tf": 1.0
+ },
+ "15": {
+ "tf": 1.0
+ },
+ "16": {
+ "tf": 1.0
+ },
+ "17": {
+ "tf": 1.0
+ },
+ "18": {
+ "tf": 1.4142135623730951
+ },
+ "19": {
+ "tf": 1.0
+ },
+ "2": {
+ "tf": 1.7320508075688772
+ },
+ "20": {
+ "tf": 1.0
+ },
+ "21": {
+ "tf": 1.0
+ },
+ "22": {
+ "tf": 1.0
+ },
+ "24": {
+ "tf": 1.0
+ },
+ "3": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 1.0
+ },
+ "5": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ },
+ "9": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "df": 3,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.4142135623730951
+ },
+ "8": {
+ "tf": 1.4142135623730951
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 2.23606797749979
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "g": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "h": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "a": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 6,
+ "docs": {
+ "10": {
+ "tf": 1.4142135623730951
+ },
+ "18": {
+ "tf": 1.0
+ },
+ "19": {
+ "tf": 2.0
+ },
+ "20": {
+ "tf": 1.7320508075688772
+ },
+ "21": {
+ "tf": 1.7320508075688772
+ },
+ "22": {
+ "tf": 1.7320508075688772
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "'": {
+ "df": 1,
+ "docs": {
+ "1": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 2,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ },
+ "26": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "d": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 2,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "d": {
+ "df": 5,
+ "docs": {
+ "10": {
+ "tf": 1.4142135623730951
+ },
+ "6": {
+ "tf": 1.7320508075688772
+ },
+ "7": {
+ "tf": 1.4142135623730951
+ },
+ "8": {
+ "tf": 1.4142135623730951
+ },
+ "9": {
+ "tf": 1.7320508075688772
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "x": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "1": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 2,
+ "docs": {
+ "1": {
+ "tf": 1.7320508075688772
+ },
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "'": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "j": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "b": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "l": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 3,
+ "docs": {
+ "14": {
+ "tf": 1.4142135623730951
+ },
+ "23": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ }
+ }
+ },
+ "k": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 2.449489742783178
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "t": {
+ ";": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "&": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "26": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 3,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "k": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "w": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 6,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "12": {
+ "tf": 2.0
+ },
+ "13": {
+ "tf": 1.0
+ },
+ "14": {
+ "tf": 1.0
+ },
+ "15": {
+ "tf": 1.0
+ },
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "2": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 8,
+ "docs": {
+ "10": {
+ "tf": 1.4142135623730951
+ },
+ "24": {
+ "tf": 1.0
+ },
+ "25": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 1.7320508075688772
+ },
+ "5": {
+ "tf": 1.0
+ },
+ "6": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "x": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "12": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
+ "p": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 2,
+ "docs": {
+ "19": {
+ "tf": 1.0
+ },
+ "24": {
+ "tf": 2.0
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 2.0
+ }
+ },
+ "l": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "!": {
+ "(": {
+ "\"": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "26": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "11": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.4142135623730951
+ }
+ }
+ },
+ "n": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "d": {
+ "_": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ },
+ "n": {
+ "a": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "c": {
+ "df": 2,
+ "docs": {
+ "7": {
+ "tf": 1.4142135623730951
+ },
+ "8": {
+ "tf": 1.4142135623730951
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "d": {
+ "df": 4,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "23": {
+ "tf": 1.7320508075688772
+ },
+ "24": {
+ "tf": 1.0
+ },
+ "25": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 4,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ },
+ "25": {
+ "tf": 1.4142135623730951
+ },
+ "3": {
+ "tf": 1.4142135623730951
+ },
+ "5": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "n": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "_": {
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "_": {
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "8": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "p": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "̈": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "ë": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 1,
+ "docs": {
+ "15": {
+ "tf": 1.7320508075688772
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "10": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "t": {
+ "a": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "a": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "4": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 4,
+ "docs": {
+ "12": {
+ "tf": 1.7320508075688772
+ },
+ "17": {
+ "tf": 1.4142135623730951
+ },
+ "24": {
+ "tf": 1.4142135623730951
+ },
+ "6": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ },
+ "x": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 5,
+ "docs": {
+ "1": {
+ "tf": 1.0
+ },
+ "2": {
+ "tf": 1.0
+ },
+ "20": {
+ "tf": 1.4142135623730951
+ },
+ "21": {
+ "tf": 1.4142135623730951
+ },
+ "22": {
+ "tf": 1.4142135623730951
+ }
+ }
+ }
+ }
+ },
+ "h": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "w": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "d": {
+ "df": 2,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ },
+ "17": {
+ "tf": 1.7320508075688772
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "q": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "v": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "19": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "w": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "y": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 2,
+ "docs": {
+ "24": {
+ "tf": 1.4142135623730951
+ },
+ "8": {
+ "tf": 1.4142135623730951
+ }
+ }
+ },
+ "l": {
+ "d": {
+ "df": 2,
+ "docs": {
+ "11": {
+ "tf": 4.69041575982343
+ },
+ "23": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "z": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "title": {
+ "root": {
+ "a": {
+ "d": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {},
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 2,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "b": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "w": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "c": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "p": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 5,
+ "docs": {
+ "11": {
+ "tf": 1.0
+ },
+ "18": {
+ "tf": 1.0
+ },
+ "2": {
+ "tf": 1.0
+ },
+ "23": {
+ "tf": 1.0
+ },
+ "4": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 1,
+ "docs": {
+ "26": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "d": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "0": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "p": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "c": {
+ "df": 1,
+ "docs": {
+ "19": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "f": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 2,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 3,
+ "docs": {
+ "11": {
+ "tf": 1.0
+ },
+ "18": {
+ "tf": 1.0
+ },
+ "2": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "o": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "14": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "h": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "a": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 4,
+ "docs": {
+ "19": {
+ "tf": 1.0
+ },
+ "20": {
+ "tf": 1.0
+ },
+ "21": {
+ "tf": 1.0
+ },
+ "22": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "i": {
+ "d": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "d": {
+ "df": 4,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ },
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ },
+ "9": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "1": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "w": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 1,
+ "docs": {
+ "12": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "n": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "4": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "p": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "24": {
+ "tf": 1.0
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 1,
+ "docs": {
+ "7": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "d": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "c": {
+ "df": 2,
+ "docs": {
+ "7": {
+ "tf": 1.0
+ },
+ "8": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "s": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "23": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 3,
+ "docs": {
+ "25": {
+ "tf": 1.0
+ },
+ "3": {
+ "tf": 1.0
+ },
+ "5": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
+ "p": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "6": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "t": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "i": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 0,
+ "docs": {},
+ "h": {
+ "df": 1,
+ "docs": {
+ "15": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "df": 0,
+ "docs": {},
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 1,
+ "docs": {
+ "10": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ },
+ "t": {
+ "a": {
+ "b": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 1,
+ "docs": {
+ "13": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 0,
+ "docs": {},
+ "l": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 1,
+ "docs": {
+ "16": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {},
+ "e": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 3,
+ "docs": {
+ "12": {
+ "tf": 1.0
+ },
+ "17": {
+ "tf": 1.0
+ },
+ "24": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "x": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 3,
+ "docs": {
+ "20": {
+ "tf": 1.0
+ },
+ "21": {
+ "tf": 1.0
+ },
+ "22": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ },
+ "u": {
+ "df": 0,
+ "docs": {},
+ "n": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "c": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "17": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ },
+ "w": {
+ "df": 0,
+ "docs": {},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "r": {
+ "df": 0,
+ "docs": {},
+ "k": {
+ "df": 1,
+ "docs": {
+ "8": {
+ "tf": 1.0
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "lang": "English",
+ "pipeline": [
+ "trimmer",
+ "stopWordFilter",
+ "stemmer"
+ ],
+ "ref": "id",
+ "version": "0.9.5"
+ },
+ "results_options": {
+ "limit_results": 30,
+ "teaser_word_count": 30
+ },
+ "search_options": {
+ "bool": "OR",
+ "expand": true,
+ "fields": {
+ "body": {
+ "boost": 1
+ },
+ "breadcrumbs": {
+ "boost": 1
+ },
+ "title": {
+ "boost": 2
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/vendor/mdbook/tests/summary_md_files/example_book.md b/vendor/mdbook/tests/summary_md_files/example_book.md
new file mode 100644
index 000000000..ff3911c72
--- /dev/null
+++ b/vendor/mdbook/tests/summary_md_files/example_book.md
@@ -0,0 +1,20 @@
+# Summary
+
+- [mdBook](README.md)
+- [Command Line Tool](cli/cli-tool.md)
+ - [init](cli/init.md)
+ - [build](cli/build.md)
+ - [watch](cli/watch.md)
+ - [serve](cli/serve.md)
+ - [test](cli/test.md)
+- [Format](format/format.md)
+ - [SUMMARY.md](format/summary.md)
+ - [Configuration](format/config.md)
+ - [Theme](format/theme/theme.md)
+ - [index.hbs](format/theme/index-hbs.md)
+ - [Syntax highlighting](format/theme/syntax-highlighting.md)
+ - [MathJax Support](format/mathjax.md)
+ - [Rust code specific features](format/rust.md)
+- [Rust Library](lib/lib.md)
+-----------
+[Contributors](misc/contributors.md)
diff --git a/vendor/mdbook/tests/summary_md_files/rust_by_example.md b/vendor/mdbook/tests/summary_md_files/rust_by_example.md
new file mode 100644
index 000000000..de7e6f6ee
--- /dev/null
+++ b/vendor/mdbook/tests/summary_md_files/rust_by_example.md
@@ -0,0 +1,191 @@
+# Summary
+
+[Introduction](index.md)
+
+- [Hello World](hello.md)
+ - [Comments](hello/comment.md)
+ - [Formatted print](hello/print.md)
+ - [Debug](hello/print/print_debug.md)
+ - [Display](hello/print/print_display.md)
+ - [Testcase: List](hello/print/print_display/testcase_list.md)
+ - [Formatting](hello/print/fmt.md)
+
+- [Primitives](primitives.md)
+ - [Literals and operators](primitives/literals.md)
+ - [Tuples](primitives/tuples.md)
+ - [Arrays and Slices](primitives/array.md)
+
+- [Custom Types](custom_types.md)
+ - [Structures](custom_types/structs.md)
+ - [Enums](custom_types/enum.md)
+ - [use](custom_types/enum/enum_use.md)
+ - [C-like](custom_types/enum/c_like.md)
+ - [Testcase: linked-list](custom_types/enum/testcase_linked_list.md)
+ - [constants](custom_types/constants.md)
+
+- [Variable Bindings](variable_bindings.md)
+ - [Mutability](variable_bindings/mut.md)
+ - [Scope and Shadowing](variable_bindings/scope.md)
+ - [Declare first](variable_bindings/declare.md)
+
+- [Types](types.md)
+ - [Casting](types/cast.md)
+ - [Literals](types/literals.md)
+ - [Inference](types/inference.md)
+ - [Aliasing](types/alias.md)
+
+- [Conversion](conversion.md)
+ - [From and Into](conversion/from_into.md)
+ - [To and From String](conversion/string.md)
+
+- [Expressions](expression.md)
+
+- [Flow Control](flow_control.md)
+ - [if/else](flow_control/if_else.md)
+ - [loop](flow_control/loop.md)
+ - [Nesting and labels](flow_control/loop/nested.md)
+ - [Returning from loops](flow_control/loop/return.md)
+ - [while](flow_control/while.md)
+ - [for and range](flow_control/for.md)
+ - [match](flow_control/match.md)
+ - [Destructuring](flow_control/match/destructuring.md)
+ - [tuples](flow_control/match/destructuring/destructure_tuple.md)
+ - [enums](flow_control/match/destructuring/destructure_enum.md)
+ - [pointers/ref](flow_control/match/destructuring/destructure_pointers.md)
+ - [structs](flow_control/match/destructuring/destructure_structures.md)
+ - [Guards](flow_control/match/guard.md)
+ - [Binding](flow_control/match/binding.md)
+ - [if let](flow_control/if_let.md)
+ - [while let](flow_control/while_let.md)
+
+- [Functions](fn.md)
+ - [Methods](fn/methods.md)
+ - [Closures](fn/closures.md)
+ - [Capturing](fn/closures/capture.md)
+ - [As input parameters](fn/closures/input_parameters.md)
+ - [Type anonymity](fn/closures/anonymity.md)
+ - [Input functions](fn/closures/input_functions.md)
+ - [As output parameters](fn/closures/output_parameters.md)
+ - [Examples in `std`](fn/closures/closure_examples.md)
+ - [Iterator::any](fn/closures/closure_examples/iter_any.md)
+ - [Iterator::find](fn/closures/closure_examples/iter_find.md)
+ - [Higher Order Functions](fn/hof.md)
+
+- [Modules](mod.md)
+ - [Visibility](mod/visibility.md)
+ - [Struct visibility](mod/struct_visibility.md)
+ - [The `use` declaration](mod/use.md)
+ - [`super` and `self`](mod/super.md)
+ - [File hierarchy](mod/split.md)
+
+- [Crates](crates.md)
+ - [Library](crates/lib.md)
+ - [`extern crate`](crates/link.md)
+
+- [Attributes](attribute.md)
+ - [`dead_code`](attribute/unused.md)
+ - [Crates](attribute/crate.md)
+ - [`cfg`](attribute/cfg.md)
+ - [Custom](attribute/cfg/custom.md)
+
+- [Generics](generics.md)
+ - [Functions](generics/gen_fn.md)
+ - [Implementation](generics/impl.md)
+ - [Traits](generics/gen_trait.md)
+ - [Bounds](generics/bounds.md)
+ - [Testcase: empty bounds](generics/bounds/testcase_empty.md)
+ - [Multiple bounds](generics/multi_bounds.md)
+ - [Where clauses](generics/where.md)
+ - [New Type Idiom](generics/new_types.md)
+ - [Associated items](generics/assoc_items.md)
+ - [The Problem](generics/assoc_items/the_problem.md)
+ - [Associated types](generics/assoc_items/types.md)
+ - [Phantom type parameters](generics/phantom.md)
+ - [Testcase: unit clarification](generics/phantom/testcase_units.md)
+
+- [Scoping rules](scope.md)
+ - [RAII](scope/raii.md)
+ - [Ownership and moves](scope/move.md)
+ - [Mutability](scope/move/mut.md)
+ - [Borrowing](scope/borrow.md)
+ - [Mutability](scope/borrow/mut.md)
+ - [Freezing](scope/borrow/freeze.md)
+ - [Aliasing](scope/borrow/alias.md)
+ - [The ref pattern](scope/borrow/ref.md)
+ - [Lifetimes](scope/lifetime.md)
+ - [Explicit annotation](scope/lifetime/explicit.md)
+ - [Functions](scope/lifetime/fn.md)
+ - [Methods](scope/lifetime/methods.md)
+ - [Structs](scope/lifetime/struct.md)
+ - [Bounds](scope/lifetime/lifetime_bounds.md)
+ - [Coercion](scope/lifetime/lifetime_coercion.md)
+ - [static](scope/lifetime/static_lifetime.md)
+ - [elision](scope/lifetime/elision.md)
+
+- [Traits](trait.md)
+ - [Derive](trait/derive.md)
+ - [Operator Overloading](trait/ops.md)
+ - [Drop](trait/drop.md)
+ - [Iterators](trait/iter.md)
+ - [Clone](trait/clone.md)
+
+- [macro_rules!](macros.md)
+ - [Syntax](macro/syntax.md)
+ - [Designators](macros/designators.md)
+ - [Overload](macros/overload.md)
+ - [Repeat](macros/repeat.md)
+ - [DRY (Don't Repeat Yourself)](macros/dry.md)
+ - [DSL (Domain Specific Languages)](macros/dsl.md)
+ - [Variadics](macros/variadics.md)
+
+- [Error handling](error.md)
+ - [`panic`](error/panic.md)
+ - [`Option` & `unwrap`](error/option_unwrap.md)
+ - [Combinators: `map`](error/option_unwrap/map.md)
+ - [Combinators: `and_then`](error/option_unwrap/and_then.md)
+ - [`Result`](error/result.md)
+ - [`map` for `Result`](error/result/result_map.md)
+ - [aliases for `Result`](error/result/result_alias.md)
+ - [Early returns](error/result/early_returns.md)
+ - [Introducing `?`](error/result/enter_question_mark.md)
+ - [Multiple error types](error/multiple_error_types.md)
+ - [Pulling `Result`s out of `Option`s](error/multiple_error_types/option_result.md)
+ - [Defining an error type](error/multiple_error_types/define_error_type.md)
+ - [`Box`ing errors](error/multiple_error_types/boxing_errors.md)
+ - [Other uses of `?`](error/multiple_error_types/reenter_question_mark.md)
+ - [Wrapping errors](error/multiple_error_types/wrap_error.md)
+ - [Iterating over `Result`s](error/iter_result.md)
+
+- [Std library types](std.md)
+ - [Box, stack and heap](std/box.md)
+ - [Vectors](std/vec.md)
+ - [Strings](std/str.md)
+ - [`Option`](std/option.md)
+ - [`Result`](std/result.md)
+ - [`?`](std/result/question_mark.md)
+ - [`panic!`](std/panic.md)
+ - [HashMap](std/hash.md)
+ - [Alternate/custom key types](std/hash/alt_key_types.md)
+ - [HashSet](std/hash/hashset.md)
+
+- [Std misc](std_misc.md)
+ - [Threads](std_misc/threads.md)
+ - [Testcase: map-reduce](std_misc/threads/testcase_mapreduce.md)
+ - [Channels](std_misc/channels.md)
+ - [Path](std_misc/path.md)
+ - [File I/O](std_misc/file.md)
+ - [`open`](std_misc/file/open.md)
+ - [`create`](std_misc/file/create.md)
+ - [Child processes](std_misc/process.md)
+ - [Pipes](std_misc/process/pipe.md)
+ - [Wait](std_misc/process/wait.md)
+ - [Filesystem Operations](std_misc/fs.md)
+ - [Program arguments](std_misc/arg.md)
+ - [Argument parsing](std_misc/arg/matching.md)
+ - [Foreign Function Interface](std_misc/ffi.md)
+
+- [Meta](meta.md)
+ - [Documentation](meta/doc.md)
+ - [Testing](meta/test.md)
+
+- [Unsafe Operations](unsafe.md)
diff --git a/vendor/mdbook/tests/summary_md_files/rust_ffi_guide.md b/vendor/mdbook/tests/summary_md_files/rust_ffi_guide.md
new file mode 100644
index 000000000..f64fcab1b
--- /dev/null
+++ b/vendor/mdbook/tests/summary_md_files/rust_ffi_guide.md
@@ -0,0 +1,19 @@
+# Summary
+
+- [Overview](./overview.md)
+- [Setting Up](./setting_up.md)
+- [Core Client Library](./client.md)
+- [Constructing a Basic Request](./basic_request.md)
+- [Sending the Request](./send_basic.md)
+- [Generating a Header File](./cbindgen.md)
+- [Better Error Handling](./error_handling.md)
+- [Asynchronous Operations](./async.md)
+- [More Complex Requests](./complex_request.md)
+- [Testing](./testing.md)
+- [Dynamic Loading & Plugins](./dynamic_loading.md)
+
+---
+
+- [Break All The Things!!1!](./fun/index.md)
+ - [Problems](./fun/problems.md)
+ - [Solutions](./fun/solutions.md) \ No newline at end of file
diff --git a/vendor/mdbook/tests/summary_md_files/the_book-2nd_edition.md b/vendor/mdbook/tests/summary_md_files/the_book-2nd_edition.md
new file mode 100644
index 000000000..c7f830674
--- /dev/null
+++ b/vendor/mdbook/tests/summary_md_files/the_book-2nd_edition.md
@@ -0,0 +1,130 @@
+# The Rust Programming Language
+
+## Getting started
+
+- [Introduction](ch01-00-introduction.md)
+ - [Installation](ch01-01-installation.md)
+ - [Hello, World!](ch01-02-hello-world.md)
+
+- [Guessing Game Tutorial](ch02-00-guessing-game-tutorial.md)
+
+- [Common Programming Concepts](ch03-00-common-programming-concepts.md)
+ - [Variables and Mutability](ch03-01-variables-and-mutability.md)
+ - [Data Types](ch03-02-data-types.md)
+ - [How Functions Work](ch03-03-how-functions-work.md)
+ - [Comments](ch03-04-comments.md)
+ - [Control Flow](ch03-05-control-flow.md)
+
+- [Understanding Ownership](ch04-00-understanding-ownership.md)
+ - [What is Ownership?](ch04-01-what-is-ownership.md)
+ - [References & Borrowing](ch04-02-references-and-borrowing.md)
+ - [Slices](ch04-03-slices.md)
+
+- [Using Structs to Structure Related Data](ch05-00-structs.md)
+ - [Defining and Instantiating Structs](ch05-01-defining-structs.md)
+ - [An Example Program Using Structs](ch05-02-example-structs.md)
+ - [Method Syntax](ch05-03-method-syntax.md)
+
+- [Enums and Pattern Matching](ch06-00-enums.md)
+ - [Defining an Enum](ch06-01-defining-an-enum.md)
+ - [The `match` Control Flow Operator](ch06-02-match.md)
+ - [Concise Control Flow with `if let`](ch06-03-if-let.md)
+
+## Basic Rust Literacy
+
+- [Modules](ch07-00-modules.md)
+ - [`mod` and the Filesystem](ch07-01-mod-and-the-filesystem.md)
+ - [Controlling Visibility with `pub`](ch07-02-controlling-visibility-with-pub.md)
+ - [Referring to Names in Different Modules](ch07-03-importing-names-with-use.md)
+
+- [Common Collections](ch08-00-common-collections.md)
+ - [Vectors](ch08-01-vectors.md)
+ - [Strings](ch08-02-strings.md)
+ - [Hash Maps](ch08-03-hash-maps.md)
+
+- [Error Handling](ch09-00-error-handling.md)
+ - [Unrecoverable Errors with `panic!`](ch09-01-unrecoverable-errors-with-panic.md)
+ - [Recoverable Errors with `Result`](ch09-02-recoverable-errors-with-result.md)
+ - [To `panic!` or Not To `panic!`](ch09-03-to-panic-or-not-to-panic.md)
+
+- [Generic Types, Traits, and Lifetimes](ch10-00-generics.md)
+ - [Generic Data Types](ch10-01-syntax.md)
+ - [Traits: Defining Shared Behavior](ch10-02-traits.md)
+ - [Validating References with Lifetimes](ch10-03-lifetime-syntax.md)
+
+- [Testing](ch11-00-testing.md)
+ - [Writing tests](ch11-01-writing-tests.md)
+ - [Running tests](ch11-02-running-tests.md)
+ - [Test Organization](ch11-03-test-organization.md)
+
+- [An I/O Project: Building a Command Line Program](ch12-00-an-io-project.md)
+ - [Accepting Command Line Arguments](ch12-01-accepting-command-line-arguments.md)
+ - [Reading a File](ch12-02-reading-a-file.md)
+ - [Refactoring to Improve Modularity and Error Handling](ch12-03-improving-error-handling-and-modularity.md)
+ - [Developing the Library’s Functionality with Test Driven Development](ch12-04-testing-the-librarys-functionality.md)
+ - [Working with Environment Variables](ch12-05-working-with-environment-variables.md)
+ - [Writing Error Messages to Standard Error Instead of Standard Output](ch12-06-writing-to-stderr-instead-of-stdout.md)
+
+## Thinking in Rust
+
+- [Functional Language Features: Iterators and Closures](ch13-00-functional-features.md)
+ - [Closures: Anonymous Functions that Can Capture Their Environment](ch13-01-closures.md)
+ - [Processing a Series of Items with Iterators](ch13-02-iterators.md)
+ - [Improving Our I/O Project](ch13-03-improving-our-io-project.md)
+ - [Comparing Performance: Loops vs. Iterators](ch13-04-performance.md)
+
+- [More about Cargo and Crates.io](ch14-00-more-about-cargo.md)
+ - [Customizing Builds with Release Profiles](ch14-01-release-profiles.md)
+ - [Publishing a Crate to Crates.io](ch14-02-publishing-to-crates-io.md)
+ - [Cargo Workspaces](ch14-03-cargo-workspaces.md)
+ - [Installing Binaries from Crates.io with `cargo install`](ch14-04-installing-binaries.md)
+ - [Extending Cargo with Custom Commands](ch14-05-extending-cargo.md)
+
+- [Smart Pointers](ch15-00-smart-pointers.md)
+ - [`Box<T>` Points to Data on the Heap and Has a Known Size](ch15-01-box.md)
+ - [The `Deref` Trait Allows Access to the Data Through a Reference](ch15-02-deref.md)
+ - [The `Drop` Trait Runs Code on Cleanup](ch15-03-drop.md)
+ - [`Rc<T>`, the Reference Counted Smart Pointer](ch15-04-rc.md)
+ - [`RefCell<T>` and the Interior Mutability Pattern](ch15-05-interior-mutability.md)
+ - [Creating Reference Cycles and Leaking Memory is Safe](ch15-06-reference-cycles.md)
+
+- [Fearless Concurrency](ch16-00-concurrency.md)
+ - [Threads](ch16-01-threads.md)
+ - [Message Passing](ch16-02-message-passing.md)
+ - [Shared State](ch16-03-shared-state.md)
+ - [Extensible Concurrency: `Sync` and `Send`](ch16-04-extensible-concurrency-sync-and-send.md)
+
+- [Is Rust an Object-Oriented Programming Language?](ch17-00-oop.md)
+ - [What Does Object-Oriented Mean?](ch17-01-what-is-oo.md)
+ - [Trait Objects for Using Values of Different Types](ch17-02-trait-objects.md)
+ - [Object-Oriented Design Pattern Implementations](ch17-03-oo-design-patterns.md)
+
+## Advanced Topics
+
+- [Patterns Match the Structure of Values](ch18-00-patterns.md)
+ - [All the Places Patterns May be Used](ch18-01-all-the-places-for-patterns.md)
+ - [Refutability: Whether a Pattern Might Fail to Match](ch18-02-refutability.md)
+ - [All the Pattern Syntax](ch18-03-pattern-syntax.md)
+
+- [Advanced Features](ch19-00-advanced-features.md)
+ - [Unsafe Rust](ch19-01-unsafe-rust.md)
+ - [Advanced Lifetimes](ch19-02-advanced-lifetimes.md)
+ - [Advanced Traits](ch19-03-advanced-traits.md)
+ - [Advanced Types](ch19-04-advanced-types.md)
+ - [Advanced Functions & Closures](ch19-05-advanced-functions-and-closures.md)
+
+- [Final Project: Building a Multithreaded Web Server](ch20-00-final-project-a-web-server.md)
+ - [A Single Threaded Web Server](ch20-01-single-threaded.md)
+ - [How Slow Requests Affect Throughput](ch20-02-slow-requests.md)
+ - [Designing the Thread Pool Interface](ch20-03-designing-the-interface.md)
+ - [Creating the Thread Pool and Storing Threads](ch20-04-storing-threads.md)
+ - [Sending Requests to Threads Via Channels](ch20-05-sending-requests-via-channels.md)
+ - [Graceful Shutdown and Cleanup](ch20-06-graceful-shutdown-and-cleanup.md)
+
+- [Appendix](appendix-00.md)
+ - [A - Keywords](appendix-01-keywords.md)
+ - [B - Operators and Symbols](appendix-02-operators.md)
+ - [C - Derivable Traits](appendix-03-derivable-traits.md)
+ - [D - Macros](appendix-04-macros.md)
+ - [E - Translations](appendix-05-translation.md)
+ - [F - Newest Features](appendix-06-newest-features.md)
diff --git a/vendor/mdbook/tests/testing.rs b/vendor/mdbook/tests/testing.rs
new file mode 100644
index 000000000..2b2c0fd0d
--- /dev/null
+++ b/vendor/mdbook/tests/testing.rs
@@ -0,0 +1,26 @@
+mod dummy_book;
+
+use crate::dummy_book::DummyBook;
+
+use mdbook::MDBook;
+
+#[test]
+fn mdbook_can_correctly_test_a_passing_book() {
+ let temp = DummyBook::new().with_passing_test(true).build().unwrap();
+ let mut md = MDBook::load(temp.path()).unwrap();
+
+ let result = md.test(vec![]);
+ assert!(
+ result.is_ok(),
+ "Tests failed with {}",
+ result.err().unwrap()
+ );
+}
+
+#[test]
+fn mdbook_detects_book_with_failing_tests() {
+ let temp = DummyBook::new().with_passing_test(false).build().unwrap();
+ let mut md = MDBook::load(temp.path()).unwrap();
+
+ assert!(md.test(vec![]).is_err());
+}